首页 > 解决方案 > 为什么这个 get 函数会出现致命错误?

问题描述

我正在尝试根据 3 个要求选择我的帖子表中的所有行。

  1. 帖子表中的用户 ID = 用户表中的用户 ID
  2. Posts 表中的 hostid = users 表中的 userid
  3. 帖子表中的评论 ID = 零

我想选择所有满足这些要求的行。这是错误...

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on bool in C:\xampp\htdocs\loginsystem\includes\posts.inc.php:108 Stack trace: #0 C:\xampp\htdocs\loginsystem\home.php(38): getUploads(Object(mysqli)) #1 {main} thrown in C:\xampp\htdocs\loginsystem\includes\posts.inc.php on line 108

这是我的代码...

function getUploads($conn) {

        $userName = $_GET["user"];
        $sqluserid = "SELECT userid FROM users WHERE userName = $userName";
        $userid = mysqli_query($conn, $sqluserid);
        $sqlusercontent = "SELECT * FROM posts WHERE hostid = $userid AND userid = $userid AND commentid = 0";
        $usercontent = mysqli_query($conn, $sqlusercontent);
        $postid = 1;

    // This is the actual upload content
        while ($row = $usercontent->fetch_assoc()) {
            echo "<div class='postbox'><p>";
            echo $row['title']."<br>";
            echo $row['date']."<br>";
            echo "<div><img src='posts/".$userid."/".$postid.".*></div>";
            echo $row['description']."<br>";
            echo "</p>";
            echo "</div>";
            $postid++;
        }    
    }

标签: phpmysqli

解决方案


您没有调用$userid->fetch_assoc()获取第一个查询的结果。您需要执行此操作,然后使用$row['userid']将用户标识移出行。

您还需要在第一个查询中为用户名加上引号。最好使用准备好的语句 and$stmt->bind_param()来防止 SQL 注入。

但是首先不需要两个查询,您可以将两个表连接起来。

SELECT p.*
FROM posts AS p
JOIN users AS u ON p.userid = u.userid AND p.hostid = u.userid
WHERE u.username = '$userName' AND p.commentid = 0

您应该检查查询的结果,然后您会在第一个查询中收到语法错误通知。

$result = mysqli_query($conn, $sql) or die($conn->error);

推荐阅读