2013-12-20 3 views
0

У меня есть база данных с 3 таблицами. Одна таблица содержит людей, другая таблица содержит категории, а третья таблица - это много для многих таблиц отношений. Мой php-файл - это отчет, показывающий всех людей в каждой категории. По какой-то причине мой запрос не отображает первую запись в каждой категории, и я не могу понять, как ее исправить.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

Какой вопрос вы говорите? Есть три показанных (которые, кстати, могут быть объединены в один запрос). Я не вижу ни одного человека или таблицы категорий, показанных в этих запросах. Пожалуйста, лучше объясните. –

+0

Сначала см. ПРИСОЕДИНЕНИЕ. – Strawberry

ответ

1

Вот почему:

$counselor = mysql_fetch_array($counselors); 
if(empty($counselor)) { 
} 

....  

while ($counselor = mysql_fetch_array($counselors)) { 

Это первый вызов проверки, чтобы увидеть, сколько строк у вас есть, но вы загружаете первый Fow, чтобы сделать это; Когда вы начинаете цикл, вы загружаете вторую строку и далее. Что вы можете сделать вместо этого использовать mysql_num_rows, чтобы увидеть, если у вас есть какие-либо строки:

if (mysql_num_rows($counselor)) { 
    echo 'There are rows'; 
} 

Но обратите внимание, что вы используете mysql_* функции - те, являются устаревшими в версии 5.5 РНР, что означает, что они собирается прекратить работать. Вместо этого вы должны использовать mysqli_ или PDO.

1

Здесь вы создаете нумерованный массив, а затем пытаетесь ссылаться на ключ «id» $counselor. Вместо этого вам нужен ассоциативный массив.

Изменение:

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

Вы тоже получили несколько других странностей здесь, как и тот факт, что вы, забирающий массив изначально (если делать/else), а затем снова извлечение и выполнение цикла while, все внутри другого цикла while. Это большая часть накладных расходов на обработку и сделает ваш скрипт исключительно медленнее, чем нужно.

Некоторые предложения:

  • Рисунок, как вы можете использовать SQL Joins в вашей базе данных, чтобы сделать один единственный запрос и вернуть все данные на одном дыхании. SQL бесконечно быстрее, чем петля php.

  • mysql_xxxx extension is deprecated и по целому ряду причин вы не должны его использовать. Посмотрите на PDO, или, по крайней мере, mysqli.

  • Если вы не можете сделать что-либо, вместо выборки массива результатов определить, является ли он пустым, использовать mysql_num_rows просто счетчика количество строк в результате и сделать время цикла, если результат> 0.

+0

Я полностью пропустил это. Я думал, что по умолчанию PHP mysql_fetch_array возвращает набор результатов BOTH с помощью числового индекса AND по ассоциации. Я не знал, что есть способ изменить это поведение по умолчанию, не поставляя аргумент в 'mysql_fetch_array'. Я полностью пропустил это. – spencer7593

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

Вы можете посетить эти сайты:

0

Этот блок кода внутри вашего цикла, пока не получает выполняется для первой строки вы извлеченной, путь назад перед циклом.

Операция «выборки» в цикле возвращает следующую строку, перезаписывая значения для первой строки, прежде чем вы выведете первую строку.

В этом проблема.

Один из способов лисицы, что, без какой-либо существенной реструктуризации вашего кода, будет использовать 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.

Смежные вопросы