3

カスタム テーブルにデータを挿入しようとして失敗したときに mysql がスローするエラーを表示するにはどうすればよいですか?

たとえば、以下のコードは、SQL エラーで失敗するはずです。

$insert = "some insert sql statement that will fail";

$myquery = $modx->query($insert);

    if(!$myquery){

        echo 'error occurred! <br>';

    }

エラーの実際の内容を返すにはどうすればよいですか [つまり、列の不一致、一意の ID が存在するなど]?

4

2 に答える 2

3

xPDO Getting Started guideの例に基づくと、$modxこのコンテキストではクラス拡張のように見えPDO、結果のリソース オブジェクトはオブジェクト$myqueryである可能性がありPDOStatementます。

$modxしたがって、通常の PDO オブジェクトの場合と同様に、例外エラー モードをオンに設定できます。

$modx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

失敗時にエラーをスローするように強制します。デフォルトでは、PDO はサイレントにエラーを出します。そのエラー モードはここに記載されています

訂正: xPDO ソースを見ると、拡張 されていませんが、プロパティとしてオブジェクトPDOが含まれており、PDOPDO メソッドを実装して、それらを接続プロパティに渡しています。したがって、setAttribute()呼び出しは基になるPDOオブジェクトに渡され、それに応じて機能するはずです。

xPDO コンストラクターは、通常の PDO コンストラクターから機能をわずかに拡張し、後でエラー モードを設定するのではなく、5 番目のパラメーターでオプションの配列を受け入れますsetAttribute()

$xpdo = new xPDO($dsn, $user, $password, [], [PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);

どの方法を選択して設定しても、コードをブロックでラップして、エラー時try/catchにタイプの例外をキャッチできます。PDOException

    try {
      $insert = "some insert sql statement that will fail";
      $myquery = $modx->query($insert);
   }
    catch (PDOException $e) {
      echo 'error occurred! ' . $e->getMessage() . '<br>';
    }

もっと単純に errormode を に設定することもできます。その場合PDO::ERRMODE_WARNING、PHP は代わりにE_WARNINGメッセージを発行するだけで、例外とは異なり、致命的ではありません。

xPDO で簡単なテストをセットアップすることで、これらすべてが期待どおりに機能することを確認できました。

于 2014-12-25T22:05:38.723 に答える
2

カスタム XPDO リクエストを追跡するための少し簡単な方法があります。

$c = $modx->newQuery('modResource');
$c->where(array(
    'id1' => 1
));

// print request for control
print_r($c->toSQL());

$s = $c->prepare();
$s->execute();

print_r($s->errorInfo());

実行後、エラーをキャッチできます。

Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'modResource.id1' in 'where clause' )

これはすべて、xpdo が pdo を使用し、その助けを借りて実行を制御するためです。xpdo ソースからのいくつかのコード:

/**
 * @see http://php.net/manual/en/function.pdo-errorinfo.php
 */
public function errorInfo() {
    if (!$this->connect()) {
        return false;
    }
    return $this->pdo->errorInfo();
}
于 2014-12-26T10:11:20.417 に答える