0

私は、ユーザーがデータベースから取得した値を編集できるようにするPHPWebアプリケーションに取り組んでいます。ユーザーが「編集」リンクをクリックすると、フィールドにデータベース内のテーブルのデータが入力されます(存在する場合)。データがない場合は、すべてのフィールドが空白で表示されます。

ユーザーが「保存」をクリックすると、フォームがPOSTに送信され、それらの値が「UPDATE」クエリを使用してデータベースに保存されます。

「影響を受ける行」をチェックして、クエリの結果をチェックします。0に等しい場合、変更は行われず、ユーザーに通知します。

ただし、ユーザーが行にすでに含まれているのとまったく同じ値で更新すると、少し問題が発生します。

たとえば、A行には、それぞれ1、2、3、4の値を持つ列A、B、C、Dがあります。

ユーザーがその行を編集し、値1、2、3、4で送信した場合、行は影響を受けず、「更新」が実際に以前と同じで、ちょうど通過したときにクエリが失敗したという出力メッセージが表示されます大丈夫。

今、私は出力で立ち往生しています:

「更新された値が古い値と同じであるか、テーブルと列の名前に問題があります。ログを確認してください。」

このエラーに関するメッセージをログに送信します。次に、ユーザーが表示できるようにクエリを出力します。

問題は、エラーに関しては、プログラムが有益であることを望んでいるということです。行が元々成功していたものとまったく同じ更新をプログラムに分類させる方法はありますか?

        // construct query, execute query, check if any rows have been affected
    $query = "UPDATE table SET status='$status', client='$client' WHERE key='$key'";
    $result = $conn->query($query);
    if(mysqli_affected_rows($conn) === 0)
    {
        echo "Something went wrong. Entry not updated. Check the logs.\n";
        echo $query;
        error_log(mysqli_error($conn));
    }

$result === falseif条件内またはif条件内をチェックすることも考えまし$result === trueたが、それでうまくいくでしょうか?

どんな洞察も大歓迎です。

ありがとう!

4

1 に答える 1

1

-1クエリのエラーを確認する場合は、の代わりに確認できます0

mysqli_affected_rowsが返される場合は、値が変更されていないか、一致条件0がないために何も更新されていないことを意味します。WHEREこれら2つを区別する必要がある場合は、おそらく追加のSELECTクエリを実行する必要があります。

また、SQLインジェクションの問題を回避するには、バインドされた変数でプリペアドステートメントを使用する必要があります。

于 2012-11-16T17:04:16.467 に答える