当前我的查询看起来像
$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的所有body
、status
字段,并将所有body
的字段合并为一个由空白分隔的变量?如果是,我该怎么做?
(?,?,?)
字符串,然后将数组绑定到此查询。
嗯,结果是同时出现了四个问题:
- 如何在数据库中查询多个条件
- 如何使用准备好的语句构建这样的查询
- 如何获取多行
- 如何在一个字段中获取多个字段
然而,你似乎不需要简短的答案,而是需要这本书(或者,更确切地说,两个基本的PHP和一个基本的mysql),以下是你的参考的答案
- 使用IN语句。SQL语句
WHERE id IN(1, 2, 5, 7)
将在数据库中查询所有id - 正如我在上面所写的,创建一个小程序来生成
(?,?,?)
语句,其中?
的数量与数组元素的数量相匹配。比通常的方式绑定它 - execute()的手册页面确实包含了一个获取多行的示例,我相信。我自己总是参考手册中的例子
- 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,否则您将丢失数据库。。。