У меня есть небольшая проблема с добавлением продуктов в глобальный массив. Это может быть использовано в корзине. Вот часть кода, на которой мы сосредоточены:
if ( isset($_POST['id']) ){ // If the product is adding to cart. This product Id is sended via form.
$productid = mysql_real_escape_string($_POST['id']);
$cartproduct = mysql_query("select * from stuff where id = '$productid'");
$Addrow=mysql_fetch_assoc($cartproduct);
if ($Addrow['qty']<$_POST['qty']){ // the product quantity that will add to cart can't be greater than in database
$_POST['qty']=$Addrow['qty'];
}
$new_product = array(array('name'=>$Addrow['name'], 'id'=>$Addrow['id'], 'price'=>$Addrow['price'], 'qty'=>$_POST['qty'])); // Creating new product info in array
if (isset($_SESSION['cart'])){ // If the cart exist
foreach ($_SESSION['cart'] as $add_product){
if ($add_product['id']==$_POST['id']){ // checking that product is already in $_SESSION
$exist = TRUE;
}else{
$exist = FALSE;
}
}
if ($exist == TRUE){ // If The product is in the $_SESSION: Update amount
// I dont have code for it.
}else{ // The product is not in array, add it.
$_SESSION["cart"] = array_merge($_SESSION["cart"], $new_product);
}
}else{ // If the cart is not exist
$_SESSION['cart']=$new_product;
}
}
И проблема в том, когда я пытаюсь добавить продукт, который уже в массиве. Функция добавляет его как новый продукт …
Вторая проблема заключается в удалении этих продуктов. Я не могу сделать это с помощью этого:
foreach ($_SESSION['cart'] as $remove){
if($_GET["id"] == $remove['id']){
unset($_SESSION["cart"][$remove]);
}
}
Кто-нибудь может помочь решить это?
Я бы предложил немного изменить массив. Внутри «корзины» используйте идентификатор продукта в качестве ключа для продуктов. Таким образом, вы можете легко найти и обновить продукты в массиве.
Вы можете просто изменить массив корзины в сеансе. Поскольку ключи являются уникальными в массиве, установка значения для ключа перезапишет предыдущее.
Поэтому я добавил немного измененную версию вашего внутреннего кода. Он выполняет три шага:
Добавьте переменные записи в обычные переменные. Я считаю, что с этим проще работать, и вы можете выполнять любые другие проверки, прежде чем продолжить (например, проверка количества> 0 и т. Д.).
Получить существующий продукт из массива или инициализировать новый продукт. Это использует array_key_exists
потому что я думаю, что это самая чистая проверка, но люди также используют isset($_SESSION['cart'][$productId])
, который также должен работать. В любом случае, такая проверка лучше (быстрее, проще), чем использование цикла, но она будет работать, только если вы переключитесь на использование идентификаторов продукта для ключей.
Просто установите или обновите количество и запишите обновленный продукт обратно в массив. Если продукт существовал ранее, он просто перезапишет предыдущее значение.
Код становится:
// Use a variable. It's easier and more readable.
$productId = $_POST['id'];
$quantity = $_POST['qty'];
// Your other checks go here. Left out for brevity.
// Get the current product from the cart, if it exists.
// If not, create a new product.
if (array_key_exists($productId, $_SESSION['cart'])) {
// Product found, get it and update its quantity.
$product = $_SESSION['cart'][$productId];
$product['qty'] += $quantity;
} else {
// Product not found. Initialize a new one.
$product = array(
'name' => $Addrow['name'],
'id' => $Addrow['id'],
'price' => $Addrow['price'],
'qty' => $quantity);
}
// Write updated or new product back to the array, and use the product id as key.
$_SESSION['cart'][$productId] = $product;
Некоторые другие советы:
mysql_*
функции, если у вас есть возможность переключиться на MySQL или PDO. mysql
функции устарели.$Addrow
вероятно будет false
или же null
, Обязательно проверьте это и отобразите соответствующую ошибку вместо обновления корзины, что может повредить вашу корзину.Других решений пока нет …