2017-09-10 22 views
1

whileループでテーブルからデータを取得する際に少し問題があります。私がやりたいことは簡単ですtable cartからクッキー値を持つすべてのデータをtable ordersからクッキー値と照合テーブルカートに一致させて、カートテーブルのクッキー値と一致するデータを抽出してtable orders_finalThis is table cartに配置したいと考えています。今はThis is table ordersです今、最後の部分は、オーダーテーブルから得たクッキー値をカートテーブルを照会した後、私は今、そのクッキーの値に一致するすべてでorders_finalテーブルにデータを配置するため、カートTHE PROBLEM IS THAT IT ONLY INSERTS ONE VALUE INTO TABLE ORDERS_FINALからテーブルからデータを取得し、whileループから別のテーブルに挿入

$zomo = $_COOKIE['shopa']; // this is the cookie that is stored in the cart table and updated when the transaction is successful 
$get_products = "SELECT * FROM `cart` WHERE cookie_value = '$zomo'"; 
$limo = mysqli_query($con, $get_products); 

while($colo = mysqli_fetch_array($limo)){ 
    $product_id = $colo['product_id']; 
    $order_quantity = $colo['order_quantity']; 
    $cookie_value = $colo['cookie_value']; 
    //var $dance is when i update the table with data after payment and data gotten from my payment processing company 
    $dance = "UPDATE `orders` SET `status`='$r_status',`time`='$r_time',`date`='$r_date',`reference`='$r_reference',`transaction_status`='$r_transaction_status',`transaction_method`='$r_transaction_method',`final_price`='$r_final_price',`order_id`='$r_order_id',`currency`='$r_currency',`referrer`='$r_referrer' WHERE cookie_bought = '$zomo'"; 
    $uii = mysqli_query($con, $dance); 

    if ($uii){ 
     //this variable insert is where i want to insert all data gotten from cart table above and insert into orders_final, where order table holds the cookie value which was created during shopping which is cookie name shopa held in the variable zomo 
     $insert = "INSERT INTO `orders_final`(`product_id`, `cookie_value`, `trx_id`, `order_quantities`) VALUES ('$product_id','$zomo','$r_reference','$order_quantity')"; 
     $bena = mysqli_query($con, $insert);  

     if ($bena){ 
      $delc = "DELETE FROM `cart` WHERE cookie_value = '$zomo'"; 
      $tipee = mysqli_query($con, $delc); 

      if ($tipee){ 
       perform_success(); 
      } 
     }  
    } 
} 
+0

おそらく、代わりに 'INSERT INTO..SELECT'クエリを実行して、2つのクエリおよびループを回避することができます。コードを適切に字下げすると、読みやすくなります。 – Qirel

+0

あなたは何をしたいですか? –

+0

すでに** prepared statement **をサポートしているAPIを使用していますが、[SQL-injection](http://stackoverflow.com)からデータベースを保護するために、プレースホルダ付きのパラメータ付きクエリを準備する必要があります。/q/60174 /)! ['mysqli :: prepare()'](http://php.net/mysqli.prepare)と['mysqli_stmt :: bind_param()'](http://php.net/mysqli-stmt)から始めましょう。 .bind-param)。 – Qirel

答えて

1

より良いアプローチがにありますクエリを実行する回数が少なくなります。テーブル全体を選択し、それをループして最大3つのクエリを実行すると、(すぐに多くのクエリになります)では、代わりにINSERT INTO...SELECTクエリを使用できます。トランザクションを使用すると、変更をコミットする前にすべてが完了するようにすることもできます。したがって、正しく転送されなかったものを削除することはありません。

以下のコードは、クエリの量を3つに減らすように変更されています(ループされていません!)、プリペアドステートメントの使用が実装されています。

$stmt = $con->prepare("INSERT INTO orders_final (`product_id`, `cookie_value`, `trx_id`, `order_quantities`) 
              SELECT product_id, ?, order_quantity, ? 
              FROM cart 
              WHERE cookie_value=?"); 
$stmt->bind_param("sss", $zomo, $r_reference, $zomo); 
if ($stmt->execute()) { 
    $stmt->close(); 

    $stmt = $con->prepare("UPDATE orders 
          SET status=?, time=?, date=?, reference=?, transaction_status=?, 
           transaction_method=?, final_price=?, order_id=?, 
           currency=?, referrer=? 
          WHERE cookie_bought=?"); 
    $stmt->bind_param("sssssssssss", $r_status, $r_time, $r_date, $r_reference, $r_transaction_status, $r_transaction_method, $r_final_price, $r_order_id, $r_currency, $r_referrer, $zomo); 

    $dance = "UPDATE `orders` SET `status`='$r_status',`time`='$r_time',`date`='$r_date', 
    `reference`='$r_reference',`transaction_status`='$r_transaction_status',`transaction_method`='$r_transaction_method',`final_price`='$r_final_price',`order_id`='$r_order_id',`currency`='$r_currency',`referrer`='$r_referrer' WHERE cookie_bought = '$zomo'"; 

    $stmt = $con->prepare("DELETE FROM cart WHERE cookie_value=?"); 
    $stmt->bind_param("s", $zomo); 
    $stmt->execute(); 
    $stmt->close(); 
} 
関連する問題