这样while
循环工作正常:
$results = mysqli_query($dbcon, "SELECT `name`, `date` FROM `table1` WHERE `user` = $user_id);
while($data = mysqli_fetch_array($results)) {
echo '<tr>
<td>' . $data['name'] . '</td>
<td>' . $data['date'] . '</td>
</tr>'
}
但是它不想使用用户定义的函数。它只是无限地循环第一行:
function camp_data() {
global $user_id;
$query = mysqli_query($dbcon, "SELECT `name`, `date` FROM `table1` WHERE `user` = $user_id");
return (mysqli_fetch_array($query));
}
while($data = camp_data()) {
echo '<tr>
<td>' . $data['name'] . '</td>
<td>' . $data['date'] . '</td>
</tr>'
}
当我执行print_r(mysqli_fetch_array($results))
和print_r(camp_data())
时 - 两者都返回完全相同的数组。
这有什么不对?
答案 0 :(得分:4)
无论您在外部调用该函数多少次,它都只会在第一行执行mysqli_fetch_array()
。第二次调用该函数(在外部循环中的第二次迭代)将不知道它之前已执行并且不会进入下一行。同时在数组上循环并不是你可以拥有的最佳选择,它可能会导致无限循环。
您必须遍历函数中的结果并构建它们的数组。返回mysqli_fetch_array,不循环。
while($data = mysqli_fetch_array($results)) {
$rows[] = $data;
}
return $rows
然后对您的函数执行foreach()
:
foreach (camp_data() as $data) {
echo '<tr>
<td>' . $data['name'] . '</td>
<td>' . $data['date'] . '</td>
</tr>'
}
答案 1 :(得分:0)
在每个interation中你调用camp_data()中的所有代码,而不仅仅是最后一行,所以重构它:
function camp_data($query) {
return (mysqli_fetch_array($query));
}
//execute query only once
$query = mysqli_query($dbcon, "SELECT `name`, `date` FROM `table1` WHERE `user` = $user_id");
//fetch result row by row
while($data = camp_data($query)) {
echo '<tr>
<td>' . $data['name'] . '</td>
<td>' . $data['date'] . '</td>
</tr>'
}
如你所见,方法camp_data在这种情况下只是mysqli_fetch_array的简单包装器,因此它可以被mysqli_fetch_array替换