1

いくつかの結合を含む 1 つの選択クエリを使用して 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());

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 コード:

<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)問題 / 質問: 何らかの理由で、表示されたテーブルが常に1 つのレコードを省略しています。多くの PHP スクリプトで同じ (または非常に類似した概念) を使用しましたが、同じ問題に遭遇したことはありません。クエリ自体は問題ではないと思います-DBに対して直接実行すると、正しい数の値が返されます...(私は思う)。

4

4 に答える 4

2

2つのこと:

1) 情報を追加するたびに回答を送信しないでください。元の質問の下にある [編集] をクリックして、新しい情報を質問に追加する必要があります。

mysql_query2) どのように、どのように機能するかを明確にすれば、mysql_fetch_array何が起きているかが分かると思います。

「SELECT」で呼び出すmysql_queryと、クエリはresource. これresourceは単なるレコード セットへの参照です。次に、それを呼び出すとmysql_fetch_arrayresourceセットから現在のレコードが返され、レコード ポインターが進められます。

したがって、最初mysql_queryにレコード ポインタを呼び出すと、最初の結果がポイントされます。次にmysql_fetch_array、最初のレコードが配列として返され、ポインターが 2 番目のレコードに進みます。次にmysql_fetch_arrayこの 2 番目のレコードを呼び出すと、ポインタが 3 番目のレコードを指します。

3 番目のレコードがない場合は、次に呼び出したときmysql_fetch_arrayに対応するレコードを見つけることができず、false を返します。

これが を使用する理由ですwhile($row = mysql_fetch_array($task_details_q,MYSQL_NUM))。結果を変数に入れ、$row結果ポインターを進めてから、 でいくつかのアクションを実行してい$rowます。最終的には、最後の結果を過ぎてポインターを進め、$rowfalse になり、while ループの進行を停止します。

理論を説明したので、コードで何が起こっているかを次に示します (無関係なコードを削除//...し、途中で独自のコメントを追加します)。

$task_details_q = mysql_query($task_details) or die(mysql_error());
//now you have a resource $task_details_q, it points to the first result


$task_details_array = mysql_fetch_array($task_details_q,MYSQL_NUM);
//you retreive the first result, and advance the pointer to the second result

for($x=0;$x < sizeof($task_details_array);$x++)
{
            //you perform operations (echo'ing in this case) on your first result
    echo $x . ". : " . $task_details_array[$x] . "<br />";
}

//... HTML CODE SKIPPED

$even = false;
$trow = "";

//the first time this while statement is called you place the data from the second result in $row,
        //and advance the pointer to the third result
//the next time you go through the loop you try to place the data from the third result in $row,
        //since you say there are only 2 results to your query $row is simply false. 
        //This causes the while to stop executing and the code to continue on
while($row = mysql_fetch_array($task_details_q,MYSQL_NUM))
{
    //... PRINT TABLE CELLS FROM $row SKIPPED
}

//... REMAINING HTML SKIPPED

コードのブロックが実際に必要かどうかはわかりません。

$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 />";
}

または、デバッグ用に追加したばかりの場合。デバッグのためだけにある場合は、それを削除すると、最初の結果が while ループに表示されます。そのループを実行する必要がある場合はfor、この回答にコメントしてください。回答を編集して、forwhileループの両方で最初の結果を使用します。

于 2012-04-19T15:52:28.257 に答える
0

@Ben:これはとの間の完全なコードmysql_query($task_details)ですwhile($row = mysql_fetch_array($task_details_q))

 $task_details_q = mysql_query($task_details) or die(mysql_error());
 $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 />";
}

?>

<h3>Task details - "<?php echo strtoupper($task_name);  ?>"</h3>
<span class="notifierOK">Table below lists all people assigned to the task - including the status (complete / incomplete). To change person's status click on the 'yes' or 'no' link. If you then go back
to (<a href="tasks.php">previous page</a>) the completion percentage value will be re-calculated.</span><br />

<form id="task_details" method="post" name="task_details" style="margin-left: auto; margin-right: auto;width: 800px;box-shadow:10px 10px 5px #888888;">
<table class="task_table">
        <thead>
            <tr>
            <th>Task</th>
            <th>Description</th>
            <th>Due date</th>
            <th>Person</th>
            <th>Completed</th>
            <tr />
        </thead>
        <?php

        $even = false;
        $trow = "";

        while($row = mysql_fetch_array($task_details_q,MYSQL_NUM))

提案に基づいて配列タイプとして「MYSQL_NUM」を追加したので、必ずしもそこに属しているとは限らないことに注意してください。

于 2012-04-19T10:15:50.993 に答える
0

php は正しいように見えるので、問題の原因は html にある可能性があります。ヘッダー行には<tr>タグがないため、最初のレコードが欠落しているため、ブラウザーが窒息している可能性があります。

これを修正した後、html バリデーターで html をチェックして、そこに間違いがないことを確認することをお勧めします。

于 2012-04-18T21:01:42.207 に答える