Это как бы в связи с моим первым постом, но новым выпуском. Я не был уверен в протоколе, поэтому создал новую тему. (ссылка на первый пост)
Я искал здесь и нашел несколько разных случаев моей проблемы, но, похоже, не понимаю ничего достаточно, чтобы продвигаться вперед с моей собственной программой.
Краткое описание: корзина. У меня есть несколько пунктов, перечисленных на странице с itemID. Пользователь нажимает на товар, он добавляется в корзину. Если пользователь щелкает один и тот же элемент дважды, количество должно увеличиваться на единицу (в настоящее время жестко задано). Массив $ _SESSION [‘cart’] должен начинаться с нуля и быть динамическим.
Текущие проблемы: при тестировании кажется, что цикл проходит только один раз, array_push выдает ошибку, даже если параметр one является массивом, не удаляет элемент должным образом и не считывает количество в цикле for. Отображает «1» в print_r($_SESSION['cart']
но ‘0’ в $_SESSION['cart']['itemID']['quantity'];
Warning: array_push() expects parameter 1 to be array, null given in C:\xampp\htdocs\A06_DictCart\controller\updateCart.php on line 25
Вроде бы несколько разных проблем, но исправление одной поможет мне продвинуться вперед с другими, я бы предположил, что они частично связаны.
viewCart.php
<?php
session_start();
/* Display the itemID and quantity of each item in the shopping cart.
This may be implemented by iterating though the items in the dictionary
and displaying their keys and values. */
echo ' ** array/ '.print_r($_SESSION['cart']).' ** count/ '.count($_SESSION['cart']);
echo '<br>'.$_SESSION['cart']['itemID']['quantity'];
echo '<center><h2><u>SHOPPING CART</u></h2>';
echo '<br><TABLE border=1 cellPadding=3 cellSpacing=1>
<TBODY>
<TR>
<TD>ItemID</TD>
<TD>Quantity</TD>
<TD>Remove from Cart</TD></TR>';
if (isset($_SESSION['cart'])) {
$c = count($_SESSION['cart']);
for ($x=0; $x <= $c; $x++){
echo '<tr><td>'.$_SESSION['cart']['itemID'].'</td>';
echo '<td>'.$_SESSION['cart']['itemID']['quantity'].'</td>';
echo "<td><a href='updateCart.php?action=remove&itemID=".$_SESSION['cart']['itemID']."&quantity=".$qty."> Remove from Cart </a></td></tr>";
$x++;
}
}
else {
$msg = '<i> ** cart is empty ** </i>';
echo '<tr> <td></td>';
echo '<td> </td>';
echo "<td> </td></tr>";
}
echo '</tbody></table>';
echo $msg;
echo '<br><br><a href="../controller/default.php">Back to Catalog</a>';
echo '<br><a href="../controller/updateCart.php?action=clear">Empty Cart</a></center>';
?>
updateCart.php
<?php
/* Read the values of action, itemID, and quantity from the querystring.
Items will either be added or removed from the shopping cart depending
on the values of the querystring. Once the quantity is 0 the item should
be unset from the cart. */
session_start();
$action = $_GET['action'];
$itemID = $_GET['itemID'];
$qty = $_GET['quantity'];
$msg;
if (empty($_SESSION['cart'])) $_SESSION['cart'] = array();
//array(); //('123' => 0, '456' => 0, '789' => 0, '101' => 0);
//$cart = array($_SESSION['cart']);
// ADD TO CART
if ($action == 'add') {
if (!in_array($itemID, $_SESSION['cart'])) {
$_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item
} else {
$temp = array($_SESSION['cart']);
$q += $_SESSION['cart'][$itemID]['qty'];
$temp = array('itemID' => $itemID, 'quantity' => $q);
array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity
}
$msg = $qty.' of item # '.$itemID.' has been added to your cart.';
}
// REMOVE FROM CART
if ($action == 'remove'){
if (($_SESSION['cart'][$itemID]['quantity'] - 1) <= 0)
unset ($_SESSION['cart'][$itemID]); // If new value is zero, unset elements
else
$_SESSION['cart'][$itemID]['quantity']--; // Else decrease quantity by one
$msg = $qty.' of item # '.$itemID.' has been removed to your cart.';
}
// EMPTY CART
if ($action == 'clear') {
unset($_SESSION['cart']); // Unset session
session_destroy();
$msg = 'Your shopping cart has been emptied.';
}
?>
<HTML>
<HEAD>
</HEAD>
<BODY>
<center>
<p> <?php echo $msg; ?><br><br>
<p><a href="../controller/default.php">Back to Catalog</a></p>
<p><a href="../controller/viewCart.php">View Cart</a></p>
</center>
</BODY>
</HTML>
В связи с тем, что эта работа еще не завершена, в синтаксисе кода могут быть некоторые несоответствия, которые я еще не обнаружил. Часть кода в выражении «удалить из корзины» я видел в другом посте.
Любая помощь приветствуется.
Я не проверял это, но попробуйте этот код:
// ADD TO CART
if ($action == 'add') {
if (!isset($_SESSION['cart'][$itemID])) {
$_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty); // Insert new item
} else {
$_SESSION['cart'][$itemID]['quantity'] += $qty
}
$msg = $qty.' of item # '.$itemID.' has been added to your cart.';
}
Вот как бы я это написал. Я полагаю, в вашем коде
$_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item
должно быть
$_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty); // Insert new item
И я думаю, что вы перепутали «кол-во» с вашим «количеством» ключа в своем исходном коде. По обновлению читаешь по ключу qty
но ваш инициатор имел quantity
в качестве ключа:
$q += $_SESSION['cart'][$itemID]['qty'];
может быть записано как
$q += $_SESSION['cart'][$itemID]['quantity'];
РЕДАКТИРОВАТЬ: Обратите внимание на это
Возможно, вы захотите подумать о логике вашего приложения и о том, чего вы пытаетесь достичь, прежде чем начинать писать какой-либо код.
if ($action == 'add') {
if (!in_array($itemID, $_SESSION['cart'])) {
$_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty); // Insert new item
} else {
$temp = array($_SESSION['cart']);
$q += $_SESSION['cart'][$itemID]['qty'];
$temp = array('itemID' => $itemID, 'quantity' => $q);
array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity
}
}
Должно быть просто:
if ($action == 'add' ) {
$_SESSION['cart'][$itemID]+=$qty;
}
(Обратите внимание на изменение структуры массива)