4

PDOを使用するのは初めてですが、クエリステートメントのエラーによる例外が適切にキャッチおよび表示されていないことがわかりました。これが発生したときのページ出力は、通常、次のようになります。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: ...

次の関数を使用してPDOクエリを作成します。

/**************************************************************************************************************
* Function: makeQuery                                                                                         *
* Desc: Makes a PDO query.                                                                                    *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed.         *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped.   *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
    try 
    {
        $stmt->execute($array);
    }
    catch (PDOException $e) 
    {
        print $errMsg != ''?$errMsg:"Error!: " . $e->getMessage() . "<br/>";
        die();
    }
}

例外がキャッチされない理由はありますか?

編集:これは私がPDOオブジェクトを作成する方法です:

function createPDO()
{
    // MySQL connection details
    $dbhost = '';
    $dbuser = '';
    $dbpass = '';
    $dbname = '';

    try
    {
        $db = new PDO("mysql:$dbhost=localhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch (PDOException $e)
    {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }

    return $db;
}
4

2 に答える 2

2

例外をキャッチしているファイルが名前空間を使用している可能性はありますか?その場合、次のようになります。

catch (\PDOException $e)

または追加:

use PDOException;

ファイルの先頭

于 2012-07-09T22:59:45.500 に答える
1

すべてのクエリがその関数を介して実行されていることを確認しますか?コードを調べて100%確実である可能性があります。

もう1つのオプションは、グローバル例外ハンドラーを定義してから、スローされた例外に、それがどの行とファイルから来たかを尋ねることです。

http://php.net/manual/en/function.set-exception-handler.php

function exception_handler($exception)
{
  echo "Uncaught exception: " . $exception->getMessage() . PHP_EOL;
  echo "In file: " . $exception->getFile() . PHP_EOL;
  echo "On line: " . $exception->getLine() . PHP_EOL;
}

set_exception_handler('exception_handler');

編集:OPを使用したダイアログの後、PDOStatement :: prepareの呼び出しで例外がスローされることが確実になりました。したがって、ライブラリにさらに別のラッパー関数をお勧めします。

function prepareStmt(PDO $oPdo, $sStmt, array $aDriverOptions=array())
{
  try
  {
    return $oPdo->prepare($sStmt, $aDriverOptions);
  }
  catch(PDOException $e)
  {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
  }
}
于 2012-07-09T22:22:50.060 に答える