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

Форум PHP

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

 

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

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

тема: Корзина товара (товар,количество,размеры)
 
 автор: dirol   (09.11.2011 в 18:14)   письмо автору
 
 

Подскажите пожалуйста, как правильно сделать такую корзину?

Человек выбирает товар на странице указаны размеры товара и допустимое количество.


<form action="" method="post" enctype="multipart/form-data" id="product">
<input type="hidden" name="product_id" value="2423" />
<b class="green">Доступные варианты:</b><br />
 <div style="margin-left:5px;">
 <table style="width: 100%;">
  <tr><td></td></tr><tr>
  <td><input type="hidden" name="size[]" value="8357" />S 170</td>
  <td><input type="text" maxlength="5" size="3" value="0" name="quantity[]" class="form_s" style="text-align:right;" />шт.</td>
   </tr>
<tr>
<td><input type="hidden" name="size[]" value="8356" />M 170</td>
<td><input type="text" maxlength="5" size="3" value="0" name="quantity[]" class="form_s" style="text-align:right;" />шт.</td>
</tr>
<tr>
<td><input type="hidden" name="size[]" value="8355" />L 170</td>
<td><input type="text" maxlength="5" size="3" value="0" name="quantity[]" class="form_s" style="text-align:right;" />шт.</td>
</tr>
<tr>
<td><input type="hidden" name="size[]" value="8358" />XL 170</td>
<td><input type="text" maxlength="5" size="3" value="0" name="quantity[]" class="form_s" style="text-align:right;" />шт.</td>
</tr>
 </table>
</div>


как правильно записать эти значения, чтобы потом их вывести из базы данных?
в setcookie или в сесии через serialize ?

щас пишутся в кукисы данные, id товара и количество

в корзине выводятся данные id, название, количество, цена.



$cookies = ($_COOKIE['shop']) ;
$result = $db->sql_query("SELECT id, title, preis FROM ".$prefix."_shop WHERE id IN ($cookies)");
while(list($sid, $title, $preis) = $db->sql_fetchrow($result)) {
echo"тут список товара $sid, $title, $preis";
}



вот как это все еще разделить по размерам, подскажите пожалуйста

  Ответить  
 
 автор: cheops   (09.11.2011 в 19:07)   письмо автору
 
   для: dirol   (09.11.2011 в 18:14)
 

Пока не очень понятно что вызывает сложность? Правильно ли я понимаю, что для cookie вы данные извлекаете?

  Ответить  
 
 автор: dirol   (09.11.2011 в 19:13)   письмо автору
 
   для: cheops   (09.11.2011 в 19:07)
 

сложность вызывает запись в кукисы. получается записывать надо id товара потом количество и размер.

и как это выводить правильно если в базе данных товар идет под одним номером а человек заказал два или три варианта размера

  Ответить  
 
 автор: cheops   (09.11.2011 в 19:23)   письмо автору
 
   для: dirol   (09.11.2011 в 19:13)
 

Попробуйте закодировать данные, т.е. сформировать строку вида id-total-size для каждого товара и разделять их точкой с запятой, например, "48273-2-345;48272-1-270", такую строку всегда можно будет быстро разобрать при помощи функции explode().

  Ответить  
 
 автор: dirol   (09.11.2011 в 19:42)   письмо автору
 
   для: cheops   (09.11.2011 в 19:23)
 

а выводить как их?
к примеру записали в кукисы одинаковый товар
48273-2-21; 48273-2-22;48273-2-23;

получается один и тот же товар но с разными размерами.

в корзине как это выводить?




$cookies = ($_COOKIE['shop']) ; 
$result = $db->sql_query("SELECT id, title, preis FROM ".$prefix."_shop WHERE id IN ($cookies)"); 
while(list($sid, $title, $preis) = $db->sql_fetchrow($result)) { 
echo"тут список товара $sid, $title, $preis"; 
}


чтобы один и тот же товар был с новой строки с указанием размера и количества товара

  Ответить  
 
 автор: cheops   (09.11.2011 в 19:51)   письмо автору
 
   для: dirol   (09.11.2011 в 19:42)
 

При разборе cookie можно сформировать двумерный массив, первый элемент которого будет отвечать за идентификатор товара, а второй за размер, т.е. что-то вроде этого
<?php
  $arr
[48272][22] = 2;
  
$arr[48273][21] = 2;
  
$arr[48273][22] = 2;
  
$arr[48273][23] = 2;
  
$arr[48274][22] = 2;
?>
тогда на каждой итерации цикла while(), который сканирует результирующую таблицу нужно будет просто в цикле обращаться к массиву $arr[$sid] и в зависимости от количества его элементов (количества разных заказанных размеров) выводить соответствующую строку.

  Ответить  
 
 автор: dirol   (09.11.2011 в 20:00)   письмо автору
 
   для: cheops   (09.11.2011 в 19:51)
 

спасибо. под вечер уже мозг совсем не работает, подскажите как свормировать масив только из id товаров?

  Ответить  
 
 автор: cheops   (09.11.2011 в 20:10)   письмо автору
 
   для: dirol   (09.11.2011 в 20:00)
 

А из чего формируем? Из этого 48273-2-21; 48273-2-22;48273-2-23; ?

  Ответить  
 
 автор: dirol   (09.11.2011 в 20:11)   письмо автору
 
   для: cheops   (09.11.2011 в 20:10)
 

к примеру да,

48273-2-21; 48273-2-22;48273-2-23; 48273-2-21; 48273-2-22;48273-2-23; 48273-2-21; 48273-2-22;48273-2-23;

первое это id товара 2 количество и размер

  Ответить  
 
 автор: cheops   (09.11.2011 в 20:15)   письмо автору
 
   для: dirol   (09.11.2011 в 20:11)
 

Можно начать отталкиваться от следующего скрипта
<?php
  $str 
"48273-2-21; 48273-2-22;48273-2-23; 48273-2-21; ".
         
"48273-2-22;48273-2-23; 48273-2-21; 48273-2-22;48273-2-23;";
  
$str str_replace(" """$str);
  
$elements explode(";"$str);
  
$basket = array();
  if(!empty(
$elements))
  {
    for(
$i 0$i count($elements); $i++)
    {
      list(
$id$total$size) = explode("-"$elements[$i]);
      
$basket[$id][$size] = $total;
    }
  }
?>
или такого
<?php
  $str 
"48273-2-21; 48273-2-22;48273-2-23; 48273-2-21; ".
         
"48273-2-22;48273-2-23; 48273-2-21; 48273-2-22;48273-2-23;";
  
$str str_replace(" """$str);
  
$elements explode(";"$str);
  
$basket = array();
  if(!empty(
$elements))
  {
    for(
$i 0$i count($elements); $i++)
    {
      list(
$id$total$size) = explode("-"$elements[$i]);
      
$basket[$id] = $total."-".$size;
    }
  }
?>

  Ответить  
 
 автор: dirol   (14.11.2011 в 13:10)   письмо автору
 
   для: cheops   (09.11.2011 в 20:15)
 

теперь затупил с добовлением товара(((


методом пос в кукисы загонять как удобнее всего, номер товара размер и количество шт ?
и чтобы если добавлять к определенному товару изменять количество в кукисах?

к примеру на стрнаице у товра есть 5 размеров и напротив каждого поле шт

заказали там XL -5 шт и S -3 шт и M-8 шт,
записать все в кукисы как правильно?

а потом чел передумал и добавил еще к M-2 in товара , как это изменить в кукисах?

  Ответить  
 
 автор: cheops   (14.11.2011 в 14:04)   письмо автору
 
   для: dirol   (14.11.2011 в 13:10)
 

Каждый раз нужно разбивать данные из $_COOKIE, формировать массив, производить в нем изменения, потом обратно его упаковывать в строку и класть обратно в cookie.

  Ответить  
 
 автор: dirol   (15.11.2011 в 17:25)   письмо автору
1 Кб
 
   для: cheops   (14.11.2011 в 14:04)
 

сделали мне корзину на ajax ? и скрылись.

записывается все в кукисы, но при выводе дурдом.

кто подскажет почеловечески как там выводить , через explode разделить |


null%u0420%u0430%u0437%u043C%u0435%u0440 1=0-2578|%u0420%u0430%u0437%u043C%u0435%u0440 2=6-2578|%u0420%u0430%u0437%u043C%u0435%u0440 3=0-2578|%u0420%u0430%u0437%u043C%u0435%u0440 4=0-2578|%u0420%u0430%u0437%u043C%u0435%u0440 5=0-2578|

  Ответить  
 
 автор: cheops   (15.11.2011 в 17:53)   письмо автору
 
   для: dirol   (15.11.2011 в 17:25)
 

Это UTF-8, дать вам функцию декодирования?

  Ответить  
 
 автор: dirol   (15.11.2011 в 18:05)   письмо автору
 
   для: cheops   (15.11.2011 в 17:53)
 

если не сложно.
попробывал iconv, но чтото без результатно

  Ответить  
 
 автор: cheops   (15.11.2011 в 18:33)   письмо автору
 
   для: dirol   (15.11.2011 в 18:05)
 

Решение можно найти в теме по ссылке http://softtime.ru/forum/read.php?id_forum=1&id_theme=82911 (только нужно будет слеши заменить на %).

  Ответить  
 
 автор: dirol   (16.11.2011 в 10:36)   письмо автору
 
   для: cheops   (15.11.2011 в 18:33)
 

сделал на ajax передачу размеров и количество товаров



Array
(
    [0] =>   L 170    
    [1] =>   M 170
    [2] =>   S 170
    [3] =>   XL 170
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 
    [10] => 
)
Array
(
    [0] => 55
    [1] => 55
    [2] => 55
    [3] => 55
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 
    [10] => 
)


и есстествно id товара

как все собрать и превести к виду, который был указан выше, 48273-2-21

id -size-count

  Ответить  
 
 автор: dirol   (16.11.2011 в 11:19)   письмо автору
 
   для: dirol   (16.11.2011 в 10:36)
 

вроде собрал



     for ($i = 0; $i < (11); $i++) {
     $size[] = trim(str_replace(array("'", '"', "    ", " ", ":", ";", ".", "(", ")"), "", ($_REQUEST["size".$i.""])));
     }

     for ($a = 0; $a < (11); $a++) {
     $text[] = ($_REQUEST["text".$a.""]);

     }

      $text=array_diff($text,array(""));
       $size=array_diff($size,array(""));
       for ($i = 0; $i < count($size); $i++) {
       $finish.="$cid-$size[$i]-$text[$i]|";
       }


  Ответить  
 
 автор: dirol   (16.11.2011 в 13:32)   письмо автору
 
   для: dirol   (16.11.2011 в 11:19)
 

все победил!

  Ответить  
 
 автор: dirol   (17.11.2011 в 14:02)   письмо автору
 
   для: dirol   (16.11.2011 в 13:32)
 

все выдохся, не получается

в кукисах хранится 91-44164-30|91-46170-10|91-48170-22|11-XL170-22|11-XL170-10|

первое это id товара - потом размер - количество

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

найти 11-XL170 и к его количеству 22 шт прибавить еще 10 шт

  Ответить  
 
 автор: dirol   (17.11.2011 в 14:11)   письмо автору
 
   для: dirol   (17.11.2011 в 14:02)
 



 $cookies = ($_COOKIE['shop']) ? ($_COOKIE['shop']) : "" ;
           $str = str_replace(" ", "", $cookies);
        $elements = explode("|", $str);

       $text=array_diff($text,array(""));
       $size=array_diff($size,array(""));
       for ($i = 0; $i < count($size); $i++) {
           if($text[$i]!=0){
             list($id, $sizes, $totals) = explode("-", $elements[$i]);

         $finish.="$cid-$size[$i]-$text[$i]|";


        }
       }




понамутил

  Ответить  
 
 автор: cheops   (17.11.2011 в 14:37)   письмо автору
 
   для: dirol   (17.11.2011 в 14:02)
 

Погодите, у вас в cookie не должно быть одинаковых ключей, предполагается, что вы действуете как-то так
<?php
  
// Исходные данные
  
$cookie "91-44164-30|91-46170-10|91-48170-22|11-XL170-22";
  
// Преобразуем сроку в массив
  
$items explode("|"$cookie);
  
$products = array();
  for(
$i 0$i count($items); $i++)
  {
    if(empty(
$items[$i])) continue;
    list(
$id$sizes$totals) = explode("-"$items[$i]);
    
$products[$id][$sizes] = $totals;
  }
  
// Выводим промежуточный результат
  
echo "<pre>";
  
print_r($products);
  echo 
"</pre>";
  
// Увеличиваем количество товаров для id = 11
  
$products[11]['XL170'] += 10;
  
// Преобразуем массив обратно в строку
  
$subcookie = array();
  foreach(
$products as $id => $sizes)
  {
    foreach(
$sizes as $size => $total)
    {
      
$subcookie[] = $id."-".$size."-".$total;
    }
  }
  
$cookie implode("|"$subcookie);
  echo 
$cookie;
?>
если же все-таки дублирующие записи в cookie необходимы и никуда от них не деться, то при первой же возможности их нужно сворачивать, для этого, в приведенном выше коде, строку
$products[$id][$sizes] = $totals;
следует заменить на
$products[$id][$sizes] += $totals;

  Ответить  
 
 автор: dirol   (17.11.2011 в 15:13)   письмо автору
 
   для: cheops   (17.11.2011 в 14:37)
 

нет , хочется без дублирования.

куда правильно вставить ваш код в данную функцию?



<?php
function add_basket2(){
  global 
$db$prefix$confso;
  
$cid intval($_REQUEST['id']);
  
$vote_check = ($_REQUEST['vote']);


     for (
$i 0$i < (17); $i++) {
     
$size[] = trim(str_replace(array("'"'"'"    "" "":"";"".""("")"), "", ($_REQUEST["size".$i.""])));
     }

     for (
$a 0$a < (17); $a++) {
     
$text[] = ($_REQUEST["text".$a.""]);
     }

       
$text=array_diff($text,array(""));
       
$size=array_diff($size,array(""));
       for (
$i 0$i count($size); $i++) {
           if(
$text[$i]!=0){

         
$finish[] = $id."-".$size[$i]."-".$text[$i];

        }
       }
       
$finish implode("|"$finish);

         if (
$cookies) {
            
$info = ("".$cookies."".$finish."");

            
setcookie("shop", ($info), time() + 86400);
        } else {
            
setcookie("shop", ($finish), time() + 86400);
            
$info = ($finish);

        }


   
show_basket($info$cid$typ);
}
?>

  Ответить  
 
 автор: cheops   (17.11.2011 в 15:16)   письмо автору
 
   для: dirol   (17.11.2011 в 15:13)
 

Ммм... Если честно не знаю, так как логика приложения мне до конца не понятна. Лучше будет создать небольшой API, который будет содержать три функции - извлечения массива из cookie, запись массива в cookie и отображение корзины. Тогда проектировать корзину станет намного проще.

  Ответить  
 
 автор: dirol   (17.11.2011 в 15:21)   письмо автору
 
   для: cheops   (17.11.2011 в 15:16)
 

ну тут получается добавление в корзину, в данном случаии в кукисы, и показ корзины function show_basket

$cid = intval($_REQUEST['id']);  это id товара 


     for ($i = 0; $i < (17); $i++) {
     $size[] = trim(str_replace(array("'", '"', "    ", " ", ":", ";", ".", "(", ")"), "", ($_REQUEST["size".$i.""])));
     }
это размеры 


     for ($a = 0; $a < (17); $a++) {
     $text[] = ($_REQUEST["text".$a.""]);
     }
тут количество товара




$text=array_diff($text,array(""));
       $size=array_diff($size,array(""));
       for ($i = 0; $i < count($size); $i++) {
           if($text[$i]!=0){

         $finish[] = $cid."-".$size[$i]."-".$text[$i];

        }
       }
       $finish = implode("|", $finish);

         if ($cookies) {
            $info = ("".$cookies."".$finish."");

            setcookie("shop", ($info), time() + 86400);
        } else {
            setcookie("shop", ($finish), time() + 86400);
            $info = ($finish);

        }
тут собирается кукисы, если нету кукисов то создает объект, если есть кукисы то просто добавляет значение.

вот тут бы вставить вашу функцию, что если есть в кукисах данный ключ то дописать его

  Ответить  
 
 автор: dirol   (17.11.2011 в 15:36)   письмо автору
18 Кб
 
   для: dirol   (17.11.2011 в 15:21)
 

или ладно , если дублируются пусть дублируются, но при выводе товара в корзине чтобы объединялись, такое возможно?


<?php

$cookies 
= ($_COOKIE['shop']);
  
$str str_replace(" """$cookies);
  
$elements explode("|"$str);
  
$basket = array();
  
$sizes = array();
  if(!empty(
$elements)){
    for(
$i 0$i count($elements); $i++){
      list(
$id$size$totals) = explode("-"$elements[$i]);
      
$basket[] = $id;
      
$sizes[] = $size;
    }
  }
  
$arr_i implode(","$basket);
  
$arr_i chop($arr_i",");

         
$pattern "#(XS|S|M|L|XL|XXL|XXL|XXXL|XXS|XS|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|)(\d+)#";

        
$result $db->sql_query("SELECT id, title, preis FROM ".$prefix."_shop WHERE id IN ($arr_i)");
        while(list(
$sid$title$preis) = $db->sql_fetchrow($result)) {
            if(!empty(
$elements)){
            for(
$i 0$i count($elements); $i++){
              list(
$id$size$totals) = explode("-"$elements[$i]);
             if(
$id==$sid){
               
$sizes preg_replace($pattern"\\1 \\2"$size);
               
$content .= "".$sid."-<a href=\"index.php?name=shop&op=view&id=$sid\">".$title."</a>-".$sizes."-".$totals."";
             }
            }
          }
        }


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

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