|
|
|
| Добрый день...
Например есть код:
<?php
session_start();
if (isset($_POST["id_product"])){
$arr = unserialize($_SESSION['bask']);
if (!empty($arr))
{
//если корзина не пуста
$i=count($arr);
// id продукции
$arr[$i][0]=$_POST["id_product"];
// добавляем одну позицию
$arr[$i][1]=1;
// количество продукции
$arr[$i][2]=$_POST['amount'];
}
else
{
//если корзина пуста
$arr[0][0]=$_POST["id_product"];
$arr[0][1]=1;
$arr[0][2]=$_POST['amount'];
}
$_SESSION['bask'] = serialize($arr);
header('location:'.$_SERVER['HTTP_REFERER']);
}
?>
|
Допустим, покупатель добавляет аналогичную продукцию, как организовать правильно, чтобы продукция не записывалась наново, а добавлялось только количество к существующей.
Вот код, к которому я пришел, но он работает неверно.
<?php
if (isset($_POST["id_product"]))
{
$arr = unserialize($_SESSION['bask']);
if (!empty($arr))
{
//если корзина не пуста
$i=count($arr);
for ($g = 0; $g < $i; $g ++){
// ищем совпадения в массиве
$key = in_array($_POST["id_product"], $arr[$g]);
// ищем ключ в массиве
$key_num = array_search($_POST["id_product"], $arr[$g]);
}
if($key){
//если есть совпадение, тогда к количеству продукции добавляем новое количество
$arr[$key_num][2]= $arr[$key_num][2]+$_POST['amount'];
}
else {
// id продукции
$arr[$i][0]=$_POST["id_product"];
// добавляем одну позицию
$arr[$i][1]=1;
// количество продукции
$arr[$i][2]=$_POST['amount'];
}
}
else
{
//если корзина пуста
$arr[0][0]=$_POST["id_product"];
$arr[0][1]=1;
$arr[0][2]=$_POST['amount'];
}
$_SESSION['bask'] = serialize($arr);
header('location:'.$_SERVER['HTTP_REFERER']);
}
?>
|
| |
|
|
|
|
|
|
|
для: sphigurus
(17.06.2011 в 21:20)
| | А в чем выражается "не работа" скрипта?
PS Вы, кстати, зря сессию сериализуете... дело в том, что функция serialize() потом применяется к данным сессии для сохранения в файл сессии. Т.е. по вашим данным функция serialize() проходится два раза - она для этого не предназначена и часто дает сбой, особенно если данные сложные и используются массивы как у вас. Даже если дело не в этом, очень вероятно, что вы время от времени будете сталкиваться с тем, что не сможете восстановить данные при помощи unserialize(). Кстати, не очень понятно, зачем вообще подвергать массив $arr сериализации? | |
|
|
|
|
|
|
|
для: cheops
(17.06.2011 в 21:48)
| | Работает не правильно.
Если в корзину добавляешь одну и туже позицию все работает нормально но когда добавляешь другую то количество добавляется позиции первой. И дело не в сериализации, но спасибо за подсказку. | |
|
|
|
|
|
|
|
для: sphigurus
(17.06.2011 в 21:20)
| | удалите пожалуйста это сообщение. 2 случайно добавилось | |
|
|
|
|
|
|
|
для: sphigurus
(17.06.2011 в 21:20)
| | во-первых если у вас найдется совпадение в одной из итераций for ($g = 0; $g < $i; $g ++){ то при следующей итерации $key все равно станет false, и в итоге if($key){ даст false даже если продукт уже есть в корзине, во-вторых не стоит использовать in_array, проверяйте первый элемент $arr[$g], так как в вашем случае код товара может совпасть с количеством какого-нибудь товара и $key будет true, хотя товара на самом деле нет в корзине
попробуйте вот так
<?php
session_start();
if (isset($_POST["id_product"]))
{
$arr = $_SESSION['bask'];
if (!empty($arr))
{
//если корзина не пуста
$i=count($arr);
$key_num=-1;
for ($g = 0; $g < $i; $g ++){
// ищем совпадения в массиве
if ($arr[$g][0]==$_POST["id_product"]) $key_num=$g;
}
if($key_num >= 0){
//если есть совпадение, тогда к количеству продукции добавляем новое количество
$arr[$key_num][2]= $arr[$key_num][2]+$_POST['amount'];
}
else {
// id продукции
$arr[$i][0]=$_POST["id_product"];
// добавляем одну позицию
$arr[$i][1]=1;
// количество продукции
$arr[$i][2]=$_POST['amount'];
}
}
else
{
//если корзина пуста
$arr[0][0]=$_POST["id_product"];
$arr[0][1]=1;
$arr[0][2]=$_POST['amount'];
}
$_SESSION['bask'] = $arr;
echo "<pre>";
print_r($_SESSION['bask']);
echo "</pre>";
}
?>
<form action="lala.php" method="post">
<input type="text" name="id_product" value="12"><br />
<input type="text" name="amount" value="12"><br />
<input type="submit" value="отправить">
</form>
|
| |
|
|
|
|
|
|
|
для: parczynski
(18.06.2011 в 04:00)
| | Огромное спасибо, код работает. Было подозрение, что проблема в цикле, но не знал, как правильно ее решить. | |
|
|
|