Поисковичек с использованием rlike, вообщем php, mysql

программирование php MySQL поиск

Проблема заключается по моему в mysql_affected_rows(), так как оно выдаёт ноль.
А началось всё с :
------
$search = str_replace(" ","|",$query);
$logic = $search==$query?'OR':'AND';
$q = 'SELECT * FROM articles WHERE text RLIKE "'.$search.'" '.$logic.' h1 RLIKE "'.$search.'" '.$logic.' author RLIKE "'.$search.'" '.$logic.' year RLIKE "'.$search.'" '.$logic.' disc RLIKE "'.$search.'" '.$logic.' meta RLIKE "'.$search.'"';
------
так как напрочь отказывается работать с RLIKE "слово|слово" OR/AND.
С LIKE еще работал, но увы мне хочется чтобы можно было много слов одновремено и одно.

Весь код(попытался привести в более менее норм. состояние):

function search ($query)
{
$query = trim($query);
$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);

if (!empty($query))
{
if(strlen($query) < 3) {$text = '<p>Слишком короткий поисковый запрос.</p>';}
else if(strlen($query) > 128){$text = '<p>Слишком длинный поисковый запрос.</p>';}
else{
$search = str_replace(" ","|",$query);
$logic = $search==$query?'OR':'AND';
echo $search." ".$logic;
$q = 'SELECT * FROM articles WHERE text RLIKE "'.$search.'" '.$logic.' h1 RLIKE "'.$search.'" '.$logic.' author RLIKE "'.$search.'" '.$logic.' year RLIKE "'.$search.'" '.$logic.' disc RLIKE "'.$search.'" '.$logic.' meta RLIKE "'.$search.'"';
$result = mysql_query($q);

if (mysql_affected_rows() > 0) {
$row = mysql_fetch_assoc($result);
$num = mysql_num_rows($result);

$text = '<p>По запросу <b>'.$query.'</b> найдено совпадений: '.$num.'</p>';

do {
// Делаем запрос, получающий ссылки на статьи
$q1 = "SELECT id FROM articles WHERE id = '$row[page_id]'";
$result1 = mysql_query($q1);

if (mysql_affected_rows() > 0) {
$row1 = mysql_fetch_assoc($result1);
}

$text .= '<p><a href="/article?p='.$row['uniq_id'].'" title="'.$row['author'].'">'.$row['h1'].'</a></p>
<p>'.$row['disc'].'</p>';

} while ($row = mysql_fetch_assoc($result));
}
else{$text='<p>По вашему запросу ничего не найдено.</p>';}
}
} else {$text='<p>Задан пустой поисковый запрос.</p>';}

return $text;
}
if (!empty($_POST['query'])) {
$search_result = search ($_POST['query']);
echo $search_result;
}
Ответы:
affected_rows в вашем случае всегда будет равен 0, поскольку вы не затрагиваете строки, не меняете их, а только считываете. affected_rows возвращает число измененных/вставленных строк.
Из документации по mysql_affected_rows: Возвращает количество рядов, затронутых последним INSERT, UPDATE, REPLACE или DELETE запросом
Кстати, если речь о поисковике, не лучше ли использовать специализированные решения, где есть кое-что помощнее сравнений по регуляркам (например, расчет релевантности, учет морфологии, использование фасетов). Например, Яндекс.Сервер (уже не поддерживается Яндексом, но дистрибы найти можно) или Sphinx.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.