web-dev-qa-db-ja.com

PHP PDO。クエリが正しい場合のエラー番号 '00000'

私は以下のコードを持っています:

$sql3 = "update news set date='$time' where id='2'";
$sql3 = $connect->exec($sql3);
if(!$sql3)
{
    print_r($connect->errorInfo());
    $error = $connect->errorInfo();
    die ("Error: (".$error[0].':'.$error[1].') '.$error[2]);
}

スクリプトを実行すると、エラー番号「00000」が表示されることがあります。つまり、IFの紹介です。そしてそれはすべてランダムです。出力(時々):

Array ( [0] => 00000 [1] => [2] => )

この問題を解決するにはどうすればよいですか?
PS:スクリプトは毎回正しく実行されます。

26

PDOエラーコード00000は、すべてが正常に機能することを意味します。エラーチェックコードが表示されるのは、$sql3が0を返し(行に影響がなかった)、PHPがそれをfalseと評価するためです。明示的にreturn false;

if($sql3 === false)
35
SomeKittens

Execが行を更新しない場合は、0を返します。これにより、if(!$ sql3)がfalseと評価されます。代わりにこれを行う必要があります。

if($sql3 === false){

}
7
Oussama

私の経験では、正しくないクエリ(構文エラー)と失敗したクエリ(たとえば、何も挿入しなかったINSERT)が誤ってエラーコード00000を返す場合があります。先に進んで、SQLコンソールで完全なクエリを実行してみてください。なぜ失敗したのか。しかし、なぜ適切なエラーメッセージが返されないのか本当にわかりません。ここに私たちが使用するコードのスニペットがあります

    $r = $pdo->prepare($sql);
    if (!$r->execute($input_parameters)) { # query failed
        if ($bLogFailures) {
            error_log('query failed: ERROR['.$pdo->errorCode().':'.print_r($pdo->errorInfo(), true).'] QUERY['.$sql.']');
        }
        return false;
    }
3
Collector

PDO :: execステートメントは、影響を受けた行の数を示す整数を返します。したがって、特定のケースでは、SomeKittensが示すように、影響を受ける行が0の場合、エラーコードがトリガーされます。

ただし、クエリが機能したかどうかが気になる場合は、PDO :: execの代わりにPDO :: query(コードの観点から($ returnObj = $ connect-> query($ sql3))を使用することをお勧めします。

次に、$ returnObjをチェックして、SQL実行にエラーがあったかどうかを確認し、SQLクエリのトラブルシューティングを行うことができます。これにより、エラーの内容と場所がわかります。

これを行う最善の策は次のとおりです。

//set PDO to throw an error so you can wrap the query in a try / catch block. 
$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql3 = "update news set date='$time' where id='2'";
try {
     $returnObj = $connect->query($sql3);
} catch (PDOException $e) {
    print_r($returnOjb->errorInfo());
    $error = $returnObj->errorInfo();
    die ("Error: (".$error[0].':'.$error[1].') '.$error[2]);
}
2
Bryan Teague

私のphpプロジェクトで同様の状況が発生しました-データベースのフィールドを定義する列がタイプENUM('0', '1')および制限NOT NULL。 PHPスクリプトがNULLではなく '0'を配置するように変更した後、エラーが発生しました。


さらにコーディングを行うと、状況がさらにわかりやすくなりました-1つのDBトランザクション内で複数のPDOステートメントを実行していましたが、実際のエラーが3番目のPDOステートメントで発生している間に実行された最初のPDOステートメントのみに基づいて(例外処理ブロックで)エラーをチェックしていました。

1
user4065635

00000は、正常に機能することを意味します。 ifをこれに変更する必要があります:$sql3 === false

1
s.naseri

私も同じ問題を抱えていました。それも私をたくさん拷問しましたが、最終的にそれを理解しました。

テーブルに7列があるとします。

あなたはデータを4に挿入していますそれらのです。

残りの場合デフォルト値は設定されていません(たとえばNULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc.)その後、上記の問題が発生します。

これらの7つの列すべてまたはにデータを挿入する場合、デフォルト値のある列の少なくとも設定されていません、エラーは発生せず、データが挿入されます。

0
bantya