簡體   English   中英

PHP查詢未顯示所有結果

[英]PHP query not showing all results

我有一個包含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 />';
}
?>

原因如下:

$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。

你在這里創建一個帶編號的數組,然后嘗試引用$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擴展 ,由於種種原因,您不應該使用它。 看看PDO ,或者至少是mysqli

  • 如果您不能這樣做,而不是獲取結果數組以確定它是否為空,請使用mysql_num_rows簡單地計算結果中的行數,如果結果> 0則執行while循環。

要檢查查詢是否為空:

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

您可以訪問這些網站:

你的while循環中的代碼塊沒有為你檢索的第一行執行,而是在循環之前返回。

在輸出第一行之前,循環上的“fetch”操作將檢索下一行,覆蓋第一行的值。

那就是問題所在。

在沒有對代碼進行任何重大重組的情況下,fox的一種方法是使用do { } while循環代替while循環,並將該循環移動到前一個else塊中,這樣只有在你執行時它才會被執行已經取得了一排。 (只需移動右括號為else環路下方。)

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM