Почему этот запрос показывает только один результат?

В следующем запросе будет использован скрипт поиска. По какой-то причине он не будет возвращать все результаты, когда любое условие истинно. Что я делаю не так?

$sql = "SELECT name, id_code from codes WHERE name LIKE '%$q%' OR id_code LIKE '%$q%'"; $result = mysql_query($sql); $query = mysql_query($sql) or die ("Error: ".mysql_error()); $num_rows1 = mysql_num_rows($result); if ($result == "") { echo ""; } echo ""; $rows = mysql_num_rows($result); if($rows == 0) { print("<div id=norequests>No results for <strong>$q</strong></div>"); } elseif($rows > 0) { while($row = mysql_fetch_array($query)) { $name = htmlspecialchars($row['name']); $code = htmlspecialchars($row['id_code']); } print("$code: $name<br /> <br />"); } } else{ echo '<div id="error">No results for $q.</div>'; } 

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

Либо печать внутри цикла

 while($row = mysql_fetch_array($query)) { $name = htmlspecialchars($row['name']); $code = htmlspecialchars($row['id_code']); print("$code: $name<br /> <br />"); } 

или собирать переменные в массиве во время цикла и использовать их после цикла, как вам нравится

 $result_array = array(); while($row = mysql_fetch_array($query)) { $name = htmlspecialchars($row['name']); $code = htmlspecialchars($row['id_code']); $result_array[] = array( 'name' => $name, 'code' => $code ); } print_r($result_array); 

Ваш цикл перезаписывает значение $name и $code с каждым циклом, поэтому все, что вы в конце концов увидите, это значение последнего цикла.

 while( $row = mysql_fetch_array( $query ) ) { $name = htmlspecialchars($row['name']); $code = htmlspecialchars($row['id_code']); } 

Вы можете отбросить эти значения из своего цикла или направить их в коллекцию где-нибудь:

 while ( $row = mysql_fetch_array( $query ) ) { $names[] = htmlspecialchars( $row["name"] ); $codes[] = htmlspecialchars( $row["id_code"] ); } 

Или вы можете поместить оба значения в один массив:

 $set = array(); while ( $row = mysql_fetch_array( $query ) ) { $set[] = array( "Name" => htmlspecialchars( $row["name"] ), "Code" => htmlspecialchars( $row["id_code"] ) ); } 

На этом этапе вы загрузили все имена и коды в массивы (или массив), которые можно манипулировать после того, как ваш цикл запустил курс.

 print_r( $names ); // or $set 

Резервированные действия

Кроме того, у вас есть избыточный код:

 $result = mysql_query($sql); $query = mysql_query($sql) or die ("Error: ".mysql_error()); 

Это дважды выполнит ваш запрос – нет необходимости в этом.

 $num_rows1 = mysql_num_rows($result); $rows = mysql_num_rows($result); 

Это подсчет количества возвращаемых строк дважды. Опять же, нет необходимости в этом.

Вы действительно не должны использовать MySQL для полнотекстового поиска (см .: http://en.wikipedia.org/wiki/Full_text_search ). Вместо этого рассмотрите возможности полнотекстового использования MySQL: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html . Или, возможно, даже лучше, используйте «реальную» полнотекстовую поисковую систему, такую ​​как Lucene (см .: http://lucene.apache.org/ ) или Sphinx (см .: http://sphinxsearch.com/ ).