当将此select语句直接查询到我的数据库(在phpmyadmin中(时,我会返回5行
SELECT class.* FROM class, professor, administers WHERE professor.professorID = administers.professorID AND class.classID = administers.classID AND professor.uName='username';
当我使用mysqli查询时,我会在mysqli_num_rows($result)
中返回5行。然而,当我试图将$result
的每一行传输到一个数组时,我会丢失第一行。我知道这是我PHP中的一个错误,但我不知道哪里出了问题。我已经尝试了while
循环的许多变体,以及for
循环的一些变体,我已经用尽了我的想法
在我的逻辑页面上,我使用以下内容:
$stmt = mysqli_stmt_init($conn);
$sql = "SELECT class.* FROM class, professor, administers WHERE professor.professorID = administers.professorID AND class.classID = administers.classID AND professor.uName=?;";
$acct = $_SESSION['userUid'];
if (!mysqli_stmt_prepare($stmt, $sql))
{
header("Location: ../index.php?error=sqlerror");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "s", $acct);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
}
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
mysqli_fetch_assoc($result);
while ($row = mysqli_fetch_assoc($result))
{$asocres[] = $row;}
当我在前端页print_r($asocres);
时,我会返回4行(缺少第一行(
我的问题是为什么我会丢失查询的第一行
-----编辑-----
我意识到这是CCD_ 6在CCD_ 7循环之前的第一个实例。为什么这会引起问题这是如何导致在我的while
循环中跳过第一行的
尝试这种方式
$stmt = mysqli_stmt_init($conn);
$sql = "SELECT class.* FROM class, professor, administers WHERE professor.professorID = administers.professorID AND class.classID = administers.classID AND professor.uName=?;";
$acct = $_SESSION['userUid'];
if (!mysqli_stmt_prepare($stmt, $sql))
{
header("Location: ../index.php?error=sqlerror");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "s", $acct);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
}
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
while ($row = mysqli_fetch_assoc($result))
{$asocres[] = $row;}
试着在while循环中打印行,看看你是否得到了第一行。
之所以会发生这种情况,是因为第一次调用将数组指针设置为第一个元素,然后第二次调用将指针设置为第二个元素。我希望我的答案是有帮助的。
您需要删除:
mysqli_fetch_assoc($result);
你可以走了。
注意:-mysqli_fetch_assoc($result);
将获取第一条记录,并将内部数据指针移动到下一条记录。所以while()
将从第二个记录开始。
mysqli_fetch_assoc
返回一个与提取行相对应的关联数组,并向前移动内部数据指针。
调用mysqli_fetch_assoc
只是将结果集的内部指针进一步下移到行列表中,最终指向NULL
(列表的末尾(。这些行仍然存在,您还没有删除任何行:您只需遍历列表,就可以使用类似mysqli_data_seek
的东西来重置指向特定行的内部指针,从而再次遍历它们。
对于此问题,仅在循环内部使用mysqli_fetch_assoc
。
其他信息
您需要调用mysqli_free_result
来"释放"结果集。