2013-12-20 288 views
0

我有一个包含3个表的数据库。一个表包含人,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个报告,显示每个类别中的所有人。出于某种原因,我的查询不显示每个类别中的第一条记录,我无法弄清楚如何解决它。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 />'; 
} 
?> 
+0

你在说什么查询?有三个显示(顺便说一句可能会合并成一个单一的查询)。我没有看到这些查询中显示的任何人员或类别表格。请更好地解释。 –

+0

先看看JOIN。 – Strawberry

回答

1

这里的原因:

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

....  

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

,首先调用检查,看看你有多少行了,但你加载第一FOW做到这一点;当你开始循环时,你正在加载第二行和之后的行。你可以做的反而是使用mysql_num_rows看,如果你有任何行:

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

但请注意,您在使用mysql_*功能 - 这些被弃用的PHP 5.5版本,这意味着他们要停止工作。你应该看看使用mysqli_或PDO。

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']) 
     ... 

你还要其他古怪极少数在这里,如果像你最初获取该阵列的事实(做一个/ else语句),然后再次获取它并执行一个while循环,所有在另一个while循环的之内。这是很大的处理开销,并且会使脚本比需要的速度慢得多。

几点建议:

  • 图如何,你可以为了使一个单一的查询和一次性返回所有的数据在数据库中使用SQL Joins。 SQL比这样的php循环快得多。

  • mysql_xxxx extension is deprecated和你不应该使用它的原因太多了。请看PDO,或至少mysqli

  • 如果你不能做任何,而不是获取结果的阵列,以确定它是否是空的,用mysql_num_rows简单计数结果中的行数,做while循环如果结果> 0。

+0

我完全错过了。我认为默认情况下,PHP mysql_fetch_array通过数字索引AND关联返回结果集BOTH。我不知道有一种方法可以在不提供'mysql_fetch_array'参数的情况下更改默认行为。我完全错过了。 – spencer7593

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']) 
... 

您可以访问这些网站:

0

的while循环中的代码块中,无法为你取回,循环之前归途中的第一行中执行。

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

这就是问题所在。

一个办法狐狸,如果没有你的代码的任何重大重组,将使用do { } while环代替while循环,并移动环路成以前else块,使其只执行你已经取得了一排。 (只需将else的右括号移到循环下方。)

A 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)) ; 

} 

这不是 “最好” 的修复。这仅仅是一个例子,指出你的代码中发生了什么,并且只是一种可能的(虽然不雅)的方式来重新组织代码,以便它不会“跳过”第一行。 (您正在提取它,只是没有把它放到屏幕上。)

正如其他人会毫无疑问的评论,mysql_接口已被弃用;你应该使用mysqli或PDO。