0

私はいつも、PHP INSERT/UPDATEコードのかなり基本的な概念に苦労してきました。INSERT / UPDATEのたびに影響を受ける行の数を常にチェックする必要があります。これは、ほとんどの場合、INSERT / UPDATEを1つしか実行しておらず、影響を受ける行が1つだけであることを確認することで修正されるよりも多くの問題が発生するように見えるためです。 。

以下は、INSERT / UPDATEを実行するための標準コードです。影響を受ける行が0になるため、ユーザーが何も変更せずにレコードを更新すると、このコードは失敗します。少なくとも1つのフィールドが変更されていることを確認するコードを記述できますが、大きなフォームではこれは非常に不格好なようで、とにかくこの番号をチェックしてエラーを実際に見つけたことがないので、本当に価値があるかどうか疑問に思っていました。

<?php
        $whereSql = '';
        $groupSql = 'INSERT INTO';

        if(isset($_POST['id']) && is_numeric($_POST['id'])){
            $groupSql = 'UPDATE';
            $whereSql = 'WHERE id = ' . $_POST['id'];
        }

        $groupSql .= ' sometable SET name="' . $name . '" ' . $whereSql;

        $groupDb = mysqli_query($groupSql, $dbObject) or die("Login DB error:".mysql_error());

        if(mysqli_affected_rows($dbObject) == 1){
            //redirect
        }else{
            die('System Error');
        }  
4

2 に答える 2

4

クエリの戻り値を確認する必要があります。行に影響を与えない/行を返さないselect/updateクエリは、エラー状態ではなく、単に空の結果セットであるか、たまたま何にも影響を与えなかった更新です。

$result = mysql_query($sql) or die(mysql_error());
                            ^^^^^^^^^^^^^^^^^^^^^

一致するユーザー名の存在をチェックするユーザーサインアップシステムについて考えてみます。

SELECT id FROM users WHERE username='foo';

ユーザーfooが存在しない場合、システムはバーフし、エラーが発生したと主張します。しかし、空の結果セットはエラーではありません。これは単に、ユーザー名がユーザーに利用可能であることを意味します。

成績を処理するシステムについても同じです。

UPDATE students SET failed=true WHERE score < 50;

影響を受ける行を0にすることは、失敗ではありません。それは単にすべての学生が合格したことを意味します。

于 2013-03-20T14:31:10.407 に答える
1

クエリが失敗したかどうかを確認し、失敗した場合は、影響を受ける行が複数あるかどうかを確認することをお勧めします。

$groupDb = mysql_query($groupSql, $dbObject);
if (false === $groupDb) {
    die("Login DB error:".mysql_error())
if (mysql_affected_rows($dbObject) > 1) {
    die('System Error: failed to ' . $action . ' a  document Group');
} else {
    //redirect
}

この方法では、クエリが成功した場合、および影響を受けた行が2つ未満の場合にのみリダイレクトします(それが重要な場合)。

于 2013-03-20T14:31:40.333 に答える