sql >> データベース >  >> RDS >> Mysql

PDOPHPでクエリエラーを表示する方法

    エラーモード属性PDO::ATTR_ERRMODEをPDO::ERRMODE_EXCEPTIONに設定する必要があります。
    そして、prepare()メソッドによって例外がスローされることが予想されるため、PDO ::ATTR_EMULATE_PREPARES*機能を無効にする必要があります。 。それ以外の場合、MySQLサーバーは実行されるまでステートメントを「認識」しません。

    <?php
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    
        $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
    }
    catch(Exception $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
    }
    

    プリント(私の場合)

    Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
    1146 Table 'test.doesnotexist' doesn't exist"
    

    http://wezfurlong.org/blog/2006/apr/usingを参照してください-pdo-mysql /
    EMULATE_PREPARES =trueは、現在pdo_mysqlドライバーのデフォルト設定のようです。それ以降、クエリキャッシュは修正/変更されており、mysqlndドライバーではEMULATE_PREPARES =falseに問題はありませんでした(ただし、 php愛好家だけです、私の言葉を信じないでください...)

    *)次に、 PDO ::MYSQL_ATTR_DIRECT_QUERY -これら2つの属性の相互作用を(まだ?)理解していないことを認めなければならないので、次のように両方を設定します

    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
        PDO::ATTR_EMULATE_PREPARES=>false,
        PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
    ));
    


    1. Oracleストアドプロシージャ内の別のユーザーのテーブルへのアクセス

    2. Oracle 11g-低速の並列挿入選択を最適化する方法は?

    3. MySQL COUNT()–クエリによって返される行数を取得します

    4. T-SQLを使用してSQLServerデータベースの照合を変更する方法