【问题标题】:Fetch multiple fields at once一次获取多个字段
【发布时间】:2012-01-18 13:43:26
【问题描述】:

目前我的查询是这样的

    $stmt = $this->db->prepare('SELECT `body` FROM `messages` WHERE `id`=? AND `status'='success');
    $stmt->bind_param("i", $msgid);
    $rc = $stmt->execute();
    $stmt->bind_result($message);
    $stmt->fetch();
    $stmt->close();

假设$msgid 是数组 (1, 2, 5, 7)。是否可以一次获取 id 为 1、2、5、7 的所有bodystatus 字段并将所有body 合并到一个由空格分隔的变量?如果是,我该怎么做?

【问题讨论】:

  • 你的意思是... WHERE id IN(1, 2, 5, 7)?
  • @Quasdunk 是的。假设bodyid 1sample1。对于id 2sample2 .. 等等。我想在一个变量中获得sample1 sample2
  • 我有一个问题。虽然可以将所有主体合并到一个字符串中,但状态呢?它必须是什么形式?

标签: php mysql mysqli prepared-statement


【解决方案1】:

不,IN 语句没有占位符。 您必须编写一个简单的程序,该程序必须生成要添加到查询的(?,?,?) 字符串,然后将您的数组绑定到此查询。

嗯,结果是一次四个问题:

  1. 如何查询数据库的多个条件
  2. 如何使用准备好的语句构建这样的查询
  3. 如何获取多行
  4. 如何同时获取多个字段

但是,您似乎不需要简短的答案,而是书本(或者,更确切地说,两本 - 基本 PHP 和基本 mysql 一本),这里有答案供您参考

  1. 使用 IN 语句。 SQL语句WHERE id IN(1, 2, 5, 7)会查询数据库中所有的id。
  2. 正如我上面写的,创建一个小程序来生成(?,?,?) 语句,? 的数量与数组元素的数量相匹配。比通常的方式绑定它。
  3. 我相信,execute() 的手册页确实包含有关获取多行的示例。我自己总是参考手册的例子。
  4. SQL 函数 group_concat() 可以做到。 select group_concat(body SEPARATOR ' ') 将选择你所有的身体在一行中

【讨论】:

  • 是否可以将所有表作为数组获取,然后一一获取确切的行?
  • 这个问题完全无关紧要。您的数据库 API 可以确保您获取多行。你确定你不知道怎么做?
【解决方案2】:

GROUP_CONCAT - 以下代码应该可以满足您对 PDO 的需求。

$values = array(1, 2, 5, 7);
$parameters = implode(',', str_split(str_repeat('?', count($values)));

$stmt = $this->db->prepare("
  SELECT 
      GROUP_CONCAT(body SEPARATOR ' ') as gbody 
    FROM 
      messages 
    WHERE 
      id IN($parameters) 
      AND status='success'
");
$stmt->execute($values);
$res = $stmt->fetch();
echo $res['gbody'];
$stmt->close();

【讨论】:

  • $valueCount = implode(',',array_fill(0,count($values),'?')); ;-)
  • @Col.Shrapnel:为什么那个 array_fill 会有帮助? :)
  • 它将为您节省 4 行。四,因为在您当前的代码中,您必须在循环之前添加$valueCount = '';。因此,使用 array_fill 它将是 1 行而不是 5 行。
【解决方案3】:

不确定是否可以使用参数,但使用内置 SQL 很容易:

$imp=implode(',',$msgid);
"SELECT `body`, `status` FROM `messages` WHERE `id` IN (0$imp)"

左括号后面的 0 可以帮助您克服 $msgid 成为空数组的障碍。

这假设 is_numeric($msgid[$i]) 对于所有有效的 $i 都为真,否则您会丢失数据库...

【讨论】:

  • 实际上阅读我的答案的第一行会告诉你,我的解决方案不能使用参数。所以编辑你的代码不是一种选择。因懒得阅读而投反对票是粗鲁的。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2021-04-22
  • 2020-06-07
相关资源
最近更新 更多