SQL 查询不返回第一行


sql query does not return the first row

每当我使用:while($x = mysqli_fetch_array($y))然后echo $x,它都会返回除第一行之外的所有内容。

表格:

论坛用户

  • users.user_id 用户.用户名
  • 用户.密码
  • 用户.图像
论坛

论坛

  • forums.forum_id forums.user_id
  • forums.name

这是我的代码:

<?php
session_start();
$con = new mysqli("localhost", "root", "", "forum");
if(!isset($_SESSION["online"])==1)  {
    $_SESSION["offline"] = "true";
}
$username = $_SESSION["online"];
$u_query = "SELECT * FROM forum.users WHERE users.username = '".$username."'";
$u_result = $con -> query($u_query);
$u_row = mysqli_fetch_array($u_result);
if(isset($_POST["logout"])) {
    session_unset();
    session_destroy();
    header("Location: login.php");
}   
$f_search = "SELECT * FROM forum.forums WHERE user_id = '".$u_row['user_id']."'";
$f_result = $con -> query($f_search);
$f_row = mysqli_fetch_array($f_result);
?>
<html>
<head>
<title>Home</title>
<charset = "UTF-8">
<link href="style.css" rel="stylesheet" type="text/css">
</head> 
<body>
<div id="header">
    <div id="user">
        <img src="<?php echo $u_row['image']; ?>" id="user-image">
        <?php echo $u_row["username"]; ?>
        <form method="post">
            <input type="submit" name="logout" value="sign out">
        </form> 
    </div>
</div>
<?php if(mysqli_num_rows($f_result)>= 0) { ?>
<div>
    <div>Your forums:</div><table><tr>
    <?php while($f_row = mysqli_fetch_array($f_result)) { ?>
    <td><a href="forum.php?forumid=<?php echo $f_row['forum_id']; ?>"><?php echo $f_row["name"]; ?></a></td>
    <td></td>
    <?php } ?>
    </tr></table>
</div>
<?php } ?>
</body>
</html>

为什么它不返回第一行?

调用 mysqli_fetch_array 获取行并推进游标。所以你的第一个

$f_row = mysqli_fetch_array($f_result);

有第一行。然后

while($f_row = mysqli_fetch_array($f_result)) { 

前进到第二行,并循环遍历所有其他结果。

因此,要么在while之外删除$f_row = mysqli_fetch_array($f_result);,要么在while之前输出内容。看起来您没有使用该数组,所以我只是将其删除。

此外:

$username = $_SESSION["online"];
$u_query = "SELECT * FROM forum.users WHERE users.username = '".$username."'";

对 SQL 注入开放。应使用预准备语句并参数化查询。http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

删除$f_row = mysqli_fetch_array($f_result);

通过在脚本的早期自行调用它,您将指针 +1 前进。然后在你的while($f_row = mysqli_fetch_array($f_result))中,你实际上是从第二行开始的。

$f_search = "SELECT * FROM forum.forums WHERE user_id = '".$u_row['user_id']."'";
$f_result = $con -> query($f_search);
$f_row = mysqli_fetch_array($f_result); // <---- remove this line