Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP查询未显示所有结果_Php_Mysql - Fatal编程技术网

PHP查询未显示所有结果

PHP查询未显示所有结果,php,mysql,Php,Mysql,我有一个包含3个表的数据库。一个表包含人员,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个显示每个类别中所有人的报告。由于某些原因,我的查询没有显示每个类别中的第一条记录,我无法确定如何修复它 代码: 原因如下: $counselor = mysql_fetch_array($counselors); if(empty($counselor)) { } .... while ($counselor = mysql_fetch_array($counselors))

我有一个包含3个表的数据库。一个表包含人员,另一个表包含类别,第三个表是多对多关系表。我的php文件是一个显示每个类别中所有人的报告。由于某些原因,我的查询没有显示每个类别中的第一条记录,我无法确定如何修复它

代码:


原因如下:

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

}