Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Лайки через AJAX (https://javascript.ru/forum/server/81491-lajjki-cherez-ajax.html)

#dron_87 05.12.2020 19:10

Лайки через AJAX
 
Вложений: 2
Всем привет.я вот написал систему лайков для картинок и подскажите почему когда я нажимаю "лайк" на картинку то в ответ мне присылает как бы дубликат этой же страницы?
и все картинки становятся громадными и форма комментариев также дублируется и на страничке их получаются пары.прикреплённые картинки показывают до и после нажатия лайк и на картинке показывает вторую форму.написал код отправки запроса на страницу likeimgs.php которая взаимодействует с ajax методом load.

///здесь код страницы fullscreen.php с формой///

if(isset($_GET['aloneImgcar']) and $_GET['aloneImgcar'] != ""){
    $aloneImgcar = $_GET['aloneImgcar'];
    $mainKey = $_GET['aloneImgcar'];
    $table = "auto";
    $alonekey = 'aloneImgcar=' . $mainKey;
}
if(isset($_GET['aloneImgGirl']) and $_GET['aloneImgGirl'] != ""){
    $aloneImgGirl = $_GET['aloneImgGirl'];
    $mainKey = $_GET['aloneImgGirl'];
    $table = "girls";
    $alonekey = 'aloneImgGirl=' . $mainKey;
}
if(isset($_GET['funimgs']) and $_GET['funimgs'] != ""){
    $funimgs = $_GET['funimgs'];
    $mainKey = $_GET['funimgs'];
    $table = "funny";
    $alonekey = 'funimgs=' . $mainKey;
}
 
$rud = mysql_connect("localhost","sky","111111");
$turnOn = mysql_select_db("pics",$rud);
 
$zapros = mysql_query("SELECT * FROM $table WHERE id=$mainKey");
$background = mysql_fetch_array($zapros);

В качестве значений в input передал переменные(написанные сверху) для передачи их к javascript который будет передавать их скрипту likeimgs.php
Написал отслеживание события клика к type="button" id="submit" для отправки этих скрытых полей с values:

<div class="countLikesandView">
    <form action="likesvideo.php" method="post">
    <input type="hidden" id="ip" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR'];?>">
    <input type="hidden" id="id" name="id" value="<?php echo $mainKey;?>">
    <input type="hidden" id="parametrurl" name="parametrurl" value="<?php echo $alonekey;?>">
    <input type="hidden" id="table" name="table" value="<?php echo $table;?>">
    <input type="button" id="submit" value="liked?">
        <?php 
echo "<span style='color:red;'>" . $background['likers'] . "</span>";
if(!empty($_SESSION['viewed'])){
echo $_SESSION['viewed'];
unset($_SESSION['viewed']); 
}
    ?>
    </form>
    </div>
и типа если будет клик по #submit то подгрузить данные с likeimgs.php
<script type="text/javascript">
$('#submit').click(function(){
var ip = $('#ip').attr('value');
var id = $('#id').attr('value');
var parametrurl = $('#parametrurl').attr('value');
var table = $('#table').attr('value');
$('.backgroundFromfullscreen').load('likeimgs.php', {ip:ip,id:id,parametrurl:parametrurl,table:table});
});
</script>

///конец кода страницы fullscreen.php с формой///

///здесь код страницы likeimgs.php которая сообщает оценена ли картинка и если нет то обновить ячейку таблицы
и затем подгружать количество лайков из этой страницы в страницу fullscreen.php///


$rud = mysql_connect("localhost","sky","111111");
mysql_select_db("pics",$rud);
if(isset($_POST['ip'])){
    $ip = $_POST['ip'];
}
if(isset($_POST['id'])){
    $id = $_POST['id'];
}
if(isset($_POST['parametrurl'])){
    $parametrurl = $_POST['parametrurl'];
}
if(isset($_POST['loadauto'])){
    $loadauto = $_POST['loadauto'];
}
if(isset($_POST['table'])){
    $table = $_POST['table'];
}
 
if($table == 'auto'){
    $ipusersforpics = 'ipusersforauto';
}
if($table == 'girls'){
    $ipusersforpics = 'ipusersforgirls';
}
if($table == 'funny'){
    $ipusersforpics = 'ipusersforgirls';
}
 
 
$myrow3 = mysql_query("SELECT * FROM $ipusersforpics");
$itog3 = mysql_fetch_array($myrow3);
do{
if(isset($itog3['post']) && isset($itog3['ip']) && $itog3['ip'] == $ip && $itog3['post'] == $id){
$_SESSION['viewed'] = "Вы уже оценили эту картинку";
header("location:fullscreen.php?$parametrurl");
exit;
}
}
while($itog3 = mysql_fetch_array($myrow3));
$myrow = mysql_query("SELECT * FROM $table WHERE id='$id'");
$itog = mysql_fetch_array($myrow);
$likers = $itog['likers'] + 1;
$myrow1 = mysql_query("UPDATE $table SET likers='$likers' WHERE id=$id");
$myrow2 = mysql_query("INSERT INTO $ipusersforpics(ip,post) VALUES('$ip','$id')");
$myrow4 = mysql_query("SELECT * FROM $table WHERE id=$id");
$itog4 = mysql_fetch_array($myrow4);
do{
$res = $itog4['likers'];
}
while($itog4 = mysql_fetch_array($myrow4));
 
$_SESSION['viewed'] = "thank you for like";
header("location:fullscreen.php?$parametrurl");
exit;
echo <<< MyObject
<p>{$res}</p>
MyObject;


и как я заметил что то не так с этим тэгом так как оно возвращает значения

<input type="hidden" id="parametrurl" name="parametrurl" value="<?php echo $alonekey;?>">

так как этот тэг несёт в себе адрес страницы в value с именем переменной parametrurl которая отлавливается в likeimgs.php и возвращает результат(оценили картинку или нет)
при помощи PHP
$_SESSION['viewed'] = "Вы уже оценили эту картинку";
header("location:fullscreen.php?$parametrurl");

или я ошибаюсь что это именно этот тэг?
и в итоге оно мне присылает дубликат целой страницы с большими картинками которые я прикрепил итд.

Постарался поподробней объяснить думаю понятно.

laimas 05.12.2020 21:52

Цитата:

Сообщение от #dron_87
почему когда я нажимаю "лайк" на картинку то в ответ мне присылает как бы дубликат этой же страницы?

Потому, что структура кода неверна. Если асинхронный запрос клиента происходит к файлу источнику, то этот запрос должен обрабатываться и возвращаться ответ до любого вывода в браузер, а код должен завершаться выходом.

PS. Не дубликат у вас, а отправление формы естественным путем и как следствие обновление страницы. Не работает у вас ajax, код неверен. Не $('#submit').click(function() { ... обрабатывать надо, а

$('form').submit(function(e) { 
    e.prevetDefault(); //отменяем отправление формы естественным образом
    //далее код


Но это не отменяет того, о чем сказано выше.

laimas 07.12.2020 18:52

Ну и каков результат? А я ведь не все "странности" отметил, не стал говорить об этом header("location:fullscreen.php?$parametrurl");.

Передача сервером заголовка, это - клиент принял заголовок и обращается по указанному адресу в нем. На JS это будет выглядеть так:

window.location.href = "fullscreen.php?$parametrurl";

хотя конечно тут все и без js произойдет. Но надо понимать, что здесь window, это главное окно. Если образно, то это главное приложение, а Ajax, это будет дочернее приложение, без окна. И дочернее приложение никак не влияет на на главное, ему просто предписано сделать запрос по указанному адресу, а по ответу сообщить об этом главному приложению. Главное приложение получив это сообщение получает ответ и использует его по назначению.

Если сервер ответил на Ajax заголовком header("location: ..."), то дочернее приложение перейдет по указанному адресу, и если по этому адресу код страницы, то ответом и будет эта страница.

Это может быть еще одной причиной бага в вашем коде. Не стал говорить об этом сразу, так как не совсем понятно что вообще творится, ибо exit; и за ним echo <<< MyObject никак не может быть.

И в дополнение - цикл do ... while для разбора ресурса, это вы из какого-то очень дремучего учебника почерпнули, данный цикл вообще тут боком, нужно использовать while. Начиная с версии РНР 5.5 на применение оригинального расширения MySQL вы будете получать ошибку - "расширение устарело ...", а в версии 7.0 оно вообще удалено. Переходите сразу на mysqli или PDO.

#dron_87 08.12.2020 19:15

laimas,
Привет laimas да и вправду этот exit тут по сути лишнее и он прерывает действие после которого <<< MyObject вообще бесполезен.думаю и думаю что же не так и всё равно пока не могу понять что же может быть аналогом header("location: ...") так,чтобы AJAX не присылал заголовком и чтобы ставилась единица без всяких этих громадных картинок и форм дублирующихся.какое же тогда решение может быть?это только последний шаг который ставит границу перед заливкой сайта на хостинг

laimas 08.12.2020 21:38

Если после асинхронного запроса нужно перенаправить пользователя на другую страницу, то клиенту этот адрес нужно не заголовком передавать, а как данные. На клиенте выполнить js код показанный выше.

И читайте о безопасности:

$table = $_POST['table'];
$id = $_POST['id'];
...
"SELECT * FROM $table WHERE id='$id'"

и др., такое ни в коем случае делать нельзя. Данные пришедшие извне не фильтрованные и без экранирования подставленные в запрос, это просто огромная дыра в безопасности. Кто вас научил оперировать явно в запросах структурой базы данных, именами таблиц как параметрами запроса? Ну разве же так можно.

#dron_87 13.12.2020 07:58

laimas,
Привет laimas хотел уточнить на счёт последнего сообщения.ты написал клиенту этот адрес нужно не заголовком передавать, а как данные.Как данными передать не понял?можешь чуть поподробней и желательно с кодом написать это а то просто средне знаю систему JS и немного блуждаю в этих понятиях.

laimas 13.12.2020 09:02

Сначала наведите порядок в структуре кода своего, в файлах, а то в этом коде кроме бардака ничего нет. Может и перенаправлять никуда не потребуется?

#dron_87 14.12.2020 18:31

laimas,
А что нужно чтобы не перенаправлять?какой для этого код вообще существует в JS?попытался всё сделать на одной странице fullscreen.php и убрал header т.е. header("location:fullscreen.php?$parametrurl"); чтобы не перенаправлял
и при нажатии на лайк и в load записал эту же страницу -> load('fullscreen.php', {ip:ip,id:id,parametrurl:parametrurl,table:table}) ;
и опять же картинки большие:
первая картинка до лайка

и вторая после лайка

<script type="text/javascript">
$('#submit').click(function(){
var ip = $('#ip').attr('value');
var id = $('#id').attr('value');
var parametrurl = $('#parametrurl').attr('value');
var table = $('#table').attr('value');
$('.backgroundFromfullscreen').load('fullscreen.php', {ip:ip,id:id,parametrurl:parametrurl,table:table});
});
</script>


<?php include("blocks/footer.php");
$rud = mysql_connect("localhost","sky","111111");
mysql_select_db("pics",$rud);
if(isset($_POST['ip'])){
	$ip = $_POST['ip'];
}
if(isset($_POST['id'])){
	$id = $_POST['id'];
}
if(isset($_POST['parametrurl'])){
	$parametrurl = $_POST['parametrurl'];
}
if(isset($_POST['loadauto'])){
	$loadauto = $_POST['loadauto'];
}
if(isset($_POST['table'])){
	$table = $_POST['table'];
}

if($table == 'auto'){
	$ipusersforpics = 'ipusersforauto';
}
if($table == 'girls'){
	$ipusersforpics = 'ipusersforgirls';
}
if($table == 'funny'){
	$ipusersforpics = 'ipusersforfunny';
}


$myrow3 = mysql_query("SELECT * FROM $ipusersforpics");
$itog3 = mysql_fetch_array($myrow3);

while($itog3 = mysql_fetch_array($myrow3));
$myrow = mysql_query("SELECT * FROM $table WHERE id='$id'");
$itog = mysql_fetch_array($myrow);
$likers = $itog['likers'] + 1;
$myrow1 = mysql_query("UPDATE $table SET likers='$likers' WHERE id=$id");
$myrow2 = mysql_query("INSERT INTO $ipusersforpics(ip,post) VALUES('$ip','$id')");
$myrow4 = mysql_query("SELECT * FROM $table WHERE id=$id");
$itog4 = mysql_fetch_array($myrow4);

?>


и как я заметил этот load('fullscreen.php', {ip:ip,id:id,parametrurl:parametrurl,table:table}) ; с указанием этой же страницы fullscreen.php также выдаёт огромные картинки хотя я и убрал этот
header("location:fullscreen.php?$parametrurl"); но если их убрать вместе с $_SESSION то и в ответ ничего не высылает оценена ли картинка ранее или нет.как-то так.иначе как можно сделать то?у меня уже есть начало это проверка if(isset($itog3['post']) && isset($itog3['ip']) && $itog3['ip'] == $ip && $itog3['post'] == $id)
обновление и занесение лайка:
myrow1 = mysql_query("UPDATE $table SET likers='$likers' WHERE id=$id");
$myrow2 = mysql_query("INSERT INTO $ipusersforpics(ip,post) VALUES('$ip','$id')");
но что-то не сходится вообще.как быть даже не знаю
https://yandex.kz/collections/card/5...3d42696ee6c39/
https://yandex.kz/collections/card/5...3d42696ee6c3a/

laimas 14.12.2020 18:42

Во-первых ваш код дырявый, я уже писал об этом, такого ни в коем случае на сервере быть не должно.

Не перенаправлять, это значит обработчик, к которому производит запрос клиент, выполняет задачу полностью, он и возвращает ответ. Ваш код читать сложно, потому как в нем "мусора" много, непонятных для чего запросов... А mysql_fetch_array возвращает две копии одних и тех же данных, одна как индексный набор, вторая ассоциативный, а оно нужно? В общем все это похоже на какой-то бардак, поэтому и ничего не скажу "как".

#dron_87 15.12.2020 19:11

laimas,
Привет laimas спасибо хоть немного за помощь за то что открыл мне глаза на настоящий мусор и за то что я должен был навести порядок в структуре кода и это подтолкнула меня разобрать тему get и знаешь я тут уже по настоящему нашёл выход как делать лайки и при том без получения громадных копий картинок и это решение при помощи функции $.get или даже post который я уже освоил и вот он долгожданный код:
//Использовал страницу fullscreen.php//
<form method="post">
	<input type="hidden" id="ip" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR'];?>">
	<input type="hidden" id="id" name="id" value="<?php echo $mainKey;?>">
	<input type="hidden" id="parametrurl" name="parametrurl" value="<?php echo $alonekey;?>">
	<input type="hidden" id="table" name="table" value="<?php echo $table;?>">
	<input type="button" id="submit" value="liked?">
	[PHP]<?php echo "<span style='color:red;'>" . $background['likers'] . "</span>";?>[/PHP]
    <span id="spanget"></span>
</form>


<script type="text/javascript">
$('#submit').click(function(){
var ip = $('#ip').attr('value');
var id = $('#id').attr('value');
var parametrurl = $('#parametrurl').attr('value');
var table = $('#table').attr('value');
$.get('likeimgs.php', {ip:ip,id:id,parametrurl:parametrurl,table:table},function(spanget){
	$('#spanget').text(spanget);
});
});

 </script>

//конец страницы fullscreen.php//

//начало страницы likeimgs.php//

$rud = mysql_connect("localhost","sky","111111");
mysql_select_db("pics",$rud);
if(isset($_GET['ip'])){
	$ip = $_GET['ip'];
}
if(isset($_GET['id'])){
	$id = $_GET['id'];
}
if(isset($_GET['parametrurl'])){
	$parametrurl = $_GET['parametrurl'];
}

if(isset($_GET['table'])){
	$table = $_GET['table'];
}

if($table == 'auto'){
	$ipusersforpics = 'ipusersforauto';
}
if($table == 'girls'){
	$ipusersforpics = 'ipusersforgirls';
}
if($table == 'funny'){
	$ipusersforpics = 'ipusersforfunny';
}


$myrow3 = mysql_query("SELECT * FROM $ipusersforpics");
$itog3 = mysql_fetch_array($myrow3);
do{
if(isset($itog3['post']) && isset($itog3['ip']) && $itog3['ip'] == $ip && $itog3['post'] == $id){
$reply = "Вы уже оценили эту картинку";
echo $reply;
exit;
}
}
while($itog3 = mysql_fetch_array($myrow3));
$myrow = mysql_query("SELECT * FROM $table WHERE id='$id'");
$itog = mysql_fetch_array($myrow);
$likers = $itog['likers'] + 1;
$myrow1 = mysql_query("UPDATE $table SET likers='$likers' WHERE id=$id");
$myrow2 = mysql_query("INSERT INTO $ipusersforpics(ip,post) VALUES('$ip','$id')");

$myrow4 = mysql_query("SELECT * FROM $table WHERE id=$id");
$itog4 = mysql_fetch_array($myrow4);

if($myrow1 and $myrow2 == true){
$reply = "thank you for like";	
echo $reply;
exit;
}

//конец страницы likeimgs.php//

На странице fullscreen.php в теге form создал span чтобы сообщать была ли оценена картинка и если да то на странице likeimgs.php есть переменная $reply и к нему приписал echo для вывода сообщения а если не была оценена картинка то также echo выводит переменную $reply -> $reply = "thank you for like";и всё как надо работает но вот только на странице fullscreen.php в теге form имеется эта запись которая выводит запись из таблицы куда записываются лайки echo "<span style='color:red;'>" . $background['likers'] . "</span>" и проблемка пока в том что цифры стоят на месте(как на картинках в ссылках снизу)и не обновляются асинхронно а остальное как "thank you for like" или "Вы уже оценили эту картинку" работают без ошибок и на должном уровне и остался только последний шаг а именно асинхронно обновлять лайк.как тут быть в этом случае?в function(spanget) в скрипте spanget помогает изымать данные из страницы likeimgs.php и именно поэтому благодаря if else выводятся тексты а как лайки не изымать чтобы они уже обновлялись асинхронно не понимаю.помоги мне плиз.буду очень рад тому что наше решение сработает

https://yandex.kz/collections/card/5...708c8e6b99744/
https://yandex.kz/collections/card/5...708c8e6b99745/


Часовой пояс GMT +3, время: 11:00.