如何从失败的Modx / xPDO查询对象中显示MySQL错误?

时间:2014-12-25 21:45:59

标签: mysql modx xpdo

当我尝试将数据插入自定义表并且插入失败时,如何显示mysql抛出的错误?

例如,下面的一些代码应该(将)因SQL错误而失败。

$insert = "some insert sql statement that will fail";

$myquery = $modx->query($insert);

    if(!$myquery){

        echo 'error occurred! <br>';

    }

如何返回实际错误[即列不匹配,存在唯一ID等。]

2 个答案:

答案 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();
}