PHP查询未显示所有结果
我有一个包含3个表的数据库。一个表包含人员,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个显示每个类别中所有人的报告。由于某些原因,我的查询没有显示每个类别中的第一条记录,我无法确定如何修复它 代码:PHP查询未显示所有结果,php,mysql,Php,Mysql,我有一个包含3个表的数据库。一个表包含人员,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个显示每个类别中所有人的报告。由于某些原因,我的查询没有显示每个类别中的第一条记录,我无法确定如何修复它 代码: 原因如下: $counselor = mysql_fetch_array($counselors); if(empty($counselor)) { } .... while ($counselor = mysql_fetch_array($counselors))
原因如下:
$counselor = mysql_fetch_array($counselors);
if(empty($counselor)) {
}
....
while ($counselor = mysql_fetch_array($counselors)) {
第一个调用是检查您有多少行,但您正在加载第一个fow来执行此操作;启动循环时,您正在加载第二行及以后的内容。您可以使用mysql\u num\u rows
查看是否有行:
if (mysql_num_rows($counselor)) {
echo 'There are rows';
}
但是请注意,您使用的是
mysql.*
函数,这些函数在PHP的5.5版本中已被弃用,这意味着它们将停止工作。您应该考虑改用mysqli_uu.或PDO。您在此处创建一个编号数组,然后尝试引用$consucer的'id'键。您需要一个关联数组
更改:
while ($counselor = mysql_fetch_array($counselors))
{
echo "<tr valign='top'>\n";
$id = htmlspecialchars($counselor['id'])
...
while($consucer=mysql\u fetch\u数组($consucers))
{
回音“\n”;
$id=htmlspecialchars($consultor['id']))
...
致:
while($consucer=mysql\u fetch\u assoc($consucers))
{
回音“\n”;
$id=htmlspecialchars($consultor['id']))
...
这里还有一些其他的奇怪之处,比如,您最初获取数组(执行if/else语句),然后再次获取数组并执行while循环,所有这些都在另一个while循环中。这是一个很大的处理开销,会使脚本比需要的速度慢得多
一些建议:
- 弄清楚如何在数据库中使用,以便进行一次查询并一次性返回所有数据
- 由于很多原因,您不应该使用它。请查看
PDO
,或者至少查看mysqli
- 如果两者都做不到,请使用
mysql\u num\u 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($consucer=mysql\u fetch\u assoc($consucers))
{
回音“\n”;
$id=htmlspecialchars($consultor['id']))
...
您可以访问以下网站:
while循环中的代码块不会在检索到的第一行执行,而要追溯到循环之前
在输出第一行之前,循环上的“fetch”操作检索下一行,覆盖第一行的值
这就是问题所在
一种不需要对代码进行任何重大重构的方法是使用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)) ;
}
else
{
回音“奖章:”.$Badge_name
身份证件
名称
';
做
{
回音“\n”;
$id=htmlspecialchars($consultor['id']);
$firstname=htmlspecialchars($consultor['firstname']);
$lastname=htmlspecialchars($consultor['lastname']);
回显“$id\n”;
回显“$firstname$lastname\n”;
回音“\n”;
}而($consucer=mysql_fetch_数组($consucers));
}
这不是“最佳”修复。这只是一个说明,指出代码中发生了什么,并且只是一种可能的(尽管不雅观)方法来重新组织代码,使其不会“跳过”第一行。(您正在获取代码,而不是将其放到屏幕上。)
正如其他人毫无疑问会评论的那样,mysql\uu
接口已被弃用;您应该使用mysqli或PDO。您在谈论哪个查询?这里显示了三个查询(顺便说一句,它们可能组合成一个查询)。我没有看到这些查询中显示任何人员或类别表。请更好地解释。我完全没有看到。我认为默认情况下,PHP mysql_fetch_数组通过数字索引和关联返回结果集。我不知道有什么方法可以在不在mysql_fetc上提供参数的情况下更改默认行为h_数组
。我完全没有想到。
while ($counselor = mysql_fetch_assoc($counselors))
{
echo "<tr valign='top'>\n";
$id = htmlspecialchars($counselor['id'])
...
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)) ;
}