无法从mysqli结果中获取要传输到数组的所有行



当将此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来"释放"结果集。

最新更新