我有一个包含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 />';
}
?>
答案 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。