15

JobName 列を UNIQUE として定義する MySQL テーブルを扱っています。誰かがデータベースに既に存在する JobName を使用して新しいジョブをデータベースに保存しようとすると、MySQL は警告をスローします。

エラーのように、PHP スクリプトでこの警告を検出し、適切に処理できるようにしたいと考えています。理想的には、コードを分岐して処理できるように、MySQL がスローした警告の種類を知りたいです。

これは可能ですか?そうでない場合、MySQL にこの機能がないか、PHP にこの機能がないか、またはその両方が原因ですか?

4

8 に答える 8

13

警告を PHP にネイティブに「フラグ」を付けるには、mysql/mysqli ドライバーを変更する必要がありますが、これは明らかにこの質問の範囲を超えています。代わりに、基本的に、データベースに対して行うすべてのクエリをチェックして警告を確認する必要があります。

$warningCountResult = mysql_query("SELECT @@warning_count");
if ($warningCountResult) {
    $warningCount = mysql_fetch_row($warningCountResult );
    if ($warningCount[0] > 0) {
        //Have warnings
        $warningDetailResult = mysql_query("SHOW WARNINGS");
        if ($warningDetailResult ) {
            while ($warning = mysql_fetch_assoc($warningDetailResult) {
                //Process it
            }
        }
    }//Else no warnings
}

明らかに、これを大量に適用するには非常にコストがかかるため、いつ、どのように警告が発生するかを慎重に検討する必要があるかもしれません (警告を除去するためにリファクタリングする必要がある場合があります)。

参考までに、MySQL SHOW WARNINGS

もちろん、 の最初のクエリをSELECT @@warning_count省くことができます。これにより、実行ごとにクエリを節約できますが、完全を期すために含めました。

于 2008-09-06T17:00:05.270 に答える
4

まず、訪問者にMySQLエラーが表示されないように、警告をオフにする必要があります。次に、 を呼び出すときに、false が返されたかどうかを確認する必要があります。その場合は、何が問題なのかを調べるために電話してください。返された番号と、このページのエラー コードを照合してください。mysql_query()mysql_errno()

お探しのエラー番号は次のとおりです。

エラー: 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE)

メッセージ: 一意の制約のため、テーブル '%s' に書き込めません

于 2008-09-06T16:03:17.823 に答える
3
ini_set('mysql.trace_mode', 1)

あなたが探しているものかもしれません。

その後、PHP エラーはカスタム PHP エラー ハンドラーで処理できますが、通常はログ ファイルに記録されるため、PHP エラーの表示をオフにすることもできます (PHP 構成によって異なります)。

于 2011-11-07T02:01:59.593 に答える
0

mysqliステートメントエラー番号を使用して一意キー違反を検出できます。mysqliステートメントはエラー1062、つまりER_DUP_ENTRYを返します。エラー1062を探して、適切なエラーメッセージを出力できます。エラーメッセージの一部として列(jobName)も出力する場合は、ステートメントのエラー文字列を解析する必要があります。

  if($ stmt = $ mysqli-> prepare($ sql)){
            $ stmt-> bind_param( "sss"、
            $ name、
            $ identKey、
            $ domain);


            $ stmt-> execute();
            if($ mysqli->affected_rows!= 1){
                        //これはエラー番号1062を返します
                trigger_error('mysqlerror>>'。$stmt->errno。'::'。$stmt->error、E_USER_ERROR);
                exit(1);
            }
            $ stmt-> close();
        } そうしないと {

            trigger_error('mysqlerror>>'。$mysqli->errno。'::'。$mysqli->error、E_USER_ERROR);
        }
于 2009-05-30T05:19:22.420 に答える
0

警告の抑制に関する注意: 一般に、重要なものを見落としている可能性があるため、警告が表示されないようにすることはお勧めできません。なんらかの理由でどうしても警告を非表示にする必要がある場合@は、ステートメントの前に記号を付けることで、個別に非表示にすることができます。そうすれば、すべての警告レポートをオフにする必要はなく、特定のインスタンスに限定できます。

例:

 // this suppresses warnings that might result if there is no field titled "field" in the result
 $field_value = @mysql_result($result, 0, "field");
于 2011-02-20T17:24:26.693 に答える
0

あなたの状況には当てはまらないことがわかったerrno関数に関するものを削除するために更新されました...

MySQL で注意すべき forUPDATEステートメントの 1 つは、句が行と一致しmysqli_affected_rows()た場合でもゼロを返しますが、句が実際にデータ値を変更していないことです。これについて言及したのは、私がかつて見たシステムでその動作がバグを引き起こしたからです。プログラマーは、更新後にエラーをチェックするためにその戻り値を使用し、ゼロは何らかのエラーが発生したことを意味すると想定していました。更新ボタンをクリックする前に、ユーザーが既存の値を変更しなかったことを意味します。WHERESET

したがって、更新時に常に新しいタイムスタンプ値が割り当てられるテーブル内の列のmysqli_affected_rows()ようなものがない限り、使用してもそのような警告を見つけることはできないと思います。update_timeただし、そのような回避策はちょっと面倒に思えます。

于 2008-09-06T16:09:37.450 に答える
0

使用しているフレームワーク (存在する場合) に応じて、クエリを実行して自分でジョブ名を確認し、フォームの残りの検証でユーザーに適切な情報を作成することをお勧めします。

ジョブ名の数に応じて、フォームを含むビューに名前を送信し、javascript を使用して使用するものを伝えることができます。

これが意味をなさない場合、私の見解を要約すると、次のようになります。プログラムおよび/またはユーザーが違法なことをしようとし、エラーをキャッチして処理するように設計しないでください。エラーが発生しないようにシステムを設計する方がはるかに優れています。エラーは実際のバグに留めておいてください:)

于 2008-09-06T16:11:18.867 に答える
0

警告を取得することは可能であり、mysql よりも mysqli の方が効率的です。

プロパティ mysqli->warning_count の php.netのマニュアルページで提案されているコードは次のとおりです。

$mysqli->query($query);

if ($mysqli->warning_count) {
    if ($result = $mysqli->query("SHOW WARNINGS")) {
        $row = $result->fetch_row();
        printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
        $result->close();
    }
}
于 2010-01-08T19:00:19.063 に答える