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

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

$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>';
}
 Dhaivat Pandya20 мая 2012 г., 03:37
Запросы безопасны, но это не главное. Нет проверки ошибок и других проблем с функциями PHP mysql_.
 Norse20 мая 2012 г., 03:36
Экранированные запросы очень безопасны ...
 Dhaivat Pandya20 мая 2012 г., 03:36
 Dhaivat Pandya20 мая 2012 г., 03:34
Пожалуйста, используйте PDO вместо опасных функций mysql_.
 ariel20 мая 2012 г., 03:35
Привет, новичок в PHP. В каком месте вы рекомендуете получить информацию о том, как использовать запросы PDO?

Ответы на вопрос(3)

ка (см .: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/) или сфинкс (см .:http://sphinxsearch.com/).

Решение Вопроса

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']);
}

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

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"] )
  );
}

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

print_r( $names ); // or $set
Redundant Actions

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

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

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

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

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

Ваш ответ на вопрос