Я пытаюсь сделать корзину для сайта. Конкретно сейчас я пытаюсь взять данные из input'а с количеством товара с помощью ajax-запроса. Но мне почему-то выдает ошибку 'Undefined array key "id_tov" ' и 'Undefined array key "count" '. То есть, данные или не передаются вообще, или не получаются этим файлом, я не знаю. Вот код на jquery: Код (Javascript): $('.col').blur(function (){ var col = $(this).val() var id = $(this).attr('id') if (col < 1) { col = 1 $(this).val(1) } $.ajax({ method: "POST", url: "countcart.php", data: {id_tov: id, count: col} }) location.replace('countcart.php') }) Вот php-обработчик: PHP: <?php session_start(); header('Content-Type: text/html; charset-utf-8'); $link = mysqli_connect('localhost','root','','catalog'); mysqli_set_charset($link, "UTF8"); $id = implode(',', $_SESSION['cart']); $query = "SELECT * FROM `products` WHERE `id` IN($id)"; $result = mysqli_query($link, $query); $products = []; while ($product = mysqli_fetch_assoc($result)){ $products[] = $product; } $pid = $_POST['id_tov']; $col = $_POST['count']; foreach ($products as $product){ if ($product['id'] = $pid){ $product['count'] = $col; } } $_SESSION['products'] = $products; print_r($products); ?> Форма ввода: PHP: <?php if (!empty($_SESSION['cart'])){ foreach($products as $product){ echo '<tr class="product" id="u'.$product['id'].'">'; echo '<td class="prod"><img src="img/'.$product['img'].'" class="tov"></td>'; echo '<td>'.$product['name'].$product['id'].'</td>'; echo '<td class="price">'.$product['price'].'₽</td>'; echo '<td><del>'.$product['old_price'].'₽</del></td>'; echo '<td><input type="number" value="'.$product['count'].'" class="col" id="'.$product['id'].'"></td>'; echo '<td class="closel" id="'.$product['id'].'"><img src="img/close.png"></td>'; echo '</tr>'; } } ?> Подскажите, пожалуйста, что я делаю не так. Надеюсь это что-то легкое, а я просто туплю.
Я пыталась еще и через change. Просто мне надо именно тогда, когда изменяется количество, а дизайн никаких кнопок не предполагает. Я попробовала поменять место отправки на то, откуда отправляю, и оно начало отправлять, но у меня теперь не получается сделать так, чтоб это количество сохранялось при обновлении страницы. Сейчас код выглядит так: Это php-обработчик(cart.php): PHP: if (isset($_POST['id_tov']) || isset($_POST['count'])){ $id = implode(',', $_SESSION['cart']); $query = "SELECT * FROM `products` WHERE `id` IN($id)"; $result = mysqli_query($link, $query); $productsi = []; while ($product = mysqli_fetch_assoc($result)){ $productsi[] = $product; } $pid = $_POST['id_tov']; $col = $_POST['count']; foreach ($productsi as $product){ if ($product['id'] = $pid){ $product['count'] = $col; } } $_SESSION['col'] = count($productsi); $_SESSION['products'] = $productsi; } else { $id = implode(',', $_SESSION['cart']); $query = "SELECT * FROM `products` WHERE `id` IN($id)"; $result = mysqli_query($link, $query); $products = []; while ($product = mysqli_fetch_assoc($result)){ $product['count'] = 1; $products[] = $product; } $_SESSION['col'] = count($products); $_SESSION['products'] = $products; } Форма отправки(cart.php): PHP: <?php if (!empty($_SESSION['cart'])){ foreach($_SESSION['products'] as $product){ echo'<tr class="product" id="u'.$product['id'].'">'; echo'<td class="prod"><img src="img/'.$product['img'].'" class="tov"></td>'; echo'<td>'.$product['name'].$product['id'].'</td>'; echo'<td class="price">'.$product['price'].'₽</td>'; echo'<td><del>'.$product['old_price'].'₽</del></td>'; echo'<td><input type="number" value="'.$product['count'].'" class="col" id="'.$product['id'].'"></td>'; echo'<td class="closel" id="'.$product['id'].'"><img src="img/close.png"></td>'; echo'</tr>'; } } ?> Jquery: Код (Javascript): $('.col').change(function (){ var col = $(this).val() var id = $(this).attr('id') if (col < 1) { col = 1 $(this).val(1) } $.ajax({ method: "POST", url: "cart.php", data: {id_tov: id, count: col} }) })
Какая версия jquery? в первой Код (Text): $.ajax({ type: "POST", url: "cart.php", data: {id_tov: id, count: col} }) в третьей Код (Text): $.ajax({ method: "POST", url: "cart.php", data: {id_tov: id, count: col} })
Как раз третья. В целом, с проблемой отправки я разобралась, сейчас из отправленных данных у меня создается массив, и я пытаюсь сделать так, чтоб он не добавлялся в сессию второй раз, если такой id уже есть, и заменял count в любом случае. Вот php: PHP: if (isset($_POST['id_tov']) || isset($_POST['count'])){ $a = array('id' => $_POST['id_tov'], 'count' => $_POST['count']); foreach ($_SESSION['id_tov'] as $p){ if ($_POST['id_tov'] = $p['id']){ } else { $_SESSION['id_tov'][] = $a; } } } Не знаю, продолжать тут писать или создать вопрос в другой теме.
PHP: $a = ['id' => $_POST['id_tov'], 'count' => $_POST['count']]; $products = $_SESSION['products'] ?? []; $key = array_search($_POST['id_tov'], array_column($products, 'id')); if ($key !== false) { $_SESSION['products'][$key] = $a; } else { $_SESSION['products'][] = $a; }
Эх, и почему я не заметила ваш ответ раньше. Только что закончила делать, и мой код похож на ваш. Это и правда решает ситуацию. У вас все более лаконично и красиво, но я, наверное, уже не буду исправлять. Но все равно, большое спасибо вам за ответ!