2016-06-29 10 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

複数のレコードを挿入して途中で失敗すると、人がなぜ_transactions_ –

答えて

0

ループの最後の行で$結果を上書きします。

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

をサポートしているDBを使用しているのかが正確に実行された場合にのみ挿入クエリがtrueを返します。選択クエリと挿入クエリとの比較は想定されていません。 – Matt

+0

彼がそこで試していたことを混乱させました。 – earl3s

+0

を変更してから削除しました。彼がやっているのは、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クエリでSELECTクエリから最初の結果を上書きしています。

$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 
} 
関連する問題