MySQL поиск: 30 символов перед и после искомого слова

Nik2004

Guest
MySQL поиск: 30 символов перед и после искомого слова

Привет братцы, всех с наступающим!
Просьба огромная: протестите если не сложно у себя вот этот скрипт:

<?
echo "<form action=?=search method=post>
поиск:<input type=text name=search>
<input type=submit name=submit value=go>
</form>";
if ($search)
{
$srch="%".$search."%";
$query = "select id, title, msg, substring(msg, case when instr(msg,'$srch')
< 30 then 1 else instr(msg,'$srch') - 30 end, case when instr(msg,'$srch')
< 30 then 30 - instr(msg,'$srch') else 30 end + 30 + length('$srch'))
as excerpt from posts WHERE msg LIKE '%$srch%'";
$result = mysql_query($query);
if ($result)
{
echo "<table width=90% align=center border=1><tr>
</tr>";
while ($r = mysql_fetch_array($result))
{
$id = $r["id"];
$title = $r["title"];
$msg = $r["msg"];
$excerpt = $r["excerpt"];
echo "<tr><td colspan=4 bgcolor=\"#ffffa0\">$title</td>
<td colspan=4 bgcolor=\"#ffffa0\"><a href ='tur.php?show=$id'>$excerpt</a></td></tr>";
}
echo "</table>";
} else { echo "problems...."; }
}
?>

Работает или нет?

Штука полезная: ищет в текстах по ключевому слову и выдает его в окружении 60 символов справа и слева как в Яндексе. У меня же считывает конкретно в msg первые 60 символов + длину искомого слова, хотя по идее не должен. В общем, у меня кажется по странному глючит MySQL, либо глючит сам скрипт, но это вряд ли. Помогите пожалуйста!
 

crocodile2u

http://vbolshov.org.ru
Может, проще будет выбирать строку целиком, а потом скриптом вырезать нужную часть?
 

Nik2004

Guest
То есть насколько я понял скрипт ведет себя у вас так же как у меня, то есть считывает фрагмент с самого начала текста? Да?
 

Nirva

Dmitry Polyakov
Автор оригинала: Nik2004
То есть насколько я понял скрипт ведет себя у вас так же как у меня, то есть считывает фрагмент с самого начала текста? Да?
нет. мой гепотетический скрипт ведет себя не так. мой Г. запрос таки должен выбирать 30 символов + подстрока поиска + зо символов, путем.
внимательно прочитайте мануал по приведенным мною функциям. concat - конкатенация, substr - получение части строки, instr - получение позиции вхождения подстроки в строку.
или что конкретно неясно?
 

Nik2004

Guest
Nirva, вы меня пугаете! Неужели у меня с русским языком еще хуже, чем с языком SQL:))).
Дружище, во-первых, спасибо за ответы в этом топике и желание помочь и разобраться.
Далее, ваш гипотетический скрипт – отдельная интересная тема, но я то пишу о своем конкретном скрипте, который опубликовал в первом посте. Я хотел, чтобы кто-то из участников форума по-дружески или из чистого любопытства скопировал его на свой сервер, протестил в свободную минуту его работу и ответил мне: да, скрипт (конкретный скрипт приведенный мною в первом посте:)) выполняет возложенную на него функцию - выдает ключевое слово в тексте, где оно обнаружено, в окружении 30 символов слева и справа; нет, скрипт не выполняет возложенную на него функцию и выдает 60 символов + длина искомого слова с начала текста, где это слово обнаружено(то, что происходит у меня сейчас). Все! Больше я ничего не прошу. Неужели это так не понятно? Или так трудно?
Для чего мне это нужно? Повторяю, у меня некоторое подозрение на то, что у меня глюченная битая версия MySQL, которая и не запускает скрипт (в случае если он рабочий). Если скрипт будет работать, например, на вашем сервере, Nirva значит мне нужно будет просто залить новый MySQL. Лишний раз загружать его не хочется: N-ное количество метров MySQL + достаточно дорогая и медленная связь. Опять не понятно? Я уже сам запутался! Ладно, Бог с ним со всем. Теперь о главном: счастья, здоровья, успехов в наступающем Новом Году! Удач в программировании и на личном фронте. И, в целом, возрождения и процветания нашей несчастной, многострадальной Родине! Угу?
 

neko

tеam neko
Nik2004
серьезно, а ты не хочешь сделать как тебя советуют зеленые аки елка крокодилы
по моему это куда более чистое решение?
 

Nik2004

Guest
"Крокодилы советуют", это там где выбирается строка целиком, а потом скриптом вырезается нужная часть? Знаю я этот способ. Можно и так, конечно. Но мне почему-то хочется, чтобы эта штучка была чисто SQL-овской. Чисто ради эксперимента. :)
 

SelenIT

IT-лунатик :)
Nirva, alexhemp
вы бы хоть мельком в код из стартового поста заглянули, что ли...

Nik2004
У меня твой запрос вроде бы работает. А у тебя точно возвращает именно 60 симв. + длина подстроки с начала строки? Может, просто искомая подстрока встречалась в первых 30 символах?

All
С наступающим! :)
 

Nik2004

Guest
SelenIT
Ну, наконец-то!!! Нашелся человек, который прочитал не только заголовок, но и в код глянул и протестировал оный. SelenIT спасибо огромное, ты мой друг и брат на все времена:)! Теперь я кажется все понял.

Автор оригинала: SelenIT
Может, просто искомая подстрока встречалась в первых 30 символах?
Нет, SelenIT. Тут проблема лежит глубже. И ее должны знать все, а лохи вроде меня обязательно. Дело в том, что я в данный момент пользуюсь Денвер2. И та старенькая версия MySQL, которая закатана в этот пакет, если я не ошибаюсь, может не поддерживать некоторые функции SQL ( в нашем случае это INSTR или LENGTH) или комбинации этих функций. Поэтому конкретно этот скрипт у меня и не запускался. То есть если ты пытаешься писать или использовать более менее развитые SQL-скрипты на всякий случай нужно обзавестись самой свежей версией MySQL. Вот такую Америку я открыл:) Кстати SelenIT, если не секрет у тебя какая версия MySQL стоит на сервере? SelenIT, с Новым Годом:)!

AlexHemp
SQL функции мне написал Nirva, а Крокодил предложил (если он именно это имел ввиду) считать строку SQLом и вырезать нужную часть PHP-скриптом. То есть комбинация SQL и PHP. Что-то типа:

select msg from posts WHERE msg LIKE '%$srch%'";
$whereisit = strpos($msg, $srch)-30;
$whereisit = $whereisit > 0? $whereisit:0;
$text_out = substr($text_field, $whereisit, 60);
$text_out = str_replace($msg,"<b>$srch</b>",$text_out);
echo "<p>... <i>$text_out</i> ...</p>";

А мне нужно было чисто SQL-овское решение этого вопроса, которое возможно и которое опубликовано в посте №1. Я это имел ввиду:).

All
С Новым Годом!:)
 

SelenIT

IT-лунатик :)
Nik2004
У меня стоит вполне преклонного возраста MySQL 3.23.39.

Да, судя по твоим результатам, INSTR() у тебя возвращает 0 - будто строка не найдена. Кстати, в 3.23 INSTR() всегда различает регистр, в то время как LIKE для не-binary строк не различает. Может, в регистре и корень твоей проблемы?
 

Nik2004

Guest
С наступившим:)!

SelenIT, спасибо за совет. У меня одинаковый результат как в отношении бинарных, так и небинарных строк. Дело наверное не в регистре. Функция INSTR просто не прописана в этой версии. MySQL игнорирует INSTR(LOCATE к стати тоже), не обнаруживает положения подстроки в строке и гонит подстроку по дефолту с первого символа. Прикольно, что если вместо LIKE ставишь = вообще выдает пустоту. Где-то я слышал что функция INSTR впервые появилась именно в твоем MySQL 3.23. Никак не могу определить какая версия MySQL стоит в Денвер2, но если учесть что сам пакет датируется февралем 2003 то можно предположить, что эта версия древнее 3.23 и место ей не на сервере а в палеонтологическом музее:). В общем наверное надо сносить денвер и скачивать свежий MySQL типа 4.1. Да?
 

fixxxer

К.О.
Партнер клуба
Для того, чтобы обновить MySQL, совершенно не обязательно сносить денвер =)
 

Nik2004

Guest
Скачал MySQL 4.0.18. Денвер сносить не стал, просто заменил версию MySQL в нем на эту новую. Работает все корректно (вроде бы). А проблема с instr как была так и осталась:(. Полный п… тупик. Что еще можно попробовать? SelenIT, а что еще в регистре можно изменить :confused: ?
 
Сверху