一次获取多个字段


Fetch multiple fields at once

当前我的查询看起来像

    $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的字段合并为一个由空白分隔的变量?如果是,我该怎么做?

不,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 ' ')会在一行中选择所有的主体

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();

不确定参数是否可以实现这一点,但使用构建的SQL:很容易

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

左括号后的0可以帮助你越过$msgid为空数组的障碍。

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