2009-12-06 4 views
1

Когда пользователь покупает продукт (позволяет сказать, что у них есть 3 модели), и они набрали свою информацию, устройство автоматически переходит в базу данных со статусом = 0.добавить новый сессионный продукт - PHP

Если пользователь уходит из корзины, позволяет входить в обзор продукта (и покупать дополнительный продукт, теперь у них есть 4 продукта в корзине).

Мне нужно выяснить, как добавить новый продукт в базу данных, а не вставлять все продукты + новый, потому что 3 продукта уже вставлены.

$_SESSION['inserted_ids'] = array(); 
     $id = ''; 
     if(in_array($id, $_SESSION['inserted_ids'])){ 
      return; 
     }else{ 

      $id = $db->Insert("INSERT INTO orders SET 
         name = '". $_SESSION['information']['name'] ."', 
         address = '". $_SESSION['information']['address'] ."', 
         date = '". Database::Now() ."', 
         phone = '". (isset($_SESSION['information']['phone']) ? $_SESSION['information']['phone']:'') ."', 
         email = '". $_SESSION['information']['email'] ."', 
         city = '". $_SESSION['information']['city'] ."', 
         zipcode = '". $_SESSION['information']['zipcode']."' 
      "); 

      $_SESSION['inserted_ids'][] = (int) $id; 


       # lists products 
       $list = ''; 
       $grand_total = ''; 
       $res = $db->Execute("sql with product_id"); 
       while($row = $res->GetNext()){ 


        if($row['product_id'] == $_SESSION['inserted_ids']){ 
         $db->Execute("INSERT INTO order_lines SET 

              price   = '$round_price', 
              order_id  = $id, 
              product_id = $product_id, 
              product_name = '$product_name', 
              units   = '$grand_units', 
              status  = '0', 
              date   = '".Database::Now()."', 
              item_num  = '".$item_num."'; 

              ON DUPLICATE KEY UPDATE SET 
               units = '$grand_units' 

              WHERE order_id = $id 
              LIMIT 1; 
             "); 
        } 


        } 
     } 
+0

Вы дали нам неправильный пример кода? Потому что я не вижу часть, в которую продукт вставляется в вашу базу данных. Было бы бессмысленно, если бы вы снова ввели информацию о пользователе. – svens

+0

Хмм .. Установка вставленного флага в сеансе var может быть дешевым, но рабочим решением. – svens

ответ

2

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

Если вы не можете даже сделать это, а затем создать другой массив сеанса (назовем его inserted_ids), который содержит идентификаторы продуктов, которые были вставлены, и проверить, если product_id находится в inserted_ids массиве.

(Вы можете просто использовать in_array, для этого вам не нужно делать целый новый цикл).

Это должен быть ваш код:

$_SESSION[ 'inserted_ids' ] = array(); // execute this line before everything else.

if(in_array($id, $_SESSION[ 'inserted_ids' ]) { 
    return; 
} 
$id = $db->Insert("INSERT INTO orders SET 
       name = '". $_SESSION['information']['name'] ."', 
       address = '". $_SESSION['information']['address'] ."', 
       date = '". Database::Now() ."', 
       phone = '". (isset($_SESSION['information']['phone']) ? $_SESSION['information']['phone']:'') ."', 
       email = '". $_SESSION['information']['email'] ."', 
       city = '". $_SESSION['information']['city'] ."', 
       zipcode = '". $_SESSION['information']['zipcode']."' 
    "); 

$_SESSION['inserted_ids'][] = $id; 

     $res = $db->Execute("sql statment"); 
while($row = $res->GetNext()){ 

$db->Insert("INSERT INTO order_lines SET 

          price   = '$round_price', 
          order_id  = '".$id."', 
          product_id = '$product_id', 
          product_name = '$product_name', 
          units   = '$grand_units', 
          status  = '0', 
          date   = '".Database::Now()."', 
          item_num  = '".$item_num."' 
       "); 
      } 
+0

Я обновил код, не могли бы вы показать мне, как вставить код, как вы показываете в ответ? ... я полностью потерял: - / – william

0

Добавить UNIQUE ограничение на order_lines таблицу, а затем обновить эту строку, если дубликат найден:

ALTER TABLE order_lines ADD UNIQUE(order_id, product_id)

Затем при добавлении order_line используйте оператор ON DUPLICATE KEY UPDATE:

INSERT INTO order_lines SET 
price= 2.22, 
order_id= 2, 
product_id= 3, 
status = 0, 
... other columns ... 
ON DUPLICATE KEY UPDATE SET 
price= 2.22, 
grand_unit= 4, 
... other columns ... 
Смежные вопросы