我有一个查询,我从一个表中获取了几个结果。然后,我需要遍历每个结果以从其他表中获取信息,但是,我无法使其工作。
这是我的代码:
<?php
$type = 1;
if ($stmt = $cxn->prepare('SELECT username FROM users WHERE type = ?')) {
$stmt->bind_param('i', $type);
$stmt->execute();
$stmt->bind_result($username);
while ($stmt->fetch()) {
if ($stmt = $cxn->prepare('SELECT count FROM posts WHERE username = ?')) {
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($result2);
$stmt->close();
}
}
$stmt->close();
}
?>
我收到错误:
Call to a member function fetch() on a non-object
我该如何解决这个问题?
答案 0 :(得分:1)
我强烈建议使用原生SQL JOIN
,因为这样可以避免在发送数千个查询时产生不必要的开销:
SELECT
u.username,
p.count
FROM
users u
LEFT JOIN // processed as LEFT OUTER JOIN so the syntax is interchangeable just fyi
posts p
ON u.username = p.username
WHERE
p.type = ?
仅解释LEFT JOIN,我们会保持简单=)
在上面的SQL中,我们从用户表中的用户名作为一个整体开始
users u
只是授予我们u.username
的快捷语法,以便SQL可读且不会fubar
接下来,我们要将posts p
表附加到u.username = p.username
,因为我们需要为每个用户名p.count
最后,我们根据p.type
等于某事来过滤这个数据集
请注意,根据DBMS的不同,这里有许多功能。这样的事情包括查询优化器,过滤的确切点等等......但这远远超出了我们想要在概念上实现的范围,因此我不会详细说明因为它只会引起混淆。
答案 1 :(得分:1)
您正在覆盖您的stmt变量。你应该使用另一个,比如
$type = 1;
if ($stmt = $cxn->prepare('SELECT username FROM users WHERE type = ?')) {
$stmt->bind_param('i', $type);
$stmt->execute();
$stmt->bind_result($username);
while ($stmt->fetch()) {
if ($stmtCnt = $cxn->prepare('SELECT count FROM posts WHERE username = ?')) {
$stmtCnt->bind_param('s', $username);
$stmtCnt->execute();
$stmtCnt->bind_result($result2);
$stmtCnt->close();
}
}
$stmt->close();
}