Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 未捕获PDO异常_Php_Mysql_Pdo_Error Handling - Fatal编程技术网

Php 未捕获PDO异常

Php 未捕获PDO异常,php,mysql,pdo,error-handling,Php,Mysql,Pdo,Error Handling,我不熟悉使用PDO,我发现由于查询语句中的错误导致的异常没有被正确捕获和显示。发生这种情况时,页面输出通常如下所示: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: ... 我使用以下函数进行PDO查询: /*******************************************************************************************

我不熟悉使用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();
    }
}
/**************************************************************************************************************
*函数:makeQuery*
*Desc:进行PDO查询*
*前提条件:必须传递语句/查询和命名参数数组(可能为空)*
*Post条件:执行PDO查询。捕获、显示异常,并停止页面执行*
**************************************************************************************************************/
函数makeQuery($stmt,$array,$errMsg='')
{
尝试
{
$stmt->execute($array);
}
捕获(PDO$e)
{
打印$errMsg!=''?$errMsg:“错误!:”$e->getMessage()。“
”; 模具(); } }
知道为什么没有捕捉到异常吗

编辑:这是我创建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;
}
函数createPDO()
{
//MySQL连接详细信息
$dbhost='';
$dbuser='';
$dbpass='';
$dbname='';
尝试
{
$db=new PDO(“mysql:$dbhost=localhost;dbname=$dbname;charset=utf8”、$dbuser、$dbpass、数组(PDO::ATTR\u EMULATE\u PREPARES=>false,PDO::ATTR\u ERRMODE=>PDO::ERRMODE\u EXCEPTION));
}
捕获(PDO$e)
{
打印“错误!:”$e->getMessage()。“
”; 模具(); } 返回$db; }
您确定每个查询都通过该函数运行吗?可能会仔细检查您的代码以100%确定

另一个选项是定义全局异常处理程序,然后只询问抛出的异常来自哪一行和文件:

编辑: 经过一段对话w/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();
  }
}
函数prepareStmt(PDO$oPdo$sStmt,数组$aDriverOptions=array())
{
尝试
{
返回$oPdo->prepare($sStmt,$aDriverOptions);
}
捕获(PDO$e)
{
打印“错误!:”$e->getMessage()。“
”; 模具(); } }
您捕获的异常文件是否有可能使用名称空间?在这种情况下,它应该是:

catch (\PDOException $e)
或加上:

use PDOException;

在文件顶部

是的,每个查询都会通过该函数。我对使用PDO还不熟悉,甚至没有意识到
prepare()
会抛出异常,谢谢。谁是那个在没有说明原因的情况下否决了这个旧答案的白痴?请注意,必须使用$db->setAttriute()将PDO::ATTR_ERRMODE设置为PDO::ERRMODE_EXCEPTION要真正得到一个异常,那么调用PDO::prepare;您是否也将其包装在try/catch语句中?@QuickShift-No,我没有将PDO::prepare包装在try/catch语句中。我只需调用
$stmt=$db->prepare('string')
then
makeQuery($stmt,array())。对,这就是它爆炸的地方。Esp如果你有语法错误,你不可能准备一个无效的PDO语句,所以我打赌你甚至都没有进入makeQuery调用<代码>导入
不是一个有效的方法。
use PDOException;