为什么store_result()不返回等于mysqli Regular Statement的num_rows?

时间:2018-12-15 15:59:33

标签: php mysqli prepared-statement

我一直在梳理先前的问题并尝试许多解决方案,但无法弄清楚。我正在尝试将此查询转换为预准备语句:

$query = mysqli_query($this->con, "SELECT * FROM notifications WHERE user_to='$userLoggedIn' ORDER BY id DESC");

这里是我所拥有的:

        $query = $this->con->stmt_init();
        $query->prepare('SELECT * FROM notifications WHERE user_to=? ORDER BY id DESC');
        $query->bind_param('s', $userLoggedIn);
        $query->execute();
        $query->store_result();

        $qty = $query->num_rows;
        $query_result = $query->get_result();

在下面的代码中,我有这样使用的变量:

        if($qty == 0) {
            echo "<li class='no-more-posts' style='height: 0px; text-transform: uppercase;'>- You have no notifications! -</li>";
            return;
        }

        $num_iterations = 0; //Number of messages checked 
        $count = 1; //Number of messages posted

        while($row = $query_result->fetch_assoc()) {

        if($num_iterations++ < $start)
            continue;

        if($count > $limit)
            break;
        else 
            $count++;

        $user_from = $row['user_from'];

   etc.etc.

我得到的是空白的下拉列表。如果我将while语句改回原来的while($row = mysqli_fetch_array($query)) {(我知道这是错误的,并且是旧语句),我的结果将始终返回li没有更多帖子可显示。这告诉我$qty = $query->num_rows;返回0。根据文档,我的理解是,一旦我用store_result()缓冲了结果集,就可以立即调用$qty = $query->num_rows;。我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

我敢肯定这不是做事的最有效方法,但这就是我的全部。决定分手。

首先,我对计数进行了说明:

    $query_count = $this->con->stmt_init();
    $query_count->prepare('SELECT COUNT(*) FROM notifications WHERE user_to=?');
    $query_count->bind_param('s', $userLoggedIn);
    $query_count->execute();

    $query_count_result = $query_count->get_result();
    $rows_count = $query_count_result->fetch_array();

    $qty = array_shift($rows_count);

然后我对数据进行了声明:

        $query = $this->con->stmt_init();
        $query->prepare('SELECT * FROM notifications WHERE user_to=? ORDER BY id DESC');
        $query->bind_param('s', $userLoggedIn);
        $query->execute();

        $query_result = $query->get_result();

它解决了我的问题,一切正常。我知道有更好的方法可以做到这一点,因此,如果有人对此建议很好。同时,这将是必须要做的。