Построение Простой Булевой Поисковой машины с PHP / MySQL
Новая Выпущенная Версия! 11 сентября 2008
PHP / MySQL Булевая Версия 2.6 Поиска был загружен 5407 раз с 11 сентября 2008.
Испытывают это! » .
Пожалуйста отметьте: версия архива почтового индекса, загруженного первыми 16 посетителями, отсутствовал, несколько файлов в / включает справочник. Эти файлы были неизменны от версии 2.5, так, если Вы имеете, что версия Вы можете просто снова использовать те документы; иначе Вы должны загрузить это снова! Жаль!
следующие файлы были изменены в этом выпуске:
- /dolson-search-2.6/index.php
- /dolson-search-2.6/search.php
- /dolson-search-2.6/includes/config.php
- /dolson-search-2.6/includes/functions.php
- /dolson-search-2.6/includes/en.php
Этот пакет содержит следующие файлы:
/dolson-search-2.5/readme.txt(инструкции и дополнительная информация)index.php(подлинник по умолчанию включают страницу),mysql_connect.php(настраивают к Вашему databse)search.php(главный подлинник поиска)default_styles.css(моделирование по умолчанию для продукции результатов поиска)spellcheck.sql(правописание исправлений вопрос SQL)/includes/config.php(главная конфигурация)en.php(английский языковой файл)functions.php(отделенные функции для подлинника поиска.)searchform.php(форма)результаты-dl.php, results-dl-header.php(шаблоны для списка определения отформатировали результаты),результаты-table.php, results-table-header.php(шаблоны для табличных отформатированных результатов)
Дополнения и Изменения в Версии 2.5
- Добавленный: Сделанный ряд, выдвигающий на первый план доступный и в табличных и в основанных на списке результатах поиска.
- Добавленный: Критерии поиска теперь выдвинуты на первый план в результатах поиска.
- Добавленный: вид по умолчанию должен теперь заказать результаты уместностью вопроса.
- Добавленный: Нумеровавшая страницы навигация результатов поиска теперь доступна.
- Добавленный: файл основы Перевода [английский язык], так перевод подлинника легче.
- Добавленный: Основная Проверка орфографии [английский язык]
- Добавленный: Неплатеж stylesheet
- Измененный: Текстовые выдержки являются теперь усеченными в границах слова, а не в середине слов.
- Измененный: отделенная информация шаблона результатов во внешний включает файлы для более легкой модернизации или модификации.
- Измененный: Включенный форма поиска как часть подлинника так, чтобы критерии поиска могли быть автоматически возвращены к входу поиска.
Загрузка PHP подлинник и образец формируют . База данных, не включенная.
Изменения Между Версиями 1.5 и 2.0
- Неподвижный: различные незначительные ошибки
- Неподвижный: многостраничные результаты, не доступные с указанными последовательностями
- Неподвижный: проблема вопроса полного текста
- Неподвижный: некоторая совместимость выходит с различными конфигурациями PHP/MySQL.
- Добавленный: поддающиеся сортировке результаты
- Добавленный: конфигурируемый полевой лейбл называет
- Добавленным: типовая страница результатов
- Добавленный: испытательный способ для того, чтобы расследовать.
Версия 2.0 была загружена 2612 раз между 21 октября 2007 и 3 августа 2008. Версия 1.5 была загружена 1954 раза между 18 ноября 2006 и 21 октября 2007. Никакая версия не доступна для загрузки.
предыдущая версия была загружена 480 времена между 14 мая и 18-ого ноября 2006, и была загружена 788 раз с тех пор.
- Больше о Булевом Фаллтексте подвергает сомнению в MySQL
- Простой опрос в PHP и MySQL
- Пример этого инструмента поиска
- Обрабатывающие Формы с PHP , Гид Новичка
, Когда я сначала начинал работать с PHP, и MySQL базировал вебсайты, я имел большую проблему, находящую эффективные средства слияния простой PHP-управляемой поисковой машины. Мои требования были довольно просты - это должно было быть в состоянии к , исследуют базу данных на фразы поиска и обеспечивают связи назад с теми страницами. Я наконец сделал , находят основную поисковую машину , но с тех пор добавили много дополнительных особенностей к этому включая основной Булевый поиск и основной защита против нападений инъекции SQL. Этот документ пробегает часть абсолютного кода и основы того, как это работает!
Предупреждение: этот подлинник потребует настройки. Вы будете нуждаться в по крайней мере умеренной ручке на переменных PHP, множествах, и базе данных MySQL
команды, чтобы быть в состоянии работать с этим. новая версия существенно упрощен с точки зрения установки и настройки. Хотя
использование будет все еще конечно требоваться некоторое знание PHP, дополнение файла конфигурации упростило это существенно.
Особенности Инструмента Поиска
- Булевая поддержка "OR" и "AND" вопросы.
- Поддержка целого диапазона полного текста MySQL булевые вопросы.
- Точная фраза, ищущая
(Неплатеж.)Точный поиск фразы больше не поиск по умолчанию. Неплатеж должен теперь искать индивидуально введенные слова. Поиск фразы требуется с "quotes" - Семантически логическое, действительное и доступное повышение для результатов поиска и формы запросов.
- Форма теперь предлагает два варианта по умолчанию для повышения результатов: результаты в списке определения (
<dl>) или в столе (<table>). - Основная безопасность базы данных.
поисковая машина только ищет содержание, содержавшее в пределах Вашей базы данных MySQL. Это не будет паук Ваш участок или определять местонахождение любого документа вне Вашей базы данных.
Этот документ был написан в ссылке на оригинальный подлинник поиска ( доступный здесь ). Это было обновлено, чтобы размышлять некоторые из изменений в новом подлиннике, но больше не является полной прогулкой - через подлинника.
Начинающий
первая часть обработки поиска получает данные от пользователя. Неизбежно, первой вещью, которую рассмотрят любым временем, Вы получаете любой вид информации от пользователя, является безопасность. Весьма вероятно, что 99 % пользователей никогда не будут делать, почти входят в простые текстовые вопросы в Вашу форму поиска - но только требуется один человек, чтобы вызвать большую проблему. Так, мы собираемся бросить достаточно близкий взгляд на введенные данные.
$var = $_GET ('q');
, если (ereg (" ^ [A-z0-9 +.-] * ('')? [A-z0-9 +.-] * $", $var)) {
$trimmed = аккуратный ($var);
} еще {
$trimmed = "<span критерий поиска класса ='warning'>Invalid entered.</span>" ;
$testquery = ЛОЖНЫЙ;
}
первый шаг должен восстановить переменную вопроса. Во многих случаях не рекомендуется признать, что переменные в ПОЛУЧАЮТ метод из-за безопасности. Однако, используя ПОЧТОВЫЙ метод, пользователи не будут в состоянии отметить свои поиски. Ради удобства и простоты использования, я хочу использовать ПОЛУЧИТЬ метод. Однако, я исследую ту переменную на много проблемы.
Мы сначала проверяем строку поиска. Помещая символ функционирует, чтобы подавить любое сообщение об ошибке, которое могло бы возникнуть из-за переменного запроса. Может быть полезно подавить ошибки системы в веб-приложениях, чтобы избежать давать нападавшему дополнительную информацию о заявлении. Строка поиска исследована, чтобы видеть, что она только содержит нормальное слово и характеры числа, только с несколькими исключениями. Пробелы позволены. Дефисы и периоды позволены. Единственные кавычки позволены, если они появляются между двумя другими характерами. Я попытался уравновесить удобство и простоту использования с безопасности - так, почти любой вероятный поиск позволен. Вы можете искать
сокращенный термин такой как "St. Paul" для сокращений такой как "you 're" или для телефонных номеров такой как "651-314-4353". Действительные поиски, которые не могут быть выполнены, используя это правило? Вероятно - нравятся, что
Всё про ремонтные работы: статьи на тему строительства, советы мастеров. указывают на них на меня , если Вы замечаете тот! Одно дополнение я сделал в недавнем подлиннике, должен обеспечить выбор разрешить поиски на адресах электронной почты, конфигурируемых в файле конфигурации.
важная вещь то, что потенциально опасные характеры такой как "#" (используемый для комментариев в утверждениях MySQL), "%" или " " устранены. Эти характеры могли использоваться, чтобы создать злонамеренное нападение на базу данных.
, Почему я не использовал mysql_real_escape_string ?
Хорошо, это - хороший вопрос. Нет, я подразумеваю это. Я не использовал mysql_real_escape_string , потому что я хотел практику, используя регулярные выражения. Нет никакой хорошей выгоды безопасности для того, что я сделал по PHP's, построенному в функции спасения - и у моего выражения есть возможность также устранения некоторых действительных поисков. Если Вы будете использовать mysql_real_escape_string , то Вы должны будете проверить, позволен ли magic_quotes_gpc сначала, чтобы определить, нуждаетесь ли Вы к stripslashes . Если Вы хотите, Вы можете легко заменить этот бит кодекса следующим образом:
$var = $_GET ('q');
, если ($var) {
$trim1 = аккуратный ($var);
если (get_magic_quotes_gpc ()) {
$trim1 = stripslashes ($trim1);
}
$trimmed = mysql_real_escape_string ($trim1);
} еще {
$trimmed = "<span критерий поиска класса ='warning'>Invalid entered.</span>" ;
$testquery = ЛОЖНЫЙ;
}
Затем, вопрос поиска урезан избытка whitespace. Любые пробелы вначале или конец последовательности вопроса раздеты. Хотя есть действительный аргумент за отъезд этого подарка мест (они могли быть намеченной частью поиска, например), наиболее вероятно, что пользователи оставили дополнительные белые места случайно.
Наконец, если регулярный тест выражения терпит неудачу, вопрос поиска заменен предупреждением, которое будет напечатано к экрану в более позднем пункте в кодексе. Переменная $testquery также установлена в ЛОЖНЫЙ. Это вызовет более позднее дерево решения, которое обойдет регулярную стадию вопроса базы данных.
Резюме до настоящего времени:
- Строка поиска исследован.
- , Если это проходит, whitespace - trimm
редактор и это размещены в переменную
$trimmed. - , Если это терпит неудачу, вопрос поиска заменен сообщением об ошибке по умолчанию, и Логическая переменная установлена, который обойдет нормальная фаза вопроса подлинника.
Обработка с Булевыми выражениями
, если (ereg ("И | и | И", $trimmed, $matches)) {
$burst = $matches [0];
$terms = взрывается ($burst, $trimmed);
$boolean = ВЕРНЫЙ;
$split = "И";
} elseif (ereg ("ИЛИ | или | Или", $trimmed, $matches)) {
$burst = $matches [0];
$terms = взрывается ($burst, $trimmed);
$boolean = ВЕРНЫЙ;
$split = "ИЛИ";
}
я пропустил вперед немного, и мы теперь осматриваем вопрос поиска для ключевых Булевых выражений.
я держу этот подлинник простым, таким образом я только ищу И и ИЛИ. Первая вещь для каждой фразы к
, идентифицируют присутствие той последовательности характера во фразе поиска. Но это должны быть больше чем только
любая последовательность "and". Действительная последовательность должна быть отдельным словом, не содержавшим в пределах другого слова, таким образом
я фактически ищу возникновения последовательности, окруженной местами с обеих сторон. Последовательность может также
появляться в любой комбинации верхнего и нижнего регистра - для пользы простоты, я только исследую три большинство
вероятно: все капиталы, никакие капиталы, и начальный капитал. Последняя версия фактически смотрит на несколько из
другие нечетные выборы для капитализации.
находивший состязание, я использую , взрывают () функцию, чтобы отделить фразу поиска в отдельный
переменные, снимая Логического члена непосредственно и делая запись, какой термин был расположен в переменной
$split .
Обработка с Вопросами MySQL
, если (($boolean == ВЕРНЫЙ) && ($split == "ИЛИ")) {
$query = "ВЫБИРАЕТ уголовного розыска КАК id, название, категория, содержание
ОТ содержания, ГДЕ
СОСТЯЗАНИЕ (название, категория, содержание, автор) ПРОТИВ ('$terms [0] $terms [1] $terms [2] $terms [3]' В БУЛЕВОМ СПОСОБЕ)
ЗАКАЗЫВАЮТ ПО КАТЕГОРИЯМ, название";
} elseif (($boolean == ВЕРНЫЙ) && ($split == "И")) {
$query = "ВЫБИРАЕТ уголовного розыска КАК id, название, категория, содержание
ОТ содержания, ГДЕ
СОСТЯЗАНИЕ (название, категория, содержание, автор) ПРОТИВ ('+ $terms [0] + $terms [1] + $terms [2] + $terms [3]' В БУЛЕВОМ СПОСОБЕ)
ЗАКАЗЫВАЮТ ПО КАТЕГОРИЯМ, название";
} еще {
$query = "
(ВЫБИРАЮТ уголовного розыска КАК id, название, категория, содержание
ОТ содержания, ГДЕ
название КАК \" % $trimmed % \"ИЛИ категория КАК \" % $trimmed % \"ИЛИ содержания КАК \" % $trimmed % \"ИЛИ автор КАК \" % $trimmed % \"),
ЗАКАЗЫВАЮТ ПО КАТЕГОРИЯМ, название";
}
$sub_query = "
(ВЫБИРАЮТ уголовного розыска КАК id, название, категория
ОТ содержания
ГДЕ уголовный розыск КАК \"инвалид \"), "
, если ($testquery == ЛОЖНЫЙ) {
$numresults = 0
$numrows = 0
} еще {
$numresults=mysql_query ($query);
$numrows=mysql_num_rows ($numresults);
}
Этот блок программы включает четыре отдельных вопроса MySQL и метод выбора, который продиктует, каким вопросом управляют для данного вопроса. Прочитанный больше о Булевых вопросах в MySQL . Чтобы, вопросы:
- Булевый ИЛИ,
- Булевый И,
- Неплатеж, и
- Недействительный Вопрос.
обстоятельства, которые вызывают каждый вопрос, были уже обсуждены, но сами вопросы имеют небольшую экспертизу.
два булевых позволенных вопроса следуют за тем же самым форматом только с одним существенным различием между ними. Во-первых, вопрос определяет, какие области он ВЫБИРАЕТ. Они - названия областей в Вашем столе, который будет обеспечен кодексу как переменные, которые будут использоваться позже. Как написано, подлинник требует областей, названных удостоверением личности, НАЗВАНИЕМ, КАТЕГОРИЕЙ и СОДЕРЖАНИЕМ. "cid КАК id" синтаксис - средство, которым Вы можете применить этот синтаксис к соответствующим областям в Вашем существующем ранее столе. В этом примере полевой УГОЛОВНЫЙ РОЗЫСК в СОДЕРЖАНИИ стола повторно маркируется в целях подлинника как удостоверение личности.
, Хотя подлинник все еще работает по существу тот же самый путь, большая часть вышеупомянутого больше не верна: все три положительных вопроса теперь сделаны в Булевом способе, подлинник больше не требует областей, названных удостоверением личности, НАЗВАНИЕМ, КАТЕГОРИЕЙ или СОДЕРЖАНИЕМ (хотя это действительно требует эквивалентных областей), и "cid КАК id" синтаксис больше не необходим. В последней версии вопрос по умолчанию (когда ни И, ни ИЛИ не появляются в вопросе) является Булевым вопросом, который позволяет пользователю вводить Булевый синтаксис. Подвергнутые сомнению области Вашего стола MySQL установлены в файле конфигурации.
мясо вопроса находится в утверждениях СОСТЯЗАНИЯ/ПРОТИВ. Вы должны определить области, которые обыскиваются, поскольку запятая отделила последовательность в утверждении СОСТЯЗАНИЯ, сопровождаемом спецификацией ПРОТИВ - сроки, которые разыскиваются. Фраза команды В БУЛЕВОМ СПОСОБЕ сообщает вопросу, что эти термины должны быть использованы Булевым способом. Это - то, где различие между двумя вопросами находится. В ИЛИ утверждение, у $terms переменных [n] нет никакого signifiers, который позволяет любой комбинации этих сроков обеспечивать состязание. В И утверждение, переменным предшествуют + (плюс), указывая, что вопрос должен найти ОБА срока, чтобы обеспечить состязание. Поскольку этот вопрос написан, он позволяет максимум четыре шесть отдельные критерии поиска для Булевого вопроса ( $terms [0] $terms [1] $terms [2] $terms [3] $terms [4] $terms [5] ). Было бы очень легко добавить, что дополнительные условия - просто включают $terms [, и т.д. Однако, я чувствую, что маловероятно, что больше чем четыре отдельных срока, вероятно, будут необходимы.
4 6 ]
Наконец, результаты сортированы - сначала согласно категории, затем названием. Теперь, согласно заказу Вы устанавливаете в файле конфигурации.
вопрос по умолчанию - очень подобный , кроме без Булевого синтаксиса . В этом вопросе через фразу не прошли
, взрываются () , функционируют, и только одна фраза. Эта фраза сравнена с теми же самыми областями, используя ПОДОБНОЕ
синтаксис, который обеспечивает спички для любого отчета, который содержит ту фразу где-нибудь в проверенных областях , Булевый поиск подвергает сомнению .
Наконец, недействительный вопрос создан, чтобы не гарантировать результаты. Это было бы возможно к просто не управляемый вопрос для инвалида
поиски, но я хотел обеспечивать вопрос, потому что я могу тогда избежать иметь необходимость закодировать весь дополнительный поезд решения
для ошибочных последствий. Этот путь, нормальное "no results" путь решения может вступить во владение для недействительных вопросов также.
вопрос просто проверяет на существование слова недействительный in8valis1d в пределах полевого УГОЛОВНОГО РОЗЫСКА. Так как эта область-
первичный ключ для стола и содержит только целые числа, это будет всегда терпеть неудачу.
В конце этих четырех вопросов, простое, если/тогда решение принято. Если переменная $testquery была установлена в ЛОЖНЫЙ,
тогда, недействительным вопросом результатов управляют вместо нормального вопроса.
Распечатывание Результатов
, в то время как ($row = mysql_fetch_array ($result)) {
$title = $row [название];
$id = $row ["id"];
$blurb = substr ($row [содержание], 0,100). '...';
$blurb1 = strip_tags ($blurb);
$section = $row [категория];
отзываются эхом "<tr>
<td класс ='sr_number'>$count</td>
<td класс ='sr_page'>
<a href ='http://www.yoursite.com/index.php?section=$section&doc=$id&?q=$trimmed'>$title</a>
<p>$blurb1</p>
</td>
<td класс ='sr_section'
$section</td></tr>" ;
$count ++;
}
Другой пропуск отправляют здесь, следующему хитрому биту - восстановление результатов. Чтобы обеспечить страницу результатов годную к употреблению, я распечатываю число счета результата, связи с ресурсом, используя название отчета как якорный текст, короткая реклама от основного содержание отчета, и лейбл секции. То, что Вы будете хотеть обеспечить, будет, конечно, зависеть от Вашего заявления этого поиска. Однако, хитрый и ключевой элемент - связь с Вашим ресурсом. Структура этого будет всегда изменяться в зависимости от того, как Ваш вебсайт восстанавливает документы.
В этом специфическом примере, это - довольно прямое использование, ПОЛУЧАЮТ переменные. Вы должны обеспечить удостоверение личности документа, чтобы восстановить
точный отчет. Остальная часть этого является довольно дополнительной, в зависимости от Вашего использования. Если Вы не знаете, как работать с $_GET
множество, Вы можете иметь проблему, осуществляющую эту поисковую машину!
Заключение
Эта поисковая машина может обеспечить приемлемый уровень безопасности и функциональных возможностей к маленькому вебсайту. Если у Вас есть знание к , работа с PHP и MySQL базировала динамический участок, это могло быть полезно. Использование полномасштабной системы управления контентом, вероятно, обеспечит намного более сильный уровень безопасности и функциональных возможностей. Однако, если Вам нравится быть в состоянии осуществить каждый элемент Вашего участка, тогда идут прямо вперед!
Загрузка подлинник PHP и образец формируют . База данных, не включенная.
последняя версия этого подлинника была загружена 1954 раза с 20 ноября 2006.
предыдущая версия была загружена 480 времена между 14 мая и 20-ого ноября 2006.
Для Дальнейшего Чтения:
, Если Вы хотите лучшую информацию относительно продвинутого использования Мискла и методов, я рекомендую покупать книгу, такую как Высокая эффективность Мискл , Джереми Зоодни и Дереком Баллингом или Поваренной книгой Мискла , Полом Дубоисом. Любой из них даст Вам большую информацию- , первая книга больше об определенных методах для того, чтобы улучшиться, работа Вашего Мискла подвергает сомнению, второе даст Вам ценные решения большого разнообразия Мискла программирование проблем.
