检查mysqli_fetch_assoc结果有问题

时间:2014-01-11 20:06:48

标签: php mysqli

我在个人项目上遇到了问题。我正在创建一个项目板,用户可以登录,创建不同的项目并向其添加任务。基本上是分类待办事项列表。 当用户登录时,它们被重定向到列出已经创建的板的屏幕。如果没有创建板,则会显示“创建板”的链接

当用户登录时,他们的用户名会保存在会话中并使用$ username

进行调用

我有两个表,用户和主板:

USER:

+---------+----------+-----------------+------------+
| user_id | username | email           | password   |
+---------+----------+-----------------+------------+
| 1       |   user1  | user@user1.com  | pass1      |
| 2       |   user2  | user@user2.com  | pass2      |
| 3       |   user3  | user@user3.com  | pass3      |
+---------+----------+-----------------+------------+

BOARDS:

+----------+-----------------+---------+
| board_id | board_name      | user_id | 
+----------+-----------------+---------+
| 1        |   user1-board1  |  1      |
| 2        |   user1-board2  |  1      |
| 3        |   user2-board1  |  2      |
| 4        |   user2-board2  |  2      |
+----------+-----------------+---------+

注意用户3没有创建任何板。

我运行以下查询以拉出当前登录用户的所有相关电路板并显示电路板名称。

$query  = "SELECT board_id, board_name, boards.user_id, username ";
$query .= "FROM boards, user ";
$query .= "WHERE boards.user_id = user.user_id ";
$query .= "AND user.username = '{$username}' ";
$set = mysqli_query($connection, $query);

一切正常,当我运行以下代码时,我可以显示电路板名称。

while ($boards = mysqli_fetch_assoc($set)) {
    echo $boards['board_name'];
    echo "<hr/>";
}

我遇到的问题是当用户登录但没有创建任何板时显示“创建板链接”。即用户3。

我的代码:

if (!mysqli_fetch_row($set)) {
    echo "create board";
} else {
    while ($boards = mysqli_fetch_assoc($set)) {
            echo $boards['board_name'];
            echo "<hr/>";   
    }
}

我尝试过以上代码的变体,但这是我得到的壁橱。如果用户3(没有电路板)登录,他会看到“创建板”,所以我认为它起作用,因为没有与该用户相关的数据行。但是,如果用户1登录(有2个板),则仅显示第二个板名称。如果我删除了!mysqli_fetch_row代码,则输出两个板名。显然fetch_row正在影响结果,但我无法解决原因。

如果有人可以就如何检查用户是否有任何电路板提供任何指导,我将非常感激。此外,如果任何人都可以解释(为了我自己的个人发展)为什么运行fetch_row会改变传递给while循环的结果集,这将是一个奖励。

提前致谢

1 个答案:

答案 0 :(得分:2)

这一行:

if (!mysqli_fetch_row($set)) {

从结果集中提取并消耗一行。由于您没有将返回的行分配给变量,因此它完全丢失了。如果找到了行,则转到else子句,现在缺少一行结果。

您需要检查已找到的行数,然后开始消耗:

if (mysqli_num_rows($set) == 0) {
   ... there are no rows ...
} else {
   ... there are rows: loop and display them
}