За последние 24 часа нас посетили 16905 программистов и 1179 роботов. Сейчас ищут 1600 программистов ...

Ajax не передает данные через POST

Тема в разделе "JavaScript и AJAX", создана пользователем EslukSia, 26 май 2023.

  1. EslukSia

    EslukSia Новичок

    С нами с:
    26 май 2023
    Сообщения:
    4
    Симпатии:
    0
    Я пытаюсь сделать корзину для сайта. Конкретно сейчас я пытаюсь взять данные из input'а с количеством товара с помощью ajax-запроса. Но мне почему-то выдает ошибку 'Undefined array key "id_tov" ' и 'Undefined array key "count" '. То есть, данные или не передаются вообще, или не получаются этим файлом, я не знаю.
    Вот код на jquery:
    Код (Javascript):
    1. $('.col').blur(function (){
    2.         var col = $(this).val()
    3.         var id = $(this).attr('id')
    4.         if (col < 1) {
    5.             col = 1
    6.             $(this).val(1)
    7.         }
    8.         $.ajax({
    9.             method: "POST",
    10.             url: "countcart.php",
    11.             data: {id_tov: id, count: col}
    12.         })
    13.         location.replace('countcart.php')
    14.     })
    Вот php-обработчик:
    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset-utf-8');
    3. $link = mysqli_connect('localhost','root','','catalog');
    4. mysqli_set_charset($link, "UTF8");
    5.  
    6. $id = implode(',', $_SESSION['cart']);
    7. $query = "SELECT * FROM `products` WHERE `id` IN($id)";
    8. $result = mysqli_query($link, $query);
    9. $products = [];
    10. while ($product = mysqli_fetch_assoc($result)){
    11.     $products[] = $product;
    12. }
    13. $pid = $_POST['id_tov'];
    14. $col = $_POST['count'];
    15. foreach ($products as $product){
    16.     if ($product['id'] = $pid){
    17.         $product['count'] = $col;
    18.     }
    19. }
    20. $_SESSION['products'] = $products;
    21. print_r($products);
    22.  
    23. ?>
    Форма ввода:
    PHP:
    1. <?php
    2.             if (!empty($_SESSION['cart'])){
    3.                 foreach($products as $product){
    4.                     echo '<tr class="product" id="u'.$product['id'].'">';
    5.                     echo '<td class="prod"><img src="img/'.$product['img'].'" class="tov"></td>';
    6.                     echo '<td>'.$product['name'].$product['id'].'</td>';
    7.                     echo '<td class="price">'.$product['price'].'₽</td>';
    8.                     echo '<td><del>'.$product['old_price'].'₽</del></td>';
    9.                     echo '<td><input type="number" value="'.$product['count'].'" class="col" id="'.$product['id'].'"></td>';
    10.                     echo '<td class="closel" id="'.$product['id'].'"><img src="img/close.png"></td>';
    11.                     echo '</tr>';
    12.                 }  
    13.             }
    14.             ?>
    Подскажите, пожалуйста, что я делаю не так. Надеюсь это что-то легкое, а я просто туплю.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Наверно, из-за blur.

    Нужно клики/сабмиты обрабатывать, а не ЭТО.
     
  3. EslukSia

    EslukSia Новичок

    С нами с:
    26 май 2023
    Сообщения:
    4
    Симпатии:
    0
    Я пыталась еще и через change. Просто мне надо именно тогда, когда изменяется количество, а дизайн никаких кнопок не предполагает. Я попробовала поменять место отправки на то, откуда отправляю, и оно начало отправлять, но у меня теперь не получается сделать так, чтоб это количество сохранялось при обновлении страницы. Сейчас код выглядит так:
    Это php-обработчик(cart.php):
    PHP:
    1. if (isset($_POST['id_tov']) || isset($_POST['count'])){
    2.  
    3.     $id = implode(',', $_SESSION['cart']);
    4.     $query = "SELECT * FROM `products` WHERE `id` IN($id)";
    5.     $result = mysqli_query($link, $query);
    6.     $productsi = [];
    7.     while ($product = mysqli_fetch_assoc($result)){
    8.         $productsi[] = $product;
    9.     }
    10.     $pid = $_POST['id_tov'];
    11.     $col = $_POST['count'];
    12.     foreach ($productsi as $product){
    13.         if ($product['id'] = $pid){
    14.             $product['count'] = $col;
    15.         }
    16.     }
    17.     $_SESSION['col'] = count($productsi);
    18.     $_SESSION['products'] = $productsi;
    19. } else {
    20.     $id = implode(',', $_SESSION['cart']);
    21.     $query = "SELECT * FROM `products` WHERE `id` IN($id)";
    22.     $result = mysqli_query($link, $query);
    23.     $products = [];
    24.     while ($product = mysqli_fetch_assoc($result)){
    25.         $product['count'] = 1;
    26.         $products[] = $product;
    27.     }
    28.     $_SESSION['col'] = count($products);
    29.     $_SESSION['products'] = $products;
    30. }

    Форма отправки(cart.php):
    PHP:
    1. <?php
    2.             if (!empty($_SESSION['cart'])){
    3.                     foreach($_SESSION['products'] as $product){
    4.                         echo'<tr class="product" id="u'.$product['id'].'">';
    5.                         echo'<td class="prod"><img src="img/'.$product['img'].'" class="tov"></td>';
    6.                         echo'<td>'.$product['name'].$product['id'].'</td>';
    7.                         echo'<td class="price">'.$product['price'].'₽</td>';
    8.                         echo'<td><del>'.$product['old_price'].'₽</del></td>';
    9.                         echo'<td><input type="number" value="'.$product['count'].'" class="col" id="'.$product['id'].'"></td>';
    10.                         echo'<td class="closel" id="'.$product['id'].'"><img src="img/close.png"></td>';
    11.                         echo'</tr>';
    12.                     }
    13.             }
    14.             ?>

    Jquery:
    Код (Javascript):
    1. $('.col').change(function (){
    2.         var col = $(this).val()
    3.         var id = $(this).attr('id')
    4.         if (col < 1) {
    5.             col = 1
    6.             $(this).val(1)
    7.         }
    8.         $.ajax({
    9.             method: "POST",
    10.             url: "cart.php",
    11.             data: {id_tov: id, count: col}
    12.         })
    13.     })
     
  4. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    Какая версия jquery?
    в первой
    Код (Text):
    1.   $.ajax({
    2.             type: "POST",
    3.             url: "cart.php",
    4.             data: {id_tov: id, count: col}
    5.         })
    в третьей
    Код (Text):
    1.  $.ajax({
    2.             method: "POST",
    3.             url: "cart.php",
    4.             data: {id_tov: id, count: col}
    5.         })
     
  5. EslukSia

    EslukSia Новичок

    С нами с:
    26 май 2023
    Сообщения:
    4
    Симпатии:
    0
    Как раз третья. В целом, с проблемой отправки я разобралась, сейчас из отправленных данных у меня создается массив, и я пытаюсь сделать так, чтоб он не добавлялся в сессию второй раз, если такой id уже есть, и заменял count в любом случае.
    Вот php:
    PHP:
    1. if (isset($_POST['id_tov']) || isset($_POST['count'])){
    2.  
    3.     $a = array('id' => $_POST['id_tov'], 'count' => $_POST['count']);
    4.     foreach ($_SESSION['id_tov'] as $p){
    5.         if ($_POST['id_tov'] = $p['id']){
    6.         } else {
    7.             $_SESSION['id_tov'][] = $a;
    8.         }
    9.     }
    10. }

    Не знаю, продолжать тут писать или создать вопрос в другой теме.
     
  6. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    PHP:
    1.  $a = ['id' => $_POST['id_tov'], 'count' => $_POST['count']];
    2.  
    3.     $products = $_SESSION['products'] ?? [];
    4.  
    5.     $key = array_search($_POST['id_tov'], array_column($products, 'id'));
    6.  
    7.     if ($key !== false) {
    8.         $_SESSION['products'][$key] = $a;
    9.     } else {
    10.         $_SESSION['products'][] = $a;
    11.     }
     
    EslukSia нравится это.
  7. EslukSia

    EslukSia Новичок

    С нами с:
    26 май 2023
    Сообщения:
    4
    Симпатии:
    0
    Эх, и почему я не заметила ваш ответ раньше. Только что закончила делать, и мой код похож на ваш. Это и правда решает ситуацию. У вас все более лаконично и красиво, но я, наверное, уже не буду исправлять. Но все равно, большое спасибо вам за ответ!