PHP查询未显示所有结果

时间:2013-12-20 23:38:50

标签: php mysql

我有一个包含3个表的数据库。一个表包含人,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个显示每个类别中所有人的报告。出于某种原因,我的查询没有显示每个类别中的第一条记录,我无法弄清楚如何修复它。

代码:

<?php require_once('Connections/meritBadges.php');
$result = mysql_query('SELECT id, badge_name FROM meritbadgestable ORDER BY badge_name');

while ($row = mysql_fetch_array($result)) 
{
    $badgenumber = $row['id'];   
    $badgename = mysql_query("SELECT id, badge_name FROM meritbadgestable WHERE id=$badgenumber");
    while($badge = mysql_fetch_array($badgename))
    {
        $badge_name = $badge['badge_name'];
    } 
    $counselors = mysql_query("SELECT id, firstname, lastname, counselorid, meritbadgeid FROM counselorstable, meritbadgetocounselortable WHERE id=counselorid AND meritbadgeid='$badgenumber' ORDER BY lastname");

    $counselor = mysql_fetch_array($counselors);
    if(empty($counselor)) 
    {
        echo '<h2>Merit Badge: ' . $badge_name . '</h2><p class="counselortable">There are no counselors for this merit badge.</p>';
    }
    else 
    {
        echo '<h2>Merit Badge: ' . $badge_name . '</h2>
              <table width="950" border=1 cellpadding="2" cellspacing="0" class="counselorstable">
              <tr id="tabletop">
              <td width="162" bgcolor="#000000">ID</td>
              <td width="160" bgcolor="#000000">Name</td>
              </tr>';
    }

    while ($counselor = mysql_fetch_array($counselors)) 
    {
        echo "<tr valign='top'>\n";
        $id = htmlspecialchars($counselor['id']);
        $firstname = htmlspecialchars($counselor['firstname']);
        $lastname = htmlspecialchars($counselor['lastname']);

        echo "<td>$id</td>\n";
        echo "<td>$firstname $lastname</td>\n";
        echo "</tr>\n";
    }
    echo '</table><br />';
}
?>

4 个答案:

答案 0 :(得分:1)

原因如下:

$counselor = mysql_fetch_array($counselors);
if(empty($counselor)) {
}

....    

while ($counselor = mysql_fetch_array($counselors)) {

第一个电话是检查你看到了多少行,但你正在加载第一个要做的事情;当你开始循环时,你正在加载第二行及以后的行。您可以做的是使用mysql_num_rows查看您是否有任何行:

if (mysql_num_rows($counselor)) {
     echo 'There are rows';
}

但请注意,您正在使用mysql_*函数 - 从PHP 5.5版本开始,这些函数已被弃用,这意味着它们将停止工作。你应该看一下使用mysqli_或PDO。

答案 1 :(得分:1)

您在这里创建一个带编号的数组,然后尝试引用$counselor的'id'键。你需要一个关联数组。

变化:

while ($counselor = mysql_fetch_array($counselors)) 
    {
        echo "<tr valign='top'>\n";
        $id = htmlspecialchars($counselor['id'])
        ...

要:

while ($counselor = mysql_fetch_assoc($counselors)) 
    {
        echo "<tr valign='top'>\n";
        $id = htmlspecialchars($counselor['id'])
        ...

你在这里也遇到了一些其他奇怪的事情,比如你最初获取数组(执行if / else语句),然后再次获取它并执行while循环,所有在另一个while循环的里面。这是一个很大的处理开销,会使你的脚本比它需要的速度慢得多。

一些建议:

  • 了解如何在数据库中使用SQL Joins以进行单个查询并一次性返回所有数据。 SQL比这样的php循环速度快得多。

  • mysql_xxxx extension is deprecated由于种种原因,您不应该使用它。请查看PDO,或至少mysqli

  • 如果您不能这样做,而不是获取结果数组以确定它是否为空,请使用mysql_num_rows简单地计算结果中的行数并且如果结果是&gt;则执行while循环0

答案 2 :(得分:0)

检查查询是否为空:

 $counselors = mysql_query("SELECT id, firstname, lastname, counselorid, meritbadgeid FROM counselorstable, meritbadgetocounselortable WHERE id=counselorid AND meritbadgeid='$badgenumber' ORDER BY lastname");

    if(mysql_num_rows($counselors)) 
    {
...


并获取结果

while ($counselor = mysql_fetch_assoc($counselors)) 
    {
        echo "<tr valign='top'>\n";
        $id = htmlspecialchars($counselor['id'])
...

您可以访问以下网站:

答案 3 :(得分:0)

你的while循环中的代码块没有为你检索的第一行执行,而是在循环之前回来。

循环中的“fetch”操作在输出第一行之前检索下一行,覆盖第一行的值。

这就是问题所在。

在不对代码进行任何重大重组的情况下,狐狸的一种方法是使用do { } while循环代替while循环,并将该循环移至上一个{{1阻止,只有在你已经获取了一行时才执行它。 (只需移动循环下方else的右括号。)

else循环确保循环中的操作至少执行一次,这意味着在获取第二行之前,第一行中的值将被处理(回显到页面)。 / p>

例如:

do { } while

这不是“最佳”解决方案。这只是一个例子,指出你的代码中发生了什么,并且只是一种可能(虽然不优雅)的方式来重新组织代码,以便它不会“跳过”第一行。 (你拿到它,只是不把它放到屏幕上。)

正如其他人无疑会发表评论一样,else { echo '<h2>Merit Badge: ' . $badge_name . '</h2> <table width="950" border=1 cellpadding="2" cellspacing="0" class="counselorstable"> <tr id="tabletop"> <td width="162" bgcolor="#000000">ID</td> <td width="160" bgcolor="#000000">Name</td> </tr>'; do { echo "<tr valign='top'>\n"; $id = htmlspecialchars($counselor['id']); $firstname = htmlspecialchars($counselor['firstname']); $lastname = htmlspecialchars($counselor['lastname']); echo "<td>$id</td>\n"; echo "<td>$firstname $lastname</td>\n"; echo "</tr>\n"; } while ($counselor = mysql_fetch_array($counselors)) ; } 界面已被弃用;你应该使用mysqli或PDO。