MySQL PHP while循环-返回的记录比预期少一条
我遇到了一个有趣的问题,就是使用一个select查询和几个连接从mysql表检索数据 1) 查询:MySQL PHP while循环-返回的记录比预期少一条,php,sql,while-loop,Php,Sql,While Loop,我遇到了一个有趣的问题,就是使用一个select查询和几个连接从mysql表检索数据 1) 查询: $task_details = "SELECT tasks.task, "; $task_details = $task_details . "tasks.description,"; $task_details = $task_details . "tasks.finishby, "; $task_details = $task_details . "responsibles.full_name
$task_details = "SELECT tasks.task, ";
$task_details = $task_details . "tasks.description,";
$task_details = $task_details . "tasks.finishby, ";
$task_details = $task_details . "responsibles.full_name, ";
$task_details = $task_details . "task_assignments.completed, ";
$task_details = $task_details . "tasks.id, ";
$task_details = $task_details . "responsibles.user_id ";
$task_details = $task_details . "FROM tasks,task_assignments,responsibles ";
$task_details = $task_details . "WHERE ";
$task_details = $task_details . "tasks.id = task_assignments.id_task AND ";
$task_details = $task_details . "responsibles.id = task_assignments.id_assignee AND ";
$task_details = $task_details . "tasks.id = $id_task;";
$task_details_q = mysql_query($task_details) or die(mysql_error());
<table class="task_table">
<thead>
<th>Task</th>
<th>Description</th>
<th>Due date</th>
<th>Person</th>
<th>Completed</th>
</thead>
<?php
$even = false;
$trow = "";
while($row = mysql_fetch_array($task_details_q))
{
$trow = $trow . "<tr";
if($even) $trow = $trow . " style=\"background-color: #f2f2ed; \"";
$trow = $trow. ">";
$trow = $trow . "<td >$row[0]</td>";
$trow = $trow . "<td>" . $row[1] . "</td>";
$trow = $trow . "<td>" . date('d-m-Y',$row[2]) . "</td>";
$trow = $trow . "<td>$row[3]</td>";
$trow = $trow . "<td style=\"text-align: center;\" >";
if($row[4] > 0)
{
$trow = $trow . "<a href=\"javascript:modifyCompleted('remove','$row[6]',$row[5])\" title=\"Click to change completion of this task by this person\">yes</a>";
}
else
{
$trow = $trow . "<a href=\"javascript:modifyCompleted('add','$row[6]',$row[5])\" title=\"Click to change completion of this task by this person\">no</a>";
}
$trow = $trow . "</td>";
$trow = $trow . "</tr>";
$even =! $even;
$number = $number + 1;
}
$trow = $trow . "<tr style=\"border-top: 1px solid #666666;\"><td></td><td></td><td></td><td></td>";
$trow = $trow . "<td>";
$trow = $trow . "<a href=\"javascript:modifyCompleted('add_all','all',$task_details_array[5])\" title=\"Click to complete all\">Complete all</a>";
echo $trow;
?>
</table><br />
<span style="text-align: center;display:block;font-size: 12px;"><a href="tasks.php">Go back to task overview</a></span>
1a)结果示例查询:
SELECT tasks.task, tasks.description, tasks.finishby, responsibles.full_name, task_assignments.completed, tasks.id, responsibles.user_id
FROM tasks, task_assignments, responsibles
WHERE tasks.id = task_assignments.id_task
AND responsibles.id = task_assignments.id_assignee
AND tasks.id =19
2) HTML/PHP代码:
$task_details = "SELECT tasks.task, ";
$task_details = $task_details . "tasks.description,";
$task_details = $task_details . "tasks.finishby, ";
$task_details = $task_details . "responsibles.full_name, ";
$task_details = $task_details . "task_assignments.completed, ";
$task_details = $task_details . "tasks.id, ";
$task_details = $task_details . "responsibles.user_id ";
$task_details = $task_details . "FROM tasks,task_assignments,responsibles ";
$task_details = $task_details . "WHERE ";
$task_details = $task_details . "tasks.id = task_assignments.id_task AND ";
$task_details = $task_details . "responsibles.id = task_assignments.id_assignee AND ";
$task_details = $task_details . "tasks.id = $id_task;";
$task_details_q = mysql_query($task_details) or die(mysql_error());
<table class="task_table">
<thead>
<th>Task</th>
<th>Description</th>
<th>Due date</th>
<th>Person</th>
<th>Completed</th>
</thead>
<?php
$even = false;
$trow = "";
while($row = mysql_fetch_array($task_details_q))
{
$trow = $trow . "<tr";
if($even) $trow = $trow . " style=\"background-color: #f2f2ed; \"";
$trow = $trow. ">";
$trow = $trow . "<td >$row[0]</td>";
$trow = $trow . "<td>" . $row[1] . "</td>";
$trow = $trow . "<td>" . date('d-m-Y',$row[2]) . "</td>";
$trow = $trow . "<td>$row[3]</td>";
$trow = $trow . "<td style=\"text-align: center;\" >";
if($row[4] > 0)
{
$trow = $trow . "<a href=\"javascript:modifyCompleted('remove','$row[6]',$row[5])\" title=\"Click to change completion of this task by this person\">yes</a>";
}
else
{
$trow = $trow . "<a href=\"javascript:modifyCompleted('add','$row[6]',$row[5])\" title=\"Click to change completion of this task by this person\">no</a>";
}
$trow = $trow . "</td>";
$trow = $trow . "</tr>";
$even =! $even;
$number = $number + 1;
}
$trow = $trow . "<tr style=\"border-top: 1px solid #666666;\"><td></td><td></td><td></td><td></td>";
$trow = $trow . "<td>";
$trow = $trow . "<a href=\"javascript:modifyCompleted('add_all','all',$task_details_array[5])\" title=\"Click to complete all\">Complete all</a>";
echo $trow;
?>
</table><br />
<span style="text-align: center;display:block;font-size: 12px;"><a href="tasks.php">Go back to task overview</a></span>
任务
描述
到期日
人
完整的
3) 问题/问题:出于某种原因,显示的表总是忽略一条记录。我在许多PHP脚本中使用了相同的(或非常相似的概念),但从未遇到过相同的问题。我认为查询本身不是问题——当我直接对DB运行它时,它会返回正确数量的值…(我认为)。由于php看起来是正确的,问题的原因可能是html。您的标题行没有
标记,因此可能是由于您缺少第一条记录而导致浏览器阻塞
修复此问题后,我建议在html验证程序中检查您的html,以确保没有更多错误。@Ben:这是
mysql\u查询($task\u details)
和while($row=mysql\u fetch\u array($task\u details\u q))之间的完整代码:
$task\u details\u q=mysql\u query($task\u details)或die(mysql\u error());
$task\u details\u array=mysql\u fetch\u array($task\u details\u q,mysql\u NUM);
对于($x=0;$x ;
}
?>
任务详细信息-“”
下表列出了分配给任务的所有人员,包括状态(完成/未完成)。要更改人员的状态,请单击“是”或“否”链接。如果你再回去
to()将重新计算完成百分比值。
任务
描述
到期日
人
完整的
2件事:
1) 您不应该在添加信息时提交答案。您应该单击原始问题下的“编辑”,并将新信息添加到问题中
2) 我想如果我澄清一下mysql\u query
和mysql\u fetch\u array
是如何工作的,你就会知道发生了什么
当您使用“SELECT”调用mysql\u query
时,查询将返回一个资源
。此资源
只是对记录集的引用。然后,当您在该资源上调用mysql\u fetch\u array
时,它将从集合中返回当前记录,并前进记录指针
因此,当您第一次调用mysql\u query
时,记录指针指向第一个结果。然后调用mysql\u fetch\u array
第一条记录作为数组返回,指针前进到第二条记录。下次调用mysql\u fetch\u array
时,将返回第二条记录,指针将指向第三条记录
如果没有第三条记录,下次调用mysql\u fetch\u array
时,它将无法找到相应的记录,并将返回false
这就是为什么要使用while($row=mysql\u fetch\u array($task\u details\u q,mysql\u NUM))
。您正在将一个结果放入变量$row
并前进结果指针,然后使用$row
执行一些操作。最终,您将使指针前进超过最后一个结果,$row
将为false,这将阻止while循环前进
现在,我已经介绍了这个理论,下面是您的代码发生的情况(我将使用/…
删除不相关的代码,并在此过程中添加我自己的注释):
$task\u details\u q=mysql\u query($task\u details)或die(mysql\u error());
//现在您有了资源$task\u details\u q,它指向第一个结果
$task\u details\u array=mysql\u fetch\u array($task\u details\u q,mysql\u NUM);
//检索第一个结果,并将指针前进到第二个结果
对于($x=0;$x ;
}
//... 跳过HTML代码
$偶数=假;
$trow=“”;
//第一次调用while语句时,将第二个结果中的数据放入$row中,
//并将指针前进到第三个结果
//下次执行循环时,尝试将第三个结果中的数据放入$row中,
//既然您说您的查询只有两个结果,$行完全是错误的。
//这会导致while停止执行,代码继续运行
而($row=mysql\u fetch\u array($task\u details\u q,mysql\u NUM))
{
//…已跳过从$row打印表格单元格
}
//... 已跳过剩余的HTML
我不确定您是否真的需要代码块:
$task_details_array = mysql_fetch_array($task_details_q,MYSQL_NUM);
for($x=0;$x < sizeof($task_details_array);$x++)
{
echo $x . ". : " . $task_details_array[$x] . "<br />";
}
$task\u details\u array=mysql\u fetch\u array($task\u details\u q,mysql\u NUM);
对于($x=0;$x ;
}
或者如果您只是为了调试而添加它。如果只是为了调试,请删除它,您的第一个结果将显示在while循环中。如果您需要执行循环,请对此答案进行注释,我将编辑我的答案,以便在循环时使用循环和循环中的第一个结果。我解决了它,我遇到了相同的问题
$run_query = mysqli_query($conn, $stores);
if ($run_query === false){
//error
}else if (mysqli_num_rows($run_query)){
$row = mysqli_fetch_array($run_query);
echo 'bla bla bla' //on this echo I needed to show the data once.
$run_query = null;
$run_query = mysqli_query($conn, $stores);
while ($row = mysqli_fetch_array($run_query)) { //and here I needed to show up the loops of the results of my query.}
所以。。。我只是重置运行查询的变量并重新运行搜索。这对我很管用!;) 仅供参考,您很可能容易受到SQL注入的影响。您应该始终转义查询中使用的数据。更好的办法是学习使用PDO进行准备好的查询,以完全避免这个问题。我不确定这是否是问题的原因,但您没有完成最后一行。你在源代码中看到正确的结果了吗?@jeroen:好眼力
$run_query = mysqli_query($conn, $stores);
if ($run_query === false){
//error
}else if (mysqli_num_rows($run_query)){
$row = mysqli_fetch_array($run_query);
echo 'bla bla bla' //on this echo I needed to show the data once.
$run_query = null;
$run_query = mysqli_query($conn, $stores);
while ($row = mysqli_fetch_array($run_query)) { //and here I needed to show up the loops of the results of my query.}