2017-04-17 15 views
-1

私はこのようなPHPのmysqlで複数の行を更新するいくつかのコードを持っています。PHP mysqlで複数の行を更新するには

<?php 

$idOrder = $_GET['idOrder']; 

$conn = new MySQLi('localhost','root','','project_ecommerce'); 

$query_select = "SELECT status FROM order_product WHERE id_order='".$idOrder."'"; 
$sql_select = $conn->query($query_select); 
$result_select = $sql_select->fetch_assoc(); 
$status =''; 

if ($result_select['status'] == 0) { 
    $status .= 1; 
}else{ 
    $status .= 0; 
} 

$query_update = "UPDATE order_product SET status='".$status."' WHERE id_order='".$idOrder."'"; 
$sql_update = $conn->query($query_update); 

if ($sql_update == TRUE) { 

    $query_select_product = "SELECT order_product.id_product AS ID_PRD, order_product.status AS STATUS, order_product.qty AS QTY_ORD, products.stock AS STOCK FROM order_product JOIN products ON order_product.id_product = products.id_product WHERE order_product.id_order ='".$idOrder."'"; 
    $sql = $conn->query($query_select_product); 
    $result = $sql->fetch_all(MYSQLI_ASSOC); 
    $stock_update=''; 

    for ($i=0; $i < count($result); $i++) { 

     if ($result[$i]['STATUS'] == 0) { 

      $stock_update .= ($result[$i]['STOCK']+$result[$i]['QTY_ORD']); 

     }else{ 

      $stock_update .= ($result[$i]['STOCK']-$result[$i]['QTY_ORD']); 

     } 

     $update_product = "UPDATE products SET stock='".$stock_update."' WHERE id_product='".$result[$i]['ID_PRD']."'"; 
     $sql_update_product = $conn->query($update_product); 

    } 

} 

echo $idOrder; 
?> 

status1に更新した場合、私は、このような結果を与える:

+----------------+-------+ 
| id_product  | stock | 
+----------------+-------+ 
| PRD-0416-17-1 | 100 | 
| PRD-0416-17-10 | 100 | 
| PRD-0416-17-11 | 98 | 
| PRD-0416-17-12 | 9898 | 
+----------------+-------+ 

そしてstatus0に更新されている場合私はこのような結果を与える:私はそれを修正するにはどうすればよい

+----------------+---------+ 
| id_product  | stock | 
+----------------+---------+ 
| PRD-0416-17-1 |  100 | 
| PRD-0416-17-10 |  100 | 
| PRD-0416-17-11 |  100 | 
| PRD-0416-17-12 | 1009900 | 
+----------------+---------+ 

+5

あなたのコードはに対して脆弱である[** SQLインジェクション攻撃**](https://en.wikipedia.org/wiki:

if ($result[$i]['STATUS'] == 0) { $stock_update = ($result[$i]['STOCK']+$result[$i]['QTY_ORD']); }else{ $stock_update = ($result[$i]['STOCK']-$result[$i]['QTY_ORD']); } 

この全体の事は、単一のクエリで行うことができます/ SQL_injection)。 [** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)または[** PDO **](https://secure.php.net/)を使用してください。 manual/en/pdo.prepared-statements.php)は、[** this post **](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql - インジェクション - イン - php)。 –

+2

あなたの割り当てで '。='を使用しているので、ある行の値を前の行の値に連結しています。 – Barmar

+0

@AlexHowanskyは –

答えて

2

これらの割り当てでは、.=を使用しています。前の行の結果を前の値の$stock_updateに連結します。それらはちょうど=であるべきです。

UPDATE order_product AS o 
JOIN product AS p ON o.id_product = p.id_product 
SET o.status = NOT o.status, 
    p.stock = IF(o.status = 0, p.stock + o.qty_ord, p.stock - o.qty_ord) 
WHERE o.id_order = $idOrder 
+0

ありがとう@Barmar –

関連する問題