Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Корзина покупок
 
 автор: sphigurus   (17.06.2011 в 21:20)   письмо автору
 
 

Добрый день...
Например есть код:

<?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']);




?>

  Ответить  
 
 автор: cheops   (17.06.2011 в 21:48)   письмо автору
 
   для: sphigurus   (17.06.2011 в 21:20)
 

А в чем выражается "не работа" скрипта?

PS Вы, кстати, зря сессию сериализуете... дело в том, что функция serialize() потом применяется к данным сессии для сохранения в файл сессии. Т.е. по вашим данным функция serialize() проходится два раза - она для этого не предназначена и часто дает сбой, особенно если данные сложные и используются массивы как у вас. Даже если дело не в этом, очень вероятно, что вы время от времени будете сталкиваться с тем, что не сможете восстановить данные при помощи unserialize(). Кстати, не очень понятно, зачем вообще подвергать массив $arr сериализации?

  Ответить  
 
 автор: sphigurus   (18.06.2011 в 02:35)   письмо автору
 
   для: cheops   (17.06.2011 в 21:48)
 

Работает не правильно.
Если в корзину добавляешь одну и туже позицию все работает нормально но когда добавляешь другую то количество добавляется позиции первой. И дело не в сериализации, но спасибо за подсказку.

  Ответить  
 
 автор: parczynski   (18.06.2011 в 03:59)   письмо автору
 
   для: sphigurus   (17.06.2011 в 21:20)
 

удалите пожалуйста это сообщение. 2 случайно добавилось

  Ответить  
 
 автор: parczynski   (18.06.2011 в 04:00)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: sphigurus   (18.06.2011 в 11:10)   письмо автору
 
   для: parczynski   (18.06.2011 в 04:00)
 

Огромное спасибо, код работает. Было подозрение, что проблема в цикле, но не знал, как правильно ее решить.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования