0

テーブル内の複数のレコードを更新しようとしているので、最後のレコードのみが更新されるため、このスクリプトに何か問題があるかどうか疑問に思っています。これは完全なコードですhttp://pastie.org/5453954

 for ($i = 0; $i < count($_POST['id_servtype']); $i++){

    $servtype = $_POST['id_servtype'][$i];    
    $project = $_POST['id_project'][$i];
    $quantity = $_POST['tableQuantity'][$i];
    $pus = $_POST['tablePus'][$i];
    $puc = $_POST['tablePuc'][$i];
    $totalitem = $_POST['tableTotal'][$i];

    $sql = "update sales_order_items
    set
    id_project=?,
    id_service_type=?,
quantity=?,
    unit_price_no_tax=?,
    unit_price=?,
    total_item_imp=?
    where
    id_so=?
    and
    id_soitems=?
    ";

    $stmt = $this->dbh->prepare($sql);
    $stmt->bindValue(1, $project, PDO::PARAM_INT);
    $stmt->bindValue(2, $servtype, PDO::PARAM_INT);
    $stmt->bindValue(3, $quantity, PDO::PARAM_STR);
    $stmt->bindValue(4, $pus, PDO::PARAM_STR);
    $stmt->bindValue(5, $puc, PDO::PARAM_STR);
    $stmt->bindValue(6, $totalitem, PDO::PARAM_STR);
    $stmt->bindValue(7, $_POST["id"], PDO::PARAM_STR);
    $stmt->bindValue(8, $_POST["iditem"], PDO::PARAM_STR);
    $stmt->execute();

    }

    echo("Correct edition");
4

1 に答える 1

1

ロジックに問題があります。WHERE句で使用される値は常に同じであるため、新しい値を使用するたびに、常にすべてのレコードを更新しています。
論理的には、スクリプトが終了すると、最後の更新のみが表示され、以前のすべての更新が上書きされます。簡単な例:

$newVals = array(1,2,3);
while($val = array_shift($newVals))
{
    $query = 'UPDATE myDB.tbl SET someField = :val WHERE id = 1';
    $stmt = $pdo->prepare($query);
    $stmt->execute(array('val' => $val));
}

書くことと同じです:

UPDATE myDB.tbl SET someField = 1 WHERE id = 1;
UPDATE myDB.tbl SET someField = 2 WHERE id = 1;
UPDATE myDB.tbl SET someField = 3 WHERE id = 1;

したがって、ID 1のレコードは、最後の更新を元に戻すたびに、合計3回更新されます。

于 2012-11-29T18:03:06.640 に答える