Автор Тема: shopping cart проблеми с масиви  (Прочетена 889 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

2SHAE

  • Newbie
  • *
  • Благодарности
  • -Казани: 3
  • -Получени: 0
  • Публикации: 22
shopping cart проблеми с масиви
« -: 31 Януари 2016, 22:01:31 »
Здравейте, опитвам се да пресъздам една пазарска кошница. Взех я от урока на този човек ТУК.

Успях да напасна кода и сега успешно вкарва добавя,разлиства,преброява и премахва продукти. Тъй като системата не предлагаше начин за взимане на количество от поле, се наложи да пипна кода в add_to_cart.php. Сега успешно пренасям чрез get необходимите стойности във файла add_to_cart.php, но не мога да се справя с масивите. Как да запиша правилно резултатите в масив и след това да ги запиша в сесия? Към момента с моя код работи, но само до 3 резултата. На четвъртия започва да дава грешка, че продукта вече съществувал.

Код: PHP
  1.         $productByCode = mysql_query("SELECT * FROM products WHERE product_id='" . $_GET["id"] . "'") or die (mysql_error());
  2.         while($row=mysql_fetch_assoc($productByCode)){
  3.         $itemArray = array($row['product_id']=>array('name'=>$row["product_title"], 'id'=>$row["product_id"], 'quantity'=>$_GET["quantity"], 'price'=>$row["product_price"]));
  4.         if(!empty($_SESSION["cart_items"])) {
  5.                                 if(in_array($row["product_id"],$_SESSION["cart_items"])) {
  6.                                         foreach($_SESSION["cart_items"] as $k => $v) {
  7.                                                         if($row["product_id"] == $k)
  8.                                                                 $_SESSION["cart_items"][$k]["quantity"] = $_POST["quantity"];
  9.                                         }
  10.                                 } else {
  11.                                         $_SESSION["cart_items"] = array_merge($_SESSION["cart_items"],$itemArray);
  12.                                 }
  13.                         } else {
  14.                                 $_SESSION["cart_items"] = $itemArray;
  15.                         }
  16.         }
  17.  

Ето как изглежда сесията:

Код: PHP
  1. (
  2.     [0] => Array
  3.         (
  4.             [name] => Елемвитал с органичен йод
  5.             [product_id] => 4
  6.             [quantity] => 1
  7.             [price] => 16.44
  8.         )
  9.  
  10.     [1] => Array
  11.         (
  12.             [name] => Ритми на здраве
  13.             [product_id] => 3
  14.             [quantity] => 3
  15.             [price] => 18.99
  16.         )
  17.  
  18. )

Във файла cart.php се използват следните кодове за изваждане на резултатите:

$ids = "";
    foreach($_SESSION['cart_items'] as $id=>$value){
        $ids = $ids . $id . ",";
    }
 
    // remove the last comma
    $ids = rtrim($ids, ',');

        $query = mysql_query("SELECT product_id, product_title, product_price FROM products WHERE product_id IN ({$ids}) ORDER BY product_title") or die (mysql_error());
 
        while ($row = mysql_fetch_assoc($query)){

echo "<td>{$row['product_title']}</td>";
                echo "<td>{$row['product_price']} лв.</td>";
« Последна редакция: 31 Януари 2016, 22:31:03 от Avalanche »
"Screw you guys i am going home"

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Re: shopping cart проблеми с масиви
« Отговор #1 -: 31 Януари 2016, 22:43:37 »
Не е нужно да въртиш всички продукти в количката, ако вече знаеш кой ще редактираш. Може да реферерираш ключа на масива директно от _SESSION, по този начин:
Код: PHP
  1. $_SESSION['cart_items'][__ИД-то на продукта__]['quantity'] = $_POST['quantity'];

Нещо от този сорт:

Код: PHP
  1. <?php
  2.  
  3. $productByCode = mysql_query("SELECT * FROM products WHERE product_id='" . $_GET["id"] . "'") or die (mysql_error());
  4. while ($row = mysql_fetch_assoc($productByCode)) {
  5.     $itemArray = array($row['product_id'] => array(
  6.         'name' => $row["product_title"],
  7.         'id' => $row["product_id"],
  8.         'quantity' => $_GET["quantity"],
  9.         'price' => $row["product_price"]
  10.         )
  11.     );
  12.  
  13.     if (!empty($_SESSION["cart_items"])) {
  14.         if (in_array($row["product_id"], $_SESSION["cart_items"])) {
  15.  
  16.             // Тук въртиш всички продукти в количката, за да намериш само един, който вече знаеш кой е
  17.             // foreach ($_SESSION["cart_items"] as $k => $v) {
  18.             //     if ($row["product_id"] == $k)
  19.             //         $_SESSION["cart_items"][$k]["quantity"] = $_POST["quantity"];
  20.             // }
  21.  
  22.             // Може да минеш само с един ред, in_array прави същото което и: if ($row["product_id"] == $k) от горния блок
  23.             $_SESSION['cart_items'][$row['product_id']]['quantity'] = $_POST['quantity'];
  24.         } else {
  25.             $_SESSION["cart_items"] = array_merge($_SESSION["cart_items"],$itemArray);
  26.         }
  27.     } else {
  28.         $_SESSION["cart_items"] = $itemArray;
  29.     }
  30. }
  31.  
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

2SHAE

  • Newbie
  • *
  • Благодарности
  • -Казани: 3
  • -Получени: 0
  • Публикации: 22
Re: shopping cart проблеми с масиви
« Отговор #2 -: 31 Януари 2016, 23:08:36 »
Не се получава. Опитах с твоя код, но ми позволява да добавям 2 пъти едно и също при което даже прави количеството на абсолютно всички продукти равни на новодобавения продукт. Другото което е, когато добавя за пръв път продукт, той се записва в масива, но не се показва в количката, защото е с ключ 0 предполагам. Като ключ на масива е зададен уникалния номер на продукта, но вместо това масива си ползва 0,1,2,3,4 и т.н. Вече не се спира на 3 поне, но се налага да въведа 2 пъти един и същи продукт за да излезне с друг ключ различен от 0 и да се покаже в количката.

EDIT: при зададен $itemArray = array($id => array( първоначално добавя продукта с неговия уникален номер, но при добавяне на втори продукт вече в сесията е записано отново 0,1:

Array
(
    [0] => Array
        (
            [name] => Елемвитал с органичен йод
            [id] => 4
            [quantity] => 3
            [price] => 16.44
        )

    [1] => Array
        (
            [name] => Ритми на здраве
            [id] => 3
            [quantity] => 5
            [price] => 18.99
        )

)

В това положение, вместо да ми покаже тези 2 продукта, поради някаква странна причина ми изважда съвсем различен продукт който има уникален номер 1.

EDIT2: Ако си запазя оригиналния код който е : $_SESSION['cart_items'][$id]=$name; всичко работи нормално, масива има за ключ уникалния код и просто едно име. По този начин се добавят и махат лесно, но липсва допълнителна информация, като количество и т.н.

EDIT3: Ако използвам следния код: $_SESSION['cart_items'][$id] = array('id' => $id, 'quantity' => $quantity); всичко е нормално и няма скрити продукти, в масива уникалните ключове са както трябва и се взима количеството, но има само един проблем. Когат се въведе едно количество за даден продукт, то се причислява към всички останали.

EDIT4: Открих, че функцията array_merge() рестартира ключовете на масивите. Сега използвам $_SESSION["cart_items"] = $_SESSION["cart_items"] + $itemArray; и всичко е наред без количеството. Отново задава едно и също количество на всички продукти, вместо на всеки по отделно.

EDIT5: Благодаря за помощта, всичко е наред вече. Използвах foreach и просто листнах масивите вместо да си играя с намиране на уникалния код и бутане в заявка.
« Последна редакция: 01 Февруари 2016, 02:09:54 от 2SHAE »
"Screw you guys i am going home"