2016-06-29 4 views
-2

Этот PHP-код вставляет только первую строку и возвращает ошибку: вызовите функцию-член fetch_assoc() для не-объекта. Пожалуйста, помогите.PHP Вставляет только первую строку

$sqlquery = "SELECT * FROM shopcart WHERE UserID='$Useremail'"; 
    if(!$result = $db->query($sqlquery)) die ('Error getting Food Information ['.$db->connect_error.']'); 
    $result = $db->query($sqlquery); 

    while($row = $result->fetch_assoc()){ 
     //echo $row['name']; 
     $name= $row['name']; 
     $productid = $row['ProductID']; 
     $initialPrice = $row['InitialPrice']; 
     $qty = $row['Quantity']; 



     //insert into to ordereditems 
     $sql = "INSERT INTO ordereditems (OrderID, ProductName, ProductID, Quantity, SalesPrice) 
     VALUES ('$orderid', '$name', '$productid','$qty','$initialPrice')"; 
     if(!$result = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); 

    } 
+1

Вы переписываете переменную '$ result' своим запросом на вставку. Измените его на '$ result2' или что-то в этом роде. – Matt

+0

Вставка нескольких записей и провал на полпути ... это _exactly_, почему люди используют базы данных, поддерживающие _transactions_ –

ответ

0

В последней строке цикла вы перезаписываете $ result.

if(!$result = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); 

Должно быть:

if(!$result2 = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); 
+1

Запрос вставки просто возвращает true, если он успешно выполнен. Не должно быть сравнения между запросом запроса и вставкой. – Matt

+0

Смутил то, что он пытался там. – earl3s

+0

удалил downvote, так как вы его изменили. Все, что он делает, это вставить в цикле, используя записи из запроса select, и оператор if существует в случае сбоя вставки. Никакого сравнения не происходит :). – Matt

0

Ваша операция вставки перезаписывает переменную $result. Измените его другим именем, как следует:

if(!$result2 = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); 
2

Вы громить ваш $result:

$sqlquery = "SELECT * FROM shopcart WHERE UserID='$Useremail'"; 
    if(!$result = $db->query($sqlquery)) die ('Error getting Food Information ['.$db->connect_error.']'); 
    $result = $db->query($sqlquery); 
    ^^^^^^--- your first query 

    if(!$result = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); 
     ^^^^^^-kill the first query result, replace with new result 

И заметьте, что вы уязвимы для sql injection attacks, и весь этот код мог бы тривиальным быть заменен один insert into ... select from ... запрос.

0

Вы перезапись первоначальный результат запроса на выборку с запросом INSERT. Вот исправленный код:

$sqlquery = "SELECT * FROM shopcart WHERE UserID='$Useremail'"; 
if(!$result = $db->query($sqlquery)) die ('Error getting Food Information ['.$db->connect_error.']'); 
//$result = $db->query($sqlquery); // NOT NEEDED AS ALREADY EXECUTED AND ASSIGNED in the IF statement above 

while($row = $result->fetch_assoc()){ 
    //echo $row['name']; 
    $name= $row['name']; 
    $productid = $row['ProductID']; 
    $initialPrice = $row['InitialPrice']; 
    $qty = $row['Quantity']; 

    /* 
    instead of assigning these variables manually you could also use: 

    extract($row); 

    this would convert name, ProductID, InitialPrice and Quantity to local variables $name, $ProductID, $InitialPrice and $Quantity. However make sure the db result does not contain key "result" as it would overwrite your $result object again :) 
    */ 


    //insert into to ordereditems 
    $sql = "INSERT INTO ordereditems (OrderID, ProductName, ProductID, Quantity, SalesPrice) 
    VALUES ('$orderid', '$name', '$productid','$qty','$initialPrice')"; 

    //if(!$result = $db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); // this is what overwrites $result and the next while check throws an error you just got 
    if(!$db->query($sql)) die('There was an error Processing Order Again [' . $db->error . ']'); //here's the fixed version, $db->query for insert does not return an object but boolean (true/false) so no need to assign it to a $result variable 
} 
Смежные вопросы