Php 未捕获PDO异常
我不熟悉使用PDO,我发现由于查询语句中的错误导致的异常没有被正确捕获和显示。发生这种情况时,页面输出通常如下所示:Php 未捕获PDO异常,php,mysql,pdo,error-handling,Php,Mysql,Pdo,Error Handling,我不熟悉使用PDO,我发现由于查询语句中的错误导致的异常没有被正确捕获和显示。发生这种情况时,页面输出通常如下所示: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: ... 我使用以下函数进行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')
thenmakeQuery($stmt,array())代码>。对,这就是它爆炸的地方。Esp如果你有语法错误,你不可能准备一个无效的PDO语句,所以我打赌你甚至都没有进入makeQuery调用代码><代码>导入
不是一个有效的方法。
use PDOException;