[英]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.