Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Общие вопросы > Поиск по сайту. |
Автор: VoTeR 20.1.2006, 16:11 |
Сделал поиск. все работает. теперь остается: 1. Во время поиска большие буквы воспринимались как маленькие и наоборот 2. Чтобы были 2 функции: 1. Чтобы искалось строгое соответствие(все слова чтобы находил) 2. Чтобы искал хотябы одно слово из поля поиска 3. Если ничего не находил чтобы писал "поиск не дал результатов" |
Автор: AztEK 20.1.2006, 16:36 |
Одна тема - один вопрос! 1. strtoupper и strtolower 2. Много вариантов: запрос преобразовывать в массив. если ф-ция "И", то смотреть: если оба слова в этом массиве(inarray()), то пихать найденное в массив рез-тов. 3. Пихать всё найденное в массив. а если в конце массив пуст - выводить "Нет рез-тов" |
Автор: VoTeR 20.1.2006, 17:10 |
1. спасибо, сделал. Эх, надо чтобы при поиске просто на регистр внимания не обращил запрос. а то немного нетак ищет 3. сделал без массива 2. я не знаю массвов ![]() |
Автор: AztEK 20.1.2006, 18:08 |
Как это?? Читай тогда мануалы и книги. Поищи в этом форуме ссылки. Массивами самое разумное имхо. |
Автор: VoTeR 20.1.2006, 18:22 |
Кароче с 1. я справился с помощью LIKE, теперь он ищет все правильно.... но мне теперь надо, чтобы найденный текст выделялся другим font. и вот тут то мне и надо с буквами. например: И воспринималась как и, И. И шрифт менялся.. а у меня шрифт меняется с учетом регистра - непорядок. Далее... со 2 и 3 я почитал мануал и кое-де что-то понял, но ![]() Хотелось бы посомтреть как правильно sql запрос в него пихать --- Как понять сколько слов в поле ввода? |
Автор: VoTeR 20.1.2006, 19:19 | ||
ЛЮДИ!!! помогите мне плиз! четко задавал вопросы. читал мануал http://php.rinet.ru/manual/ru/function.in-array.php Конкретный вопрос, точнее 2. 1. Как правильно запихнуть sql запрос в массив вроде так
2. Как ЭТОМУ запросу объяснить, что тут не одно слово введено а несколько!!!!! и во время поиска чтобы искал не 2 соседних слова(которые введены) и например в поле введено: Привет и пока. А текст в котором введется поиск привет траляля и пока. Он должен выделить Привет пока |
Автор: wsr 20.1.2006, 23:50 |
VoTeR Во первых запрос еще нужно выполнить! А уж потом в нем что либо искать! |
Автор: VoTeR 21.1.2006, 00:03 |
и как его выполнить?? я написал то что думал в коду. прошу исправить. если можно не просто это не так это нета, а привести пример или указать куда можно заглянуть и где я смогу прочитав понять. манул не предлагать, он галимо написан для новичков. |
Автор: Kefir 21.1.2006, 01:06 | ||
кидаем результаты поиска в массив:
Добавлено @ 01:08 И, кстати, инфу о том как работать с массивами и MySQL можно найти в любом количестве. На форуме это тоже должно быть. |
Автор: VoTeR 21.1.2006, 11:55 | ||
Спасибо, но, к сожалению, это не решает нечуточки проблему со словами. + к этому как вывести содержимое поля $name?
не работает. |
Автор: Kefir 21.1.2006, 12:27 | ||||
эммм... какую проблему со словами?? Строгий поиск - просто LIKE "%search_string%" Хотя бы одно слово: field1 LIKE "%search1%" OR field2 LIKE "%search2%" Если такой поиск тебе не подходит, то почитай про http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html. Если ты имеешь в виду то, что тебе надо выделять слова поиска, то это делается так:
Содержимое поля name в случае моего примеры можно вывести так:
Соответственно, вместо 0 мождешь подставить другой номер из результата. |
Автор: VoTeR 21.1.2006, 13:08 |
угу. я это и имел ввиду ![]() Добавлено @ 13:14 Но оно не хочет работать!!! ![]() А теперь что получатеся: пишу в поле поиска : вот и А он мне ничего не находит ![]() |
Автор: Kefir 21.1.2006, 13:16 |
какой запрос к БД ты используешь? Добавлено @ 13:19 Только что сделал запрос SELECT * FROM pages WHERE content like '%Menu nr 4 here%' or content like '%toetajad%' к своей базе и получил два результата с совпадениями... работает. Конкретнее, пж-ста. Добавлено @ 13:20 И, кстати, у тебя вообще есть чего находить??? |
Автор: VoTeR 21.1.2006, 13:31 | ||||
кароче вот запрос:
а вот структура таблицы stati
В поле поиска ввожу: "название текст"(без ковычек) А он мне нечего не находит.... Хотя, как я понимаю, должен найти и то и другое слово....только в разных таблицах... +мне надо чтобы слова выделялись разного регистра. например буква "п" выделялалсь как"П" и "п". А тут она выделяется в том же регистре, котором я ищу. а если str_replace заменить на eregi_replace, то вообще перестанет что либо выделяться. |
Автор: Kefir 21.1.2006, 13:54 | ||
1. сделай после формирования запроса в БД echo $q; - чтобы посмотреть какой на самом деле твой запрос. запости сюда. 2. после mysql_query сделай echo mysql_error(); Результаты запости сюда. Будем разбираться. Кстати, если хочешь чтобы твой код был понятен и по его поводу не возникало много вопросов - 1. каменти как и откуда идут переменные. 2. форматируй нормально плиз. Добавлено @ 13:58
в разных столюцах (field). запости код где ты определяешь сам $search_name - у тебя в запросе непонятное что-то творится. Не понимаю, почему одна и та же переменная ищется в обоих полях. |
Автор: VoTeR 21.1.2006, 14:08 | ||
И так по порядку: 1.Результат echo $q; select * from stati where text like '%КПК%' or name like '%смартфоны%' and kat='КПК' order by id desc 2.Результат echo mysql_error(); Ничего он не вывел 3.Теперь про $search_name
$search_name это название поля, через которое я ищу. Вроде все... а тут коментировать? вроде все понятно. |
Автор: Kefir 21.1.2006, 14:32 | ||||
Очень интересно каким образом переменная $search_name даёт в одном месте значение "КПК", а в другом "смартфоны". Я всегда считал это невозможным. Скинь полностью исходники. А то так у тебя такие парадоксы, что ничего не понятно. |
Автор: VoTeR 21.1.2006, 14:50 | ||
Держи
|
Автор: Kefir 21.1.2006, 15:18 | ||
гм... в общем несколько замечаний: 1. используй глобальные переменные ($_GET, $_POST etc.) 2. неправильно сделан запрос к базе. $search_name сначала надо разбить на слова и затем каждое слово искать при помощи LIKE. 3. так и не понял где вообще коннект к бд... где закрытие соединения... хотя главное, чтобы оно просто было ![]() Твои дальнейшие действия: После
ставишь echo $q; и смотришь какой запрос у тебя генерируется. Затем открываешь MySQL Query Browser или phpMySQL admin или любой другой фронтэнд для произведения запроса к БД и пытаешься выполнить тот запрос, который тебе показал скрипт (echo $q). Затем если всё хорошо, но результат не такой как ты хочешь, ищешь логическую ошибку в запросе и пытаешься её устранить. Если выполнение запроса возвращает ошибку опять же смотришь где напортачил и исправляешь. Итак, на данной стадии ты должен уже знать какой запрос должен генерировать твой скрипт для того чтобы БД возвращала нужные записи. Теперь ты пишешь ПХП, генерирующий нужный запрос. Таким образом, ты сможешь дойти до того, что твой код будет работать. Добавлено @ 15:19 да, и ещё, если что-то не понимаешь - RTFM. И уж потом сюда. |
Автор: VoTeR 21.1.2006, 15:40 | ||
конект к БД идет на гл. странице.делаю запрос после разбиения поля на слова он пишет: select * from stati where text like '%Array%' or name like '%Array%' and kat='КПК' order by id desc
|
Автор: Kefir 21.1.2006, 16:03 | ||
ну дык ясно что он будет слово Array подставлять. Даю пример того как должен выглядеть запрос при строке поиска "я хочу найти что-нибудь эдакое"
Это поиск по полю text. |
Автор: VoTeR 21.1.2006, 16:37 |
Ясно. я сделал, чтобы он искал по первому слову. но я же не знаю сколько кто будет вводить слов в поле поиска! и вообще как сделать, чтобы он определял сколько слов в поле, а потом подставлял в запрос каждое слово. типа text like '%$search_bits[$i+1]%' |
Автор: Kefir 21.1.2006, 17:13 | ||
неужели это так сложно??
From now on, you're on your own. |
Автор: VoTeR 21.1.2006, 17:24 | ||||||
А дело в том, что во время запроса он не читает
Я поначалу что-то подобно пытался сделать.. а он не читал то, что между {} Добавлено @ 17:39 Вот код.
а вот что он выдает
На 55 строчке находится $q = "select * from stati where ".implode(" OR ", $query_bits)." and kat='$search_kat' order by id desc"; |
Автор: VoTeR 21.1.2006, 20:34 | ||||
И так получается: Так он производит поиск по последнему слову, котороя я ввел в поле.
А так он ТОЖЕ ищет по последнему слову, но echo он выводит якобы 2 запроса: for($i = 0; $i < count($search_bits); $i++) { $query_bits = array("text LIKE '%".$search_bits[$i]."%'"); $q = "select * from stati where ".implode(" OR ", $query_bits)." and kat='$search_kat' order by id desc"; echo $q.'<br>'; } И так что получается в итоге: нода завпрос разбить на 3 части. и сделать что-то вроде
Этим я сделал(но 100% неправильно) implode(" OR ", $query_bits) должно показываться столько, сколько слов в поле => оно должно находиться между {}. А вот сам запрос НЕ должен копироваться... Ваши мысли, люди. |
Автор: Mal Hack 22.1.2006, 11:25 |
Модератор: VoTeR, ошибки учитесь отлавливать сами. Вам ПХП русским по белому пишет. |
Автор: VoTeR 22.1.2006, 12:16 | ||
Спс. сделал. теперь с выделением как быть? выделяет только первое слово, введено в поле
|