准备好语句,循环结果以获得更多结果

时间:2014-02-03 18:38:27

标签: php mysql mysqli

我有一个查询,我从一个表中获取了几个结果。然后,我需要遍历每个结果以从其他表中获取信息,但是,我无法使其工作。

这是我的代码:

<?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

我该如何解决这个问题?

2 个答案:

答案 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();
}