【问题标题】:$modx->query doesn't seem to execute$modx->query 似乎没有执行
【发布时间】:2013-02-08 03:37:22
【问题描述】:

根据此处的文档:http://rtfm.modx.com/display/xPDO20/xPDO.query

以下示例:

$result = $modx->query("SELECT * FROM modx_users WHERE id=1");
if (!is_object($result)) {
   return 'No result!';
}

我认为这个说法会起作用:

$checkUnique = $modx->query("SELECT * FROM my_table_name WHERE guid = '$unique' AND used = 0");

//guid already used, or non-existant
if(!is_object($checkUnique)){
  $result = array(
    "result" => false
  );
  return json_encode($result);
}

当我执行var_dump$checkUnique)时,结果如下:

object(PDOStatement)#22 (1) { ["queryString"]=> string(70) "SELECT * FROM my_table_name WHERE guid='5114722f24870' AND used=0"}

我知道used 列已设置为1,但它永远不会触发我的if 块。

我做错了什么?

【问题讨论】:

  • 有什么问题? $checkUnique 似乎是一个对象(准确地说是PDOStatement),因此您的if 块将不会被执行; !is_object($checkUnique) 将评估为 false
  • @Phil - 对,那为什么它是一个包含查询字符串的对象呢?它不应该已经执行并变成某种结果吗?链接中的示例表明,如果没有结果,它将返回一个非对象...
  • 这是一个 PDOStatement 对象。它不只是神奇地变成一个结果。您需要获取它(即 fetch() 或 fetchAll())
  • @ahren 您没有阅读您linked to 的文档吗? "执行一条 SQL 语句,将结果集作为 PDOStatement 对象返回。"
  • @Mike - 刚刚根据您的建议 (->fetch()) 进行了尝试,是的,空数据集似乎确实失败了!谢谢 - 如果你把它写成我会接受的答案。

标签: php mysql pdo modx modx-revolution


【解决方案1】:

看来 MODx doco 需要一些帮助。我只是在本地尝试过,一个空的结果集仍然返回一个PDOStatement 对象。

您可以尝试使用PDOStatement::rowCount() 来检查返回的行数

$count = $checkUnique->rowCount();

或像这样更改您的查询

$check = $modx->query("SELECT COUNT(1) FROM my_table_name WHERE guid = '$unique' AND used = 0");
$count = $check->fetchColumn();
if (!$count) {
    // etc

我在 MODx 文档中提出了一个错误 - http://tracker.modx.com/issues/9502

【讨论】:

  • erm... rowCount() 返回受影响的行数(即UPDATEINSERTDELETE)。我承认它的名字很糟糕。你正在寻找count($stmt->fetchAll())
  • @Mike 它也适用于 MySQL 中的 SELECT 语句。经过测试和验证
  • 你可能是对的。文档没有明确说明它适用于哪个 DBMS:“如果相关 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,这不能保证所有数据库的行为,并且不应依赖于可移植应用程序。"
  • @Mike 我也不喜欢依赖它,因此上面的 SELECT COUNT() 替代方案
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多