MySQL PHP while循环-返回的记录比预期少一条

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

我遇到了一个有趣的问题,就是使用一个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 = $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.}