-1

私はPDOにかなり慣れていません。何かが存在しない、つまりテーブルのときにエラーをキャッチして表示するトライアンドキャッチがあります。

ただし、SQL 失敗コマンドのエラー メッセージ/原因を表示するにはどうすればよいですか。

以下の例では、「有効」という単語を小さな int 列に挿入しようとしましたが、空白の画面しか表示されず、自分でデバッグする必要がありました。SQL 失敗エラー メッセージを表示するにはどうすればよいですか?

$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// set/get variables
$id = (isset($_GET['id']) === true) ? $_GET['id'] : die("ID not set") ; // ? : shorthand if else
$action = (isset($_GET['action']) === true) ? $_GET['action'] : die("Action not set") ; // ? : shorthand  if else


// query
$query = $db->prepare(" UPDATE `telephoneCountries` SET `enabled`= :action  WHERE `id` = :id ");


// bind parameters - avoids SQL injection
$query->bindValue(':id', $id);
$query->bindValue(':action', $action);

// try... if not catch exception
try {
    // run the query
    $query->execute();
}
catch (PDOException $e){
    //sendErrorMail($e->getMessage(), $e->getFile(), $e->getLine());
    echo $e->getMessage();
    echo $e->getFile();
    echo $e->getLine();
}
4

1 に答える 1

6

「有効」という単語を小さなint列に挿入しようとしていました

mysql にはかなり問題ありません。0 が挿入されます。

SQL 失敗コマンドのエラー メッセージ/原因を表示するにはどうすればよいですか。

実際のエラーについては、表示するように PHP をセットアップするだけです。

ini_set('display_errors',1);

そのため、キャッチされていないすべての例外を確認できます。

また、エラー メッセージを表示するだけで、エラー自体を処理しない場合は、try..catch をまったく使用しないでください。PHPはすでにすべての仕事をしています。それがポイントです。

ほとんどの人は、エラー報告とエラー処理を混同しています。後者を前者に使用するべきではありません。エラーメッセージを処理するときの唯一の目標は、PHP にエラー メッセージを表示させ、適切な送信先を設定することです。

  • 開発サーバーでは、エラー メッセージを画面に表示する必要があります
  • ライブサーバーでは表示されるべきではありませんが、代わりにログに記録されます。

これらすべての try-catch ブロックがなくても、いくつかの ini 設定または単一のエラー ハンドラー関数 (他の回答で言及した) を使用して、エラー メッセージ (非例外を含む) を制御できます。

たとえば、別のサーバーに接続する場合など、エラー自体を処理する場合にのみ、try..catch を使用してください。

だから、あなたの質問にもっと詳しく答えるには:

  1. PDO を例外モードに設定します。すでに完了しています。
  2. エラー メッセージのみを処理する try..catch ブロックをすべて削除します。
  3. 上記の ini ディレクティブを使用して、開発サーバーでエラーを表示するように PHP をセットアップします。
  4. 稼働中のサーバーでは、エラーを電子メールで送信する代わりにログに記録することを強くお勧めします。それでもこの方法が必要な場合は、数百の try..catch ブロックの代わりに、単一のカスタム例外ハンドラー関数を使用してメールを送信します
于 2013-03-19T14:30:10.880 に答える