Инвентаризация моей базы данных начинается с 28? - PullRequest
0 голосов
/ 24 ноября 2018

Я новичок в кодировании и в моем коде, и у меня возникают проблемы при обновлении базы данных.Я использую mysql и php для создания корзины покупок, которая обновляет инвентарь при покупке предмета.Корзина берет идентификатор продукта товара и сохраняет его с помощью массива GET.Проблема в том, что после того, как кто-то покупает предмет, инвентарь не изменяется в моей базе данных.счет инвентаря всегда начинается с 28 каждый раз, когда я покупаю предмет, а не с нужного количества.Код для корзины покупок:

require 'connect.php';
require 'item.php';
  if(isset($_GET['id'])){
  $result = mysqli_query($con, 'select * from products where 
  id='.$_GET['id']);
  $products = mysqli_fetch_object($result);
  $item = new Item();
  $item->id = $products->id;
 $item->name = $products->name;
  $item->price = $products->price;
  $item->quantity = 1;
  $_SESSIONS['id']=$_GET['id'];
  // Check if the products exists in the cart
  $index = -1;
  $cart = unserialize(serialize($_SESSION['cart']));
 for($i=0; $i<count($cart); $i++)
  if($cart[$i]->id==$_GET['id'])
  {
  $index = $i;
  break;
  }
if($index==-1)
 $_SESSION['cart'][] = $item;
else{
$cart[$index]->quantity++;
$_SESSION['cart'] = $cart;
}

}

// Delete products in cart
if(isset($_GET['index'])){
  $cart = unserialize(serialize($_SESSION['cart']));
  unset($cart[$_GET['index']]);
  $cart = array_values($cart);
  $_SESSION['cart'] = $cart;
  }  

 if(array_key_exists('submit2', $_POST))
   {  
 $results = mysqli_query($con, "select * from products"); 
 $sql="";//init
 while($products=mysqli_fetch_object($results)){

 for($i=0; $i<count($cart); $i++){    
 $idcart=$cart[$i]->id;
 $quantity= $products->quantity;
 $cartquantity = $cart[$i]-> quantity;
 $sql= "UPDATE products SET quantity='$quantity' - ".$cartquantity." WHERE id='$idcart';";//u need this to append the query
session_destroy(); }//end for
}//end while
if ($con->multi_query($sql) === TRUE) {//use multi_query
header("location: thankyou.php");
} else {
echo "Error updating record: " . $con->error;
}
 $con->close();

Я считаю, что проблема в этом коде здесь.$ sql = "ОБНОВЛЕНИЕ продуктов SET кол-во = '$ количество' -". $ cartquantity. "ГДЕ id = '$ idcart';" ;.Любая помощь будет оценена.Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вся логика обновления количества корзин кажется необычной.У вас есть цикл, который проходит по всем продуктам, а затем обновляет каким-то образом связанную запись базы данных на основе идентификатора из корзины с количеством из продукта.Не предпринимается попытка сопоставить количество из идентификатора продукта с идентификатором из корзины.

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

if(array_key_exists('submit2', $_POST))
{
    $sql = "UPDATE products 
                SET quantity = quantity - ?  
                WHERE id= ?";
    $stmt = $conn->prepare($sql);
    foreach ( $cart as $item ){
        $stmt->bind_param('ii', $item->quantity, $item->id );

        $stmt->execute();
    }//end foreach
    session_destroy();
}//end if
0 голосов
/ 24 ноября 2018

Вы забыли объединить свой SQL-запрос с несколькими запросами в строке с этим кодом:

$sql= "UPDATE products SET quantity='$quantity' - ".$cartquantity." WHERE id='$idcart';"

Пожалуйста, поместите оператор concat так:

$sql .= "UPDATE products SET quantity='$quantity' - ".$cartquantity." WHERE id='$idcart';"

Или вот так:

$sql= $sql."UPDATE products SET quantity='$quantity' - ".$cartquantity." WHERE id='$idcart';"

Я заметил, что вы выполняете обновление SQL после цикла, что нормально, но без конкатенации вы выполняете только последний запрос в цикле.

0 голосов
/ 24 ноября 2018

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

$sql = "UPDATE products SET quantity= quantity - ?  WHERE id= ? ;"
$stmt = $con->prepare($sql);
$stmt->bind_param('ii', $cartquantity, $idcart, );

$stmt->execute();
...