【问题标题】:How to show MySQL errors from a failed Modx/xPDO query object?如何从失败的 Modx/xPDO 查询对象中显示 MySQL 错误?
【发布时间】:2014-12-25 21:45:58
【问题描述】:

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

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

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

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

    if(!$myquery){

        echo 'error occurred! <br>';

    }

我如何返回实际的错误 [i.e.列不匹配,存在唯一 id 等]?

【问题讨论】:

  • 我不确定,在 modx 文档中,他们通常将 xpdo 功能记录为:$xpdo->query() 而不是 $modx->query()..rtfm.modx.com/xpdo/2.x/getting-started/…跨度>
  • 来自modx.class.php: class modX extends xPDO {…}

标签: mysql modx xpdo


【解决方案1】:

有一种更简单的方法可以跟踪您的自定义 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();
}

【讨论】:

  • 同意 - 这是 MODX 的做法。
【解决方案2】:

根据xPDO Getting Started guide 中的示例,此上下文中的$modx 似乎是扩展PDO 的类,结果资源对象$myquery 可能是PDOStatement 对象。

因此,您可以像使用普通 PDO 对象一样在 $modx 上设置异常错误模式。

$modx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

强制它在失败时抛出错误。默认情况下,PDO 错误是静默的;它的错误模式are documented here

更正: Looking into the xPDO source 它没有扩展 PDO,而是包含一个 PDO 对象作为属性并实现 PDO 方法,将它们传递给它的连接属性。所以setAttribute() 调用将被传递到底层的PDO 对象并且应该相应地工作。

The xPDO constructor 稍微扩展了普通 PDO 构造函数的功能,并在第 5 个参数中接受一组选项,您可以在其中设置错误模式,而不是稍后通过 setAttribute() 设置它:

$xpdo = new xPDO($dsn, $user, $password, [], [PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);

无论您选择哪种方法来设置它,您都可以将您的代码包装在一个 try/catch 块中,以便在错误时捕获 PDOException 类型的异常:

    try {
      $insert = "some insert sql statement that will fail";
      $myquery = $modx->query($insert);
   }
    catch (PDOException $e) {
      echo 'error occurred! ' . $e->getMessage() . '<br>';
    }

您也可以更简单地将错误模式设置为PDO::ERRMODE_WARNING,PHP 将改为只发出E_WARNING 消息,与异常不同,这些消息是非致命的。

通过使用 xPDO 设置快速测试,我能够验证所有这些工作是否符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多