当我尝试将数据插入自定义表并且插入失败时,如何显示mysql抛出的错误?
例如,下面的一些代码应该(将)因SQL错误而失败。
$insert = "some insert sql statement that will fail";
$myquery = $modx->query($insert);
if(!$myquery){
echo 'error occurred! <br>';
}
如何返回实际错误[即列不匹配,存在唯一ID等。]
答案 0 :(得分:3)
根据xPDO Getting Started guide中的示例,此上下文中的$modx
似乎是一个扩展PDO
的类,结果资源对象$myquery
可能是{{1}对象。
因此,您可以像使用普通PDO对象一样在PDOStatement
上设置异常错误模式。
$modx
强制它在失败时抛出错误。默认情况下,PDO错误无声;其错误模式are documented here。
更正: Looking into the xPDO source它不扩展 $modx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
,而是包含PDO
对象作为属性并实现PDO方法,将它们传递给它的连接属性。因此,PDO
调用将传递给基础setAttribute()
对象,并且应该相应地工作。
The xPDO constructor稍微扩展了普通PDO构造函数的功能,并接受第5个参数中的一个选项数组,您可以在其中设置错误模式,而不是稍后通过PDO
设置它:
setAttribute()
无论您选择哪种方法进行设置,都可以将代码包装在$xpdo = new xPDO($dsn, $user, $password, [], [PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);
块中,以便在出错时捕获try/catch
类型的异常:
PDOException
你也可以更简单地将errormode设置为 try {
$insert = "some insert sql statement that will fail";
$myquery = $modx->query($insert);
}
catch (PDOException $e) {
echo 'error occurred! ' . $e->getMessage() . '<br>';
}
,而PHP只会发出PDO::ERRMODE_WARNING
消息,这与异常不同,是非致命的。
通过使用xPDO设置快速测试,我能够按预期验证所有这些工作。
答案 1 :(得分: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();
}