Добавление продуктов, которые уже находятся в массиве $ _SESSION

У меня есть небольшая проблема с добавлением продуктов в глобальный массив. Это может быть использовано в корзине. Вот часть кода, на которой мы сосредоточены:

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

Решение

Я бы предложил немного изменить массив. Внутри «корзины» используйте идентификатор продукта в качестве ключа для продуктов. Таким образом, вы можете легко найти и обновить продукты в массиве.

Вы можете просто изменить массив корзины в сеансе. Поскольку ключи являются уникальными в массиве, установка значения для ключа перезапишет предыдущее.

Поэтому я добавил немного измененную версию вашего внутреннего кода. Он выполняет три шага:

  1. Добавьте переменные записи в обычные переменные. Я считаю, что с этим проще работать, и вы можете выполнять любые другие проверки, прежде чем продолжить (например, проверка количества> 0 и т. Д.).

  2. Получить существующий продукт из массива или инициализировать новый продукт. Это использует array_key_existsпотому что я думаю, что это самая чистая проверка, но люди также используют
    isset($_SESSION['cart'][$productId]), который также должен работать. В любом случае, такая проверка лучше (быстрее, проще), чем использование цикла, но она будет работать, только если вы переключитесь на использование идентификаторов продукта для ключей.

  3. Просто установите или обновите количество и запишите обновленный продукт обратно в массив. Если продукт существовал ранее, он просто перезапишет предыдущее значение.

Код становится:

// 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, Обязательно проверьте это и отобразите соответствующую ошибку вместо обновления корзины, что может повредить вашу корзину.
  • Если количество не может быть добавлено, я не стал бы молча уменьшать количество, потому что пользователь подумает, что он нашел ошибку. Вместо этого четко укажите, что такое количество недоступно.
  • И вы можете пересмотреть это. В конце концов, может быть, другой товар будет доставлен сегодня, или другие люди могут заказать последний товар одновременно. Поэтому лучше проверить это позже, когда заказ хорошо сохранен и вы хотите его обработать.
  • Отображение информации о доступных количествах в корзине даст вашим конкурентам представление о количестве имеющихся у вас запасов, из которого они могут также извлечь другую информацию. Кроме того, они могут даже размещать поддельные заказы, чтобы сделать продукты недоступными на вашем сайте. Это мир собачьей еды. Будьте осторожны, какую информацию вы показываете.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]