PHP - отображать ошибку, если поиск не удался - PullRequest
1 голос
/ 20 мая 2011

У меня проблемы со сценарием поиска.

В принципе, все в порядке с поиском, если результат найден, но если в БД (MySQL) нет совпадений, то моя ошибка не отображается .. Я что-то упустил? вот код:

<?php
$term = $_GET['term'];
$sql = mysql_query("select * from search_e where content like '%$term%'");
while ($row = mysql_fetch_array($sql)){ 
$data = $row['content'];
$first_pos = strpos($data,$term);
if ($first_pos !== false) {
                  $output = substr($data,max(0,$first_pos - 100),200 + strlen($term));?>


<div>
<p class="ptitle"><?php echo $row["fn"]; ?></p><hr>
            Brief summary of contents:
            <hr class="hr">
            <p style="padding: 5px;">
        <i>"<?php echo $output; ?>" </i>..
            </p>


</div><br><br>
<?php
}
else  {?>
<div><?php echo "Sorry! No results were found using term: ".$_GET['term']."<br>Try using fewer Keywords"; ?></div>
<?php }?>
<?php
}
//close
    mysql_close();

?>

Это может быть что-то простое, я делаю неправильно, но я просто не могу понять это. Также я знаю, что код грязный, но его как я работаю.

Я также надеялся реализовать небольшой фрагмент, который я нашел, просматривая сеть, который выделяет конкретные слова в фразе.

function highlight($sString, $aWords) {
    if (!is_array ($aWords) || empty ($aWords) || !is_string ($sString)) {
        return false;
    }

    $sWords = implode ('|', $aWords);
    return preg_replace ('@\b('.$sWords.')\b@si', '<strong style="background-color:yellow">$1</strong>', $sString);
}

Возможно ли работать в моем сценарии ??

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Ваша логика несовершенна:

  1. получить все строки в базе данных, содержащие ваш поисковый запрос
  2. цикл по этим строкам:
    2а. восстановить строку
    2b. поиск строки СНОВА, используя PHP, для поиска
    2с. отображать содержимое, если оно найдено, или отображать ошибку, если это не так. Сделайте это для каждого ряда

Почему PHP повторно ищет контент, если он уже отфильтрован базой данных? Кроме того, поскольку запрос к базе данных не будет возвращать ни одну из строк, в которых ваш контент НЕ отображается, вы никогда не увидите сообщение об ошибке, так как ваш поиск php будет выполняться каждый раз.


поток в основном должен быть таким:

$term = mysql_real_escape_string($_GET['term']);

$sql = "SELECT .... WHERE content LIKE '%$term%'";
$result = mysql_query($sql) or die(mysql_error());

if (mysql_num_rows($result) == 0) {
   echo "Sorry, no results found"
} else {
   while ($row = mysql_fetch_assoc($result)) {
       ... do your output processing here ...
   }
}
2 голосов
/ 20 мая 2011

Если мне ясно, что вы пытаетесь достичь, я бы изменил это так:

if(mysql_num_rows($sql) > 0) {
    while ($row = mysql_fetch_array($sql)) { 
        ...
    }
} else {
    echo("No Records!");
}

И барфун - это правильно.Защитите свой веб-сайт и базу данных от злоумышленников.

$term = mysql_real_escape_string($_GET['term']);

Редактировать

Для полноты информации, после просмотра того, что вы опубликовали, причина, по которой вы не получаете выводпотому что если совпадений не найдено, то ничего внутри цикла while не будет выполнено, поэтому ваша проверка if($first_pos !== false) не имеет смысла, кроме как своего рода «проверка работоспособности» для записей, которые действительно совпадают.

Чтобы выделить слова, используя опубликованную вами функцию, измените:

<i>"<?php echo $output; ?>" </i>

На:

<i>"<?php echo highlight($output, array( $term )); ?>" </i>
...