Пример за изпълнение. Търсене на живо в Bitrix. Пример за внедряване Изискване на мъжки елемент за търсене php i

В днешния урок ще разгледаме php mysql търсене. Има много скриптове за търсене, някои използват база данни, други без нея, има разширени търсения с точно сортиране. Ще се съсредоточим върху обикновеното просто търсене, което търси информация за две таблици от базата данни MySQL.

Първа стъпка. MySQL база данни.

Създаване на база данни search_lite, има две маси Новини- новини и вак- свободни работни места.

Задайте привилегии:

Влизам - " корен",

Парола - "",

Домакин - " локален хост".

Изхвърляне на новинарската маса.

Структура на таблица за таблица `news` -- СЪЗДАВАНЕ НА ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА `news` (`id` int(2) NOT NULL, `title` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id `)) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Самосвална маса - свободни работни места.

Структура на таблица за таблица `vac` -- СЪЗДАВАНЕ НА ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА `vac` (`id` int(2) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (` id`)) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

Втора стъпка. HTML и PHP.

Свързваме се с базата данни. Задайте условие за променлива $търсене, в която заявката за търсене не е въведена или е по-малка от 4 знака, а също така проверете за наклонени черти и изрежете променливата. Създаваме две заявки, които търсят в базата данни две таблици Новинии вакпо условие за търсене на поле текст. (Вече можете да изберете колко маси трябва да търсите. Например ще имате маси Уроци, материали, статиии т.н. Можете също така да промените условията за търсене, вместо полето текст, можете да изберете полето заглавиеили друго поле.) След това посочваме колко знака в текста при показване на търсенето в променливата $символи.Ако в таблиците Новинии вакНищо не беше намерено при търсенето, показваме съобщение. Ако бъдат намерени, изведете данни от две таблици Новинии вакза дадената заявка за търсене.

Резултати от търсенето за заявката: $търсене


"; ехо "
Заявката за търсене не е въведена или е под 4 знака!

";) else ( echo "
Резултати от търсенето за заявката: $търсене

"; $search = htmlspecialchars(stripslashes(trim($search))); $sql_news = mysql_query("SELECT id, title, text FROM news WHERE текст КАТО "%$search%""); $news = mysql_num_rows($sql_news ); $sql_vac = mysql_query("SELECT id, title, text FROM vac WHERE текст КАТО "%$search%""); $vac = mysql_num_rows($sql_vac); $find = $search; $symbolls = "80"; ако ($news==0 и $vac==0) ехо "
Вашето търсене \"$search\" не намери никакви резултати! Изпратете друга заявка!

"; else ( /*Новини/новини - таблица*/ for($i=1; $news = mysql_fetch_array($sql_news); $i++) ( $search_text = $news["text"]; $search_text = strip_tags($ search_text, "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $symbolls; $pad_right = $search_first_enter + $symbolls + 5; ако ($pad_right><0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($find)."
$i. $новини
...$търсен_текст...
намерени в новините

"; ) /*Jobs/vac - таблица*/ for($i=1; $vac = mysql_fetch_array($sql_vac); $i++) ( $search_text = $vac["text"]; $search_text = strip_tags($search_text , "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $symbolls; $pad_right = $search_first_enter + $symbolls + 5; if ($pad_right>$search_txt_length) $pad_right = $search_txt_length; if ($pad_left<0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($find)."", strtolower($search_text)); ехо"
$i. $vac
...$търсен_текст...
намерени в свободни работни места

"; } } } } ?>

Трета стъпка. CSS.

Нека напишем някои стилове, които ще оформят нашето търсене.

Search_name ( цвят: черен; размер на шрифта: 18px; ) .search_questions ( цвят: черен; тегло на шрифта: удебелен; размер на шрифта: 15px; ) .search_query ( цвят: син; стил на шрифта: курсив; ) .search_error ( цвят: червен; размер на шрифта: 15px;) .search_input (рамка: 1px плътно черно; ширина: 500px; височина: 30px;) .search_word (цвят: син;) .search_title (размер на шрифта: 20px; цвят: син; тегло на шрифта: удебелен;) .search_text (размер на шрифта: 15px; цвят: черен;) .search_cat (размер на шрифта: 12px; цвят: сив; плаващ: надясно; margin-top: 20px;)

Разгледахме с вас един прост php mysql търсене A, който търси информация от база данни. По условие се използват две маси, можете да ги персонализирате по всеки удобен начин. Следващият урок ще бъде посветен на аналогията с просто търсене, само с разширени функции.

11,1K

Една от най-популярните и необходими функции на всеки сайт е търсенето, реализирано с помощта на специална форма. Тази функционалност позволява на посетителите бързо да намират съдържанието, което ги интересува в сайта.

Днес искаме да ви кажем как да търсите в сайта с помощта на специална форма, която ще прави заявки в таблиците на базата данни и ще показва информация за текущите мениджъри на сайта. Ще научите как да създадете таблица с база данни, която ще съдържа информация за текущия персонал.

Разработете формуляри за търсене с PHP и се запознайте с SQL ( език за структурирани заявки) е специален език за събиране, записване и модифициране на информация, съдържаща се в бази данни. Преди да започнете, ви препоръчваме изтегляне на файлове на проекта.

Какво ще ви трябва

  • MySQL инструмент за бази данни.
  • Локален или отдалечен сървър с поддръжка на PHP.
  • Текстов редактор.

Създаване на база данни

Ако не сте напълно сигурни, че можете да се справите с базата данни на вашия хостинг, тогава се свържете с хоста за инструкции или помощ. След като базата данни е създадена, ще трябва да я свържете, да създадете таблица и да запишете необходимите данни в нея.

Най-популярният инструмент за управление на MySQL е PHP My Admin , Този инструмент ще бъде достатъчен за нашето днешно ръководство.

Създайте таблица

Нашата таблица трябва да бъде създадена в следния формат:

име на колона тип данни Дължина Null или Not Null първичен ключ? Автоматично увеличаване
документ за самоличност ИНТР 1 Не е нула да да
Първо име Варчар 50 Не е нула не не
фамилия Варчар 50 Не е нула не не
електронна поща Варчар 50 Не е нула не не
Телефонен номер Варчар 15 Не е нула не не

Таблицата на базата данни се състои от колони и редове, точно както в Excel. Първата колона ви позволява да идентифицирате данните по име. Следва колоната Типове данни (тип данни), която ни показва типа на данните, съдържащи се в колоната. В полето Length (Дължина) се посочва максималното количество памет ( съхранение) за колона на таблица. Ние използваме променливи, които дават повече гъвкавост. С други думи, ако дължината на пълното име е по-малко от 50 знака, тогава само част от определеното място ще бъде заето.

И сред данните за персонала не може да има празни стойности ( нулев, празен). Първият ред е маркиран в жълто, защото колоната ID е основният ни ключ. Първичният ключ в базата данни гарантира, че всеки запис ще бъде уникален. Тази колона също се увеличава автоматично, което означава, че на всеки запис в нашата база данни автоматично ще бъде присвоен уникален номер.

В таблицата въвеждаме представители на персонала

След като разберете таблицата, започнете да я попълвате с данни. 6 записа са достатъчни, за да фиксирате процедурата в ума. Ето моят собствен пример:

ИД на колона Първо име фамилия електронна поща Телефонен номер
2 Райън Иконом [имейл защитен] 417-854-8547
3 Брент Калахан [имейл защитен] 417-854-6587

Развитие на формата

За да създадете формуляр за търсене в сайта чрез Google, отворете всеки подходящ текстов редактор. Препоръчвам да използвате безплатния PSPad. Можете да използвате всеки текстов редактор, който има подчертаване на синтаксиса. Това значително ще улесни процеса на писане и отстраняване на грешки в PHP код. Когато създавате страница за формуляр за търсене, не забравяйте да я запазите във формат .php, в противен случай PHP кодът няма да се анализира правилно. След като запишете документа, копирайте следното маркиране в него:

Търсене на контакт:

Подробно търсене на контакти

Можете да търсите по име или фамилия



Ако сте запознати с езика HTML, то всичко трябва да ви е ясно поне до отварящия таг за форма. Вътре в този таг е най-важният елемент от целия код - атрибутът за действие. Като действие на нашия формуляр ние посочихме името на нашия файл и след това приложихме низа на заявката „ отивам”.

Проверка на критериите

Когато потребителят въведе собствено или фамилно име и след това щракне върху бутона за изпращане, формулярът изпраща данните към себе си и добавя низа на заявката „ отивам". В този момент проверяваме за наличието на низа за заявка go. Ако резултатът е положителен, показваме резултатите от търсенето.

Преди да покажем исканите резултати, трябва да проверим отново: (1) изпратен ли е формулярът, (2) низът на заявката съдържа ли стойността go, (3) въведен ли е терминът за търсене с малки или главни букви? Ако нито една от проверките не даде положителен резултат ( вярно), не сме длъжни да предприемаме никакви действия.

Първо, нека добавим малък блок PHP код за търсене в сайта след затварящия таг.:



Първо отваряме блок от PHP код с тага ””.

Всеки PHP код в тази двойка тагове ще бъде изпълнен от сървъра. След това проверяваме дали формулярът е изпратен:

Въведете дума за търсене

"; } ?>

Ще използваме вградената функция isset, която връща bool стойност, и ще поставим масива $_POST в нея. Логическият израз в програмирането ни позволява да получим true или false.

Следователно, ако функцията върне true, тогава формулярът е изпратен и трябва да продължим да изпълняваме кода по-нататък. Ако функцията върне false, тогава ще покажем съобщение за грешка. Запазете целия въведен код във файла search_submit.php.

Въведете дума за търсене

"; } } } ?>

Влагаме друг условен булев израз в основния, но този път използваме масива $_GET заедно със стойността „ отивам". Запазете промените си във файла search_go.php.

Сега трябва да сме сигурни, че посетителите могат да въвеждат само първата буква в низа на заявката с главни или само с малки букви. Трябва също така да предоставим начин за вземане под внимание на критериите за търсене, въведени от посетителя. Най-добрият начин за валидиране на въведеното от посетителя е с регулярен израз:

Ние влагаме друг условен булев израз в нашите два. Този път използваме регулярен израз за проверка на входа. Използваме вградената функция preg_match с два параметъра: регулярен израз и поле на формуляр, към което трябва да се приложи проверката.

В нашия случай това ще бъде полето " Име"( име). За да извлечем параметрите за търсене, зададени от посетителя, създаваме променлива $name и свързваме POST стойност към нея с името на полето от формуляра, който ще се използва в SQL заявката. Вече внедрихме: (1) подаване на данните от формуляра, (2) низът на заявката включва стойност за отиване и (3) посетителят е въвел главна или малка първа буква. И всички тези проверки се случват дори преди да бъдат направени промени в базата данни. Запазете всички промени.

Свързване, избор, заявка и връщане на резултати от таблица на база данни

За да получите данни от таблица, първо трябва да се свържете със сървъра в скрипта за търсене в сайта. За целта използваме следния код:

", "") или умирам (" Не мога да се свържа с базата данни, защото: " . mysql_error()); else( echo "

Моля, въведете дума за търсене

"; } } }?>

Създаваме променлива $db и я свързваме с вградената в MySQL функция mysql_connect, която приема три параметъра: сървърът с базата данни ( локален хост, ако работите на място), потребителско име и парола.

След това стартираме вградената PHP функция die, която спира по-нататъшното изпълнение на кода, ако няма връзка с базата данни. И отпечатайте информация за грешка, като стартирате MySQL вградената функция mysql_error, която ще върне причината за грешката. Запазете файла search_connectdb.php.

Моля, въведете дума за търсене

"; } } } ?>

Създайте променлива, наречена mydb, и я свържете към вградения MySQL функции mysql_select_dbи след това посочете името на базата данни, която създадохме по-рано. След това правим запитване към таблицата на базата данни, като използваме SQL заявка с променливата име, съдържаща параметрите за търсене, въведени от посетителя:

Моля, въведете дума за търсене

"; } } } ?>

Когато правим запитване към таблица на база данни, създаваме променлива $sql и я свързваме към низ, съдържащ SQL заявка. Използваме оператора SELECT, за да извлечем стойностите от колоните с id и собствените и фамилните имена от таблицата с контакти. След това използваме клаузата WHERE заедно със стойностите на името и фамилията, за да стесним търсенето.

Заедно с оператора LIKE използваме знака за процент (%) - специален знак, който връща 0 или повече знака, както и променливата име от низа за търсене. В резултат на това, ХАРЕСАЙТЕ ( комбиниран със специален характер) намира всяко съвпадащо име в таблица на база данни. Целият процес може да се опише по следния начин: Избираме имената и фамилиите от таблицата с контакти, които съответстват на въведените от посетителя". Запазете файла search_query.php.

Моля, въведете дума за търсене

"; } } } ?>

Създаваме променлива $result и й присвояваме стойността на функцията mysql_query(), като я поставяме в $query. Сега нашата заявка се съхранява в променливата резултат. За да изведем резултата в PHP, създаваме цикъл и след това извеждаме данните в неподреден списък:

n"; ехо "

  • " . "
  • n"; ехо ""; ) ) else( echo "

    Моля, въведете дума за търсене

    "; } } } ?>

    Първо, създаваме цикъл while, вътре в него създаваме променлива, наречена row, и я инициализираме с върнатата стойност на функцията mysql_fetch_array, която взема резултатна променлива, която съдържа нашата SQL заявка. В рамките на цикъла while присвояваме на всяка стойност на колона стойността на променлива със същото име. След това извеждаме стойностите в неподреден списък.

    Има две важни неща, които трябва да се отбележат тук: (1) вътре в цикъла while не е необходимо да присвоявате стойности на променливите на редовия масив, тъй като стойностите могат да бъдат взети директно от редовия масив; (2) маркера за закрепване, който използваме в името на нашия файл заедно с идентификатора и основния ключ. Причината за това е, че много елементи за търсене първоначално не показват нищо.

    Тъй като показваме само името и фамилията чрез добавяне на ID в края на нашия anchor таг, можем да използваме ID за допълнителна заявка, която ще покаже допълнителна информация за персонала. Запазете файла и тествайте PHP формата за търсене в сайта ( search_display.php).

    Премахване на раздели

    Резултатите се показват като неподреден списък, но най-важното е, че нямаме нужда от раздели. За да се отървете от него, добавете следното CSS правило в най-горната част на вашия файл в главата:

    Търсене по букви

    Необходими са само няколко допълнителни реда код, за да се реализира търсенето по заклинание. Нека добавим тази удобна за посетителите функционалност. По този начин те ще могат да намират представители на персонала по буквите, съдържащи се в името или фамилията.

    Добавете следния ред код след затварящия таг на формуляра:

    A | б | К

    Ние свързваме етикета към низ на заявка с помощта на котва и го задайте на конкретна буква. За да приложим функцията за търсене по правопис, трябва да добавим следния код точно след затварящата фигурна скоба в оригиналния скрипт, както е показано по-долу:

    )//Край на скрипта на формата за търсене if(isset($_GET["by"]))( $letter=$_GET["by"]; //Свързване към базата данни $db=mysql_connect ("име на сървър", " потребителско име" , "парола") или умрете ("Не мога да се свържа с базата данни, защото: " . mysql_error()); //-Изберете базата данни $mydb=mysql_select_db("yourDatabase"); //-Запитване до базата данни table $sql="SELECT ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE "%" . $letter . "%" OR LastName LIKE "%" . $letter ."%""; //-Изпълнете заявка за функция на MySQL Query $ result=mysql_query($sql); //-Преброяване на резултатите $numrows=mysql_num_rows($result); echo "

    " .$numrows . " намерени резултати за " . $letter . "

    "; //-Стартиране на цикъла и сортиране на резултатите while($row=mysql_fetch_array($result))( $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$ ред[ "ID"]; //-Показване на резултата в масива echo "
      n"; ехо "
    • " . "" .$FirstName . " " . $LastName . "
    • n"; ехо "
    "; } }

    Тук променихме четири кодови фрагмента на скрипта за търсене в сайта:

    • Използваме функцията isset() и поставяме масива $_GET в нея и след това проверяваме по стойност;
    • Създайте променлива $letter и инициализирайте нейната стойност с масива $_GET;
    • Добавяне на променлива буква към SQL заявка;
    • Посочваме променливата буква вътре в израза, в който получаваме преброения брой редове.

    Запазете файла search_byletter.php и проверете резултата.

    Потърсете конкретен служител

    За да покажем информация за останалата част от персонала, която се предава през уникален идентификатор в нашата връзка, трябва да добавим следния код точно след затварящата фигурна скоба в буквения скрипт, както е показано по-долу:

    )//Край на скрипта if(isset($_GET["id"]))( $contactid=$_GET["id"]; //Свързване към базата данни $db=mysql_connect ("servername", "username" , " парола") или умрете ("Не мога да се свържа с базата данни, защото: " . mysql_error()); //-изберете базата данни, за да използвате $mydb=mysql_select_db("yourDatabase"); //- Запитване до базата данни таблица $sql="SELECT * FROM Contacts WHERE ID=" .$contactid; //- Изпълнение на заявка към mysql_query() функция $result=mysql_query($sql); //- Изпълнение на цикъл и сортиране на резултатите while($row=mysql_fetch_array ($result))( $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $PhoneNumber=$row["PhoneNumber"]; $Email=$row["Email"]; //- Показване на резултата в масива echo "

    "; } }

    Тук променихме четири части от код:

    • Използваме функцията isset(), за да проверим стойността на ID в масива $_GET;
    • Създайте променлива $contactid и я инициализирайте с масива $_GET;
    • В таблицата изберете всичко, което е отбелязано със звездичка * . Звездицата е съкратена нотация в SQL, която означава " дай ми всички колони и редове от таблицата". За да определим каква информация да се показва, споменаваме променливата contactid в края на SQL оператора;
    • Показваме допълнителна информация за всеки представител на персонала.

    Запазете файла search_byid.php и проверете резултата.

    Моля, имайте предвид, че нашата функционалност работи според очакванията. Когато въведете име или фамилия в полето или когато изберете буква като хипервръзка, се показват само имената на служителите. Ако задържите курсора на мишката върху връзката, можете да видите уникалния идентификатор в лентата на състоянието. Ако щракнете върху конкретно лице, адресната лента ще се промени и ще се покаже допълнителна информация за този служител.

    SQL инжекция

    Причината, поради която добавихме регулярен израз към нашето поле за търсене, е, че никой не може да подправя нашата SQL заявка. В миналото този проблем беше често срещан и хакерите успяха да изпълнят свои собствени SQL заявки, докато манипулират вашето приложение. Например, ако позволим възможността за използване на апостроф в нашето поле, тогава хакер може просто да изтрие базата данни, използвайки заявката:

    „ПАДВАЩА МАСА

    Както вече беше отбелязано, регулярният израз гарантира, че посетителят може да въвежда само малки или главни букви като първи знак.

    В заключение

    В днешната статия разгледахме как да извършим търсене в сайта, както и:

    • Създаване на бази данни и свързани таблици;
    • Използване на инструменти за управление на бази данни, създаване на колони и въвеждане на данни;
    • Разработване на форми за търсене, базирани на PHP, които могат да проверяват входните данни, наличието на променливи в заявката, както и да се свързват с базата данни и да показват резултати от таблицата;
    • Как да защитите вашето приложение и база данни от SQL инжектиране.

    Използвайки знанията, получени от тази статия, можете лесно да промените кода на някой друг, както и, ако е необходимо, да разширите функционалността на формата за търсене.

    Тази публикация е превод на статията " Как да създадете функция за търсене с PHP и MySQL» изготвен от приятелски екип по проекта

    Най-добрият начин да задържите потребителя на сайта е да му позволите да намери това, което търси. Ако направите удобна система за това, тогава нивото на предпочитание към вашия сайт ще нарасне и потребителят определено ще се върне, за да намери това, което го интересува.

    Ще ви покажа как да създадете проста, но функционално ефективна форма за търсене, която ще се използва за търсене на статии в сайта. Резултатите ще се появят на страницата без презареждане, което несъмнено е най-добрият начин за представяне на информация.

    Ще създам 2 файла: search.php, който ще съдържа HTML и JavaScript. Вторият файл, do_search.php ще съдържа PHP кода. Нека започнем да създаваме първия файл:

    PHP, jQuery демонстрация на търсене

    Опитайте да въведете думата ajax


    Резултати за


    В този файл създадохме нормален HTML формуляр, който изпраща POST заявка до задната част, файла do_search.php.

    select_list($sql); if(count($row)) ( $end_result = ""; foreach($row as $r) ( $result = $r["title"]; $bold = " ". $word.""; $end_result .= "

  • " .str_ireplace($word, $bold, $result)."
  • "; ) echo $end_result; ) else ( echo "
  • Нищо не е намерено за вашата заявка
  • "; } } ?>

    PHP кодът съдържа коментари, които ви улесняват да разберете как работи скриптът. Ако има съвпадения в базата данни, вие ги показвате на вашия потребител, като удебелявате думите, които потребителят търси.

    Нека да дадем на всичко малко CSS:

    Body( font-family:Arial, Helvetica, sans-serif; ) *( margin:0;padding:0; ) #container ( margin: 0 auto; width: 600px; ) a ( color:#DF3D82; text-decoration: none) a:hover (color:#DF3D82; text-decoration:underline;) ul.update (list-style:none;font-size:1.1em; margin-top:10px) ul.update li(height:30px; border-bottom:#dedede solid 1px; text-align:left;) ul.update li:first-child( border-top:#dedede solid 1px; height:30px; text-align:left; ) #flash ( margin- top:20px; text-align:left; ) #резултати от търсенето (text-align:left; margin-top:20px; display:none; font-family:Arial, Helvetica, sans-serif; font-size:16px; цвят: #000; ) .word ( font-weight:bold; color:#000000; ) #search_box (padding:4px; border:solid 1px #666666; width:300px; height:30px; font-size:18px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .search_button ( border:#000000 solid 1px; padding: 6px; color:#000; font-weight:bold; font-size:16px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .found ( тегло на шрифта: получер ; стил на шрифта: курсив; цвят: #ff0000; ) h2 (дясно поле: 70px;)

    Така че научихте как да създадете проста форма за търсене, която работи без презареждане на страницата. Надявам се, че урокът ви е харесал.

    от Ибрахим Диало

    Публикувано на 2 юли 2014 г. ~ 16 минути четене

    Търсенето е важна функция на уебсайт. Когато малкото ми читатели искат да потърсят определен пасаж в моя блог, те използват полето за търсене. Преди се захранваше от Google Търсене, но оттогава го промених на моя собствена домашно приготвена версия не защото мога да се справя по-добре, а защото беше интересно предизвикателство.

    Ако бързате и просто искате сайтът ви да може да се търси, направете това, което направих преди, използвайте Google.

    // Във файла search.php $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; заглавие ("Местоположение: $пренасочване"); изход;

    Това, което прави, е доста просто. Вземете термина, предаван от потребителя, и го препратете към страницата за търсене на Google. Ограничете резултата от търсенето до текущия ни домейн, като използвате ключовата дума site: в заявката за търсене. Всички ваши страници, които са индексирани от Google, сега ще бъдат достъпни чрез търсене. Ако обаче искате да се справите с търсенето си у дома, продължете да четете.

    Домашно решение за търсене

    Преди да продължим, опитайте да използвате полето за търсене в този блог. Той използва същия процес, който ще опиша по-долу. Ако смятате, че това е, което искате, моля, продължете да четете.

    Това решение е предназначено за малки уебсайтове. Използвам LIKE със заместващи символи в двата края, което означава, че вашето търсене не може да бъде индексирано. Това означава, че решението ще работи добре за вашия блог или личен уебсайт, който не съдържа много данни. Пренесете го към по-голям уебсайт и може да стане много бавно. MySQL предлага пълнотекстово търсене, което не е това, което правим тук.

    Забележка:Ако имате 5000 публикации в блога, все още сте добре. .

    Ще вземем структурата на този блог като ориентир. Всяка публикация в блога има:

    • Заглавие p_title
    • URL адрес p_url
    • Резюме p_summary
    • Съдържание на публикация p_content
    • И категории category.tagname

    За всяко поле, което съвпада с нашата дума за търсене, ще му дадем оценка. Резултатът ще бъде базиран на важността на мача:

    // точните съвпадения на термина се намират в заглавието $scoreFullTitle = 6; // съответства на заглавието в част $scoreTitleKeyword = 5; // точните съвпадения на термина се намират в резюмето $scoreFullSummary = 5; // съответства на резюмето в част $scoreSummaryKeyword = 4; // точните съвпадения на термина се намират в съдържанието $scoreFullDocument = 4; // съответства на документа в част $scoreDocumentKeyword = 3; // съответства на категория $scoreCategoryKeyword = 2; // съвпада с url $scoreUrlKeyword = 1;

    Преди да започнем, има няколко думи, които не допринасят много за търсенето, които трябва да бъдат премахнати. Пример "in", "to", "a", "the", "of" ... . Ще ги филтрираме и не се колебайте да добавите всяка дума, която смятате за неуместна. Друго нещо е, че искаме да ограничим дължината на нашето запитване. Не искаме потребител да напише роман в полето за търсене и да срине нашия MySQL сървър.

    // Премахване на ненужните думи от думата за търсене и връщането им като функция на масив filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // разширете този списък с вашите думи. $list = array("in","it","a","the","of","or","I","you", "той", "аз", "нас", "те", "тя", "до", "но", "това", "това", "тези", "тогава"); $c = 0; foreach(explode(" ", $query) като $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) върне $words; ) // ограничаване на думите брой знаци функция limitChars($query, $limit = 200)( return substr($query, 0,$limit); )

    Нашите помощни функции вече могат да ограничават броя на символите и да филтрират безполезни думи. Начинът, по който ще приложим нашия алгоритъм, е като даваме резултат всеки път, когато намерим съвпадение. Ще съпоставяме думи с помощта на оператора if и ще трупаме точки, докато съпоставяме повече думи. В крайна сметка можем да използваме този резултат, за да сортираме нашите резултати

    Забележка:Няма да показвам как да се свържете с MySQL база данни. Ако имате проблеми с ефективното свързване с базата данни, препоръчвам да прочетете това.

    Нека първо да дадем структура на нашата функция. Забележете, че оставих контейнери, за да можем да внедрим секции поотделно.

    Функция search($query)( $query = trim($query); if (mb_strlen($query)===0)( // няма нужда от празно търсене нали? return false; ) $query = limitChars($query) ; // Претегляне на резултатите $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $Searchywords = filter $query); $escQuery = DB::escape($query); // вижте бележката по-горе, за да получите db обект $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array (); $urlSQL = array(); /** Съвпадащи пълни срещания ПЪЛНО ПЪЛНО СТЪПКА **/ /** Съвпадащи ключови думи ПЪЛНО ОБЩЕСТВО **/ $sql = "ИЗБЕРЕТЕ p.p_id,p.p_title,p.p_date_published,p. p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Резултат от заглавие ".implode(" + ", $titleSQL).")+ (- Резюме ".implode(" + ", $sumSQL) .")+ (-- документ ".implode(" + ", $docSQL).")+ (-- етикет/категория ".implode(" + ", $categorySQL).")+ (-- url ". експлозия(" + ", $urlSQL).")) като релевантност ОТ публикация p WHERE p.status = "published" HAVING relevance >

    В заявката всички резултати ще бъдат сумирани като променлива за релевантност и можем да я използваме за сортиране на резултатите.

    Съвпадащи пълни срещания

    Първо се уверяваме, че имаме някои ключови думи, след което добавяме нашата заявка.

    If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )

    Това са мачовете с по-висок резултат. Ако думата за търсене съвпада със статия, която ги съдържа, те ще имат по-големи шансове да се появят на върха.

    Съвпадение на ключови думи

    Преглеждаме всички ключови думи и проверяваме дали отговарят на някое от полетата. За съвпадение на категория използвах подзаявка, тъй като публикацията може да има няколко категории.

    Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary КАТО "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content КАТО "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url КАТО "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "".DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; )

    Освен това, както посочи коментатор по-долу, трябва да сме сигурни, че тези променливи не са празни масиви или заявката ще се провали.

    // Просто в случай, че е празно, добавете 0 if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; )

    Накрая всички заявки се свързват и добавят заедно, за да се определи уместността на публикацията спрямо думата за търсене.

    // Премахване на ненужните думи от думата за търсене и връщането им като функция на масив filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // разширете този списък с вашите думи. $list = array("in","it","a","the","of","or","I","you", "той", "аз", "нас", "те", "тя", "до", "но", "това", "това", "тези", "тогава"); $c = 0; foreach(explode(" ", $query) като $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) върне $words; ) // ограничаване на думите брой знаци function limitChars($query, $limit = 200)( return substr($query, 0,$limit); ) function search($query)( $query = trim ($query); if (mb_strlen($query)===0)( // няма нужда от празно търсене нали? return false; ) $query = limitChars($query); // Резултати за претегляне $scoreFullTitle = 6; $ scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKe yword = 1; $ключови думи = filterSearchKeys($query); $escQuery = DB::escape($query); // вижте бележката по-горе, за да получите db обект $titleSQL = array(); $sumSQL = масив(); $docSQL = масив(); $categorySQL = масив(); $urlSQL = масив(); /** Съвпадащи пълни срещания **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary КАТО "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content КАТО "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Съвпадащи ключови думи **/ foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary КАТО "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content КАТО "% ".DB::escape($key)."%",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url КАТО "%".DB::escape($key)."%",( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "". DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // Просто в случай, че е празен, добавете 0 if (empty($titleSQL))( $titleSQL = 0; ) ако (празно ($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; ) $sql = " ИЗБЕРЕТЕ p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((- Резултат от заглавието ".implode(" + ", $titleSQL). ")+ (-- Резюме ".implode(" + ", $sumSQL).")+ (-- документ ".implode(" + ", $docSQL).")+ (-- етикет/категория ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) като уместност ОТ публикация p WHERE p.status = "published" HAVING уместност > 0 ПОРЪЧАЙТЕ ПО релевантност DESC,p.page_views DESC LIMIT 25"; $results = DB::query($sql); if (!$results)( return false; ) return $results; )

    Сега вашият файл search.php може да изглежда така:

    $term = isset($_GET["query"])?$_GET["query"]: ""; $search_results = търсене($term); if (!$search_results) ( echo "Няма резултати"; изход; ) // Отпечатайте страница с резултати тук.

    Създадохме прост алгоритъм за търсене, който може да обработва доста голямо количество съдържание. Произволно избрах резултата за всеки мач, не се колебайте да го промените до нещо, което работи най-добре за вас. И винаги има място за подобрение.

    Добра идея е да проследявате думата за търсене, идваща от вашите потребители, по този начин можете да видите дали повечето потребители търсят едно и също нещо. Ако има модел, тогава можете да им спестите пътуване и просто да кеширате резултатите с помощта на memcached.

    Ако искате да видите този алгоритъм за търсене в действие, продължете и опитайте да потърсите статия в полето за търсене в горната част на страницата. Добавих допълнителни функции като връщане на частта, където е намерено съвпадението в текста. Чувствайте се свободни да добавяте функции към вашите.

    Хареса ли ви тази статия? Можете да се абонирате, за да четете още страхотни. .

    Във връзка с това, ето няколко интересни статии.

    Време е да се справите с функциите на mysql_* веднъж завинаги. Тези методи са остарели и бавни. Времето за надграждане отдавна е минало, но все още го виждаме навсякъде. Тъй като не мога да принудя всеки автор да актуализира своя урок и блогове, реших да напиша публикация, за да се надявам да се класирам по-добре и да предоставя основната информация, за да помогна на новите посетители.

    Създаването на собствен уебсайт не би трябвало да е твърде трудно. Хостинг компаниите като Godaddy или Hostgator улесняват всеки да започне; те ви позволяват да създадете цял уебсайт, без изобщо да пишете код. За повечето хора е достатъчно да стартирате WordPress блог. Ако това е, което търсите, трябва да се насочите към Godaddy.com точно сега. Свършихме тук. Но от друга страна, ако искате да имате контрол и да не бъдете ограничени от недостатъците на споделения хостинг без да разбивате портфейла си, вие сте попаднали на правилното място.

    Vim е любимият ми текстов редактор на терминала. След като играх известно време с nano и emacs, най-накрая се спрях на vim заради неговата простота (моля, без мен). Въпреки че може да се персонализира и използва като цяла IDE, аз го използвам най-вече за редактиране на файлове на моите сървъри и извършване на малки, но важни промени. Нека не влизаме във войната на редакторите и да започнем.

    Коментари (45)

    Зариел 12 август 2015 г.:

    Ян Мустафа 26 септември 2015 г.:

    грабя 29 септември 2015 г.:

    Адим 11 февруари 2016 г.:

    Иван Венедиктов 9 април 2016 г.

    Основни цели:

    • реализирайте търсене по такъв начин, че след въвеждане на заявка за търсене в ред, резултатите от търсенето да се показват под този ред
    • заявката за получаване на резултата трябва да се появи само след края на въвеждането на заявката за търсене

    Добре, да вървим!

    Приблизително оформление на самия блок с низ за търсене и div-никнейм, където ще добавим резултати от търсенето:

    защото търсенето е налично в заглавката на сайта, нека добавим подходящите скриптове за търсене и стилизиране за резултатите:

    //завършете търсенето: $APPLICATION->AddHeadScript("/search/ajax_search.js"); $APPLICATION->AddHeadScript("/search/jquery.mCustomScrollbar.js"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/ajax_search.css"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/jquery.mCustomScrollbar.min.css");

    Сега нека видим какво има в нашия ajax_search.js:

    Функция get_result ()( //изчистване на резултатите от търсенето $("#search_result").html(""); //все още не сме получили резултатите от търсенето - показване на програмата за предварително зареждане $("#search_result").append( "

    "); $.ajax(( type: "POST", url: "/search/ajax_search.php", data: "q="+q, dataType: "json", success: function(json)( //clear предварително зареждане $("#search_result").html(""); $("#search_result").append(" "); // добавете всеки елемент от json масива вътре в div с class="live-search" (можете да използвате свое собствено оформление) $.each(json, function(index, element) ( $("#search_result" ).find ("".търсене на живо").append(" „+елемент.TITLE+“"+елемент.BODY_FORMATED+""); //console.log (element.BODY_FORMATED); )); // стил на превъртане $(".live-search").mCustomScrollbar(( scrollInertia: 500 )); ) )); ) var timer = 0 ; var q = ""; $(document).ready(function() ( $("#q").keyup(function() ( q = this.value; clearTimeout(timer); timer = setTimeout(get_result, 1000 ) ; )); $("#reset_live_search").click(function() ( $("#search_result").html(""); )); ));

    keyup, ние наричаме функцията get_result (), която всъщност попълва div-nick с id = "search_result" в ajax.

    mCustomScrollbar е просто извикване на стил (можете да го изключите).

    Получаваме данни от /search/ajax_search.php във формат JSON.

    Всичко е ясно с JS компонента, сега нека да видим какво се случва в ajax_search.php:

    Search(array("QUERY" => $q, "SITE_ID" => LANG, "MODULE_ID" => "iblock", "CHECK_DATES" => "Y", "PARAM2" => "8")); $резултат = масив(); while ($res = $obSearch->GetNext())( $id = $res["ITEM_ID"]; //ако е намерен раздел: if (strripos($id, "S")!==false)( $result_item ["TITLE"] = $res["TITLE"]; $result_item["URL"] = $res["URL"]; $result_item["BODY_FORMATED"] = $res["TITLE_FORMATED"]; $result = $ result_item; ) //ако няма S, тогава else( $result_item["TITLE"] = $res["TITLE"]; $result_item["URL"] = $res["URL"]; $result_item[" BODY_FORMATED"] = $res["BODY_FORMATED"]; $result = $result_item; ) ) echo json_encode($result); ) ?>

    В този случай търсенето се извършва чрез метода Search на класа Bitrix CSearch. В PARAM2 пишем в кой инфоблок търсим. Прехвърляме резултатите от търсенето в масива $result. Имайте предвид, че $res['ITEM_ID'] може да бъде или елемент, или раздел. В зависимост от това, което намерихме, в $result_item['BODY_FORMATED'] пъхаме или името на раздела, или част от текста от намерения елемент на информационния блок.