【问题标题】:PHP PDO FetchAll vs FetchPHP PDO FetchAll 与 Fetch
【发布时间】:2014-11-05 17:51:46
【问题描述】:

我相信我完全错误地使用了 PDO 提取功能。这是我想要做的:

查询一行,获取结果,使用辅助函数将结果处理成数组。

查询

function userName($db){
  $q = $db->prepare("SELECT id, name FROM users WHERE id = :user");
  $q->bindParam(":user", $user);
  $q->execute();
  $qr = $q->fetchAll(PDO::FETCH_ASSOC);
  if ($qr->rowCount() > 0){
    foreach($qr as $row){
      $names[$row['id']] = buildArray($row);
    }
  return $names;
  }
}

我的自定义数组构建函数

function buildArray($row){
 $usernames = array();
 if(isset($row['id'])) $usernames['id'] = $row['id'];
 if(isset($row['name'])) $usernames['name'] = $row['name'];
}

我实际上得到了我想要的,但是当我在中间回显时,我看到事情循环了 3 次而不是一次。我想我在滥用 fetchAll。

任何帮助表示赞赏

【问题讨论】:

  • 你提取了多少条目?你在哪里echo
  • buildArray() 没有return 声明
  • 循环3次是什么意思?唯一的循环是foreach($qr as $row)。您在哪里看到其他循环?
  • 想想,而不是愚蠢的电脑必须做的事情。你会怎么做?
  • @DOCSAREL 如果我在 If 语句中回显,我会看到 2 个回显(假装我有两个相似的 ID)。如果我在 foreach 中回显,我会看到 6 个回显。所以 2x3=6 出于某种原因,循环发生了 3 次。也请不要担心这里的小事,我写的是一个例子。

标签: php mysql pdo


【解决方案1】:

如果您要构建一个新数组,那么让fetchAll() 构建一个数组没有多大意义。编写你自己的fetch()循环:

function userName($db){
    $q = $db->prepare("SELECT id, name FROM users WHERE id = :user");
    $q->bindParam(":user", $user);
    $q->execute();
    $names = array();
    while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
        $names[$row['id']] = $row;
    }
    return $names;
}

也不需要buildArray(),因为$row 已经是你想要的关联数组了。

【讨论】:

  • 非常感谢...现在为什么我不能返回 $names?它说它是未定义的(它在一个函数中)。我试图在函数 $names; 的开头定义它。并在 while 循环之外返回 $names...
  • 我需要看看你的代码,我不知道你做错了什么。
  • 是的,对不起,当它没有找到结果时它在抱怨。所以我将 while 循环放在 if rowCount()>0 等中。一切都很好
  • 不需要if。如果没有行,循环将立即结束。
  • @mickmackusa 这是一个编辑错误。我最初只是写了循环。然后我复制了它周围的其余功能,忘记删除fetchAll()。这不是我第一次写“做 X 而不是 Y”的答案,然后忘记按照建议实际更改代码。 :)
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2014-01-23
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2013-12-27
相关资源
最近更新 更多