web-dev-qa-db-ja.com

PDOエラーメッセージ?

ここに私のコードのスニペットがあります:

$qry = '
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table
    WHERE description LIKE "%:search_string%"
    AND available = "yes"
    ON DUPLICATE KEY UPDATE score = score + 40
';
$sth = $this->pdo->prepare($qry);
$sth->execute($data);

print_r($this->pdo->errorInfo());

テーブルが存在しないため、これによりエラーが発生します。私が得るすべてはこれです:

配列([0] => 00000)

問題をデバッグできるように、エラーのより良い説明を取得するにはどうすればよいですか?

36
JD Isaacks

代わりにこれを試してください:

print_r($sth->errorInfo());

準備する前にこれを追加します。

$this->pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

これにより、PDOエラー報告タイプが変更され、PDOエラーが発生するたびに警告が出力されます。 errorInfoを設定する必要がありますが、追跡するのに役立ちます。

90
Alan Geleynse

古いスレッドですが、おそらく私の答えが誰かを助けるでしょう。最初にクエリを実行し、次にエラー変数を設定してから、そのエラー変数配列が空かどうかを確認して解決しました。簡略化された例を参照してください。

$field1 = 'foo';
$field2 = 'bar';

$insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)");
$insert_QUERY->bindParam(':field1', $field1);
$insert_QUERY->bindParam(':field2', $field2);

$insert_QUERY->execute();

$databaseErrors = $insert_QUERY->errorInfo();

if( !empty($databaseErrors) ){  
    $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print
    $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc...         

/* 
 $errorLogMsg will return something like: 
 error info:  
 Array(
  [0] => 42000
  [1] => 1064
  [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table bogus(field1, field2) VALUES                                                  ('bar', NULL)' at line 1
 )
*/
} else {
    # no SQL errors.
}
4
lumonald

この投稿は古すぎるかもしれませんが、これを見て回っている人への提案として役立つかもしれません:

 print_r($this->pdo->errorInfo());

PHP implode()関数を使用:

 echo 'Error occurred:'.implode(":",$this->pdo->errorInfo());

これにより、SQLユーザーインターフェイスを使用している場合に通常取得するエラーコード、詳細なエラー情報などが出力されます。

それが役に立てば幸い

3
Vikram

マニュアルから:

データベースサーバーがステートメントの準備に成功すると、PDO :: prepare()はPDOStatementオブジェクトを返します。データベースサーバーがステートメントを正常に準備できない場合、PDO :: prepare()はFALSEを返すか、エラー処理に応じてPDOExceptionを発行します。

Dbがステートメントを準備できないため、prepareステートメントがエラーを引き起こした可能性があります。クエリを準備した直後に実行する前に、エラーのテストを試してください。

$qry = '
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table
    WHERE description LIKE "%:search_string%"
    AND available = "yes"
    ON DUPLICATE KEY UPDATE score = score + 40
';
$sth = $this->pdo->prepare($qry);
print_r($this->pdo->errorInfo());
2
thetaiko