PHP _SELF в атрибуті форми action. Як зробити алгоритм пошуку за кількома словами на PHP з БД Туалетна для чоловіків search php submit

Щоб організувати передачу даних на сервер за допомогою форми, потрібно реалізувати HTML форму, в яку відвідувачі сайту будуть вводити свою інформацію та код PHP, призначення якого в прийнятті та обробці отриманих даних на сервері.

HTML форма відправлення даних

Форма на сторінці формується тегами

...
, всередині яких містяться теги полів для введення текстової інформації, теги спеціальних компонентів (наприклад, поле зі списком), теги для поля вибору та завантаження файлу .

* Для HTML5 також існує можливість розміщувати теги полів форми не всередині тегів форми, а в будь-якому місці на сторінці. При цьому для кожного такого поля потрібно вказувати атрибут "form", щоб визначити з якою формою надсилання він повинен взаємодіяти.

Отже, найпростіша форма відправки може містити такий код:


Значення А:
Значення Б:

Елементи форми та їх параметри:

action="myform.php"– атрибут "action" визначає, який php-файл буде обробляти дані, що відправляються. У цьому прикладі дані будуть відправлені у файл "myform.php", що знаходиться в тій же директорії що і сторінка з формою. Якщо цей атрибут не вказати явно, ці форми будуть надіслані на адресу сторінки самої форми.

method="post"– method визначає метод передачі даних POST або GET. Докладніше про це у статті "Відмінності методів POST або GET". Якщо не вказувати атрибут явно, за умовчанням використовуватиметься метод GET.

Текст "Значення А:"і "Значення Б:"доданий тільки з метою оформлення та зрозумілості форми для користувача. Додавати це передачі даних не обов'язково, але для того, щоб користувачеві стало зрозуміло, що вводити, варто вказувати.

Теги використовуються для формування різних керуючих елементів форми.

type="text"– атрибут "type" визначає вигляд поля. Залежно від того, який тип зазначений, змінюється і зовнішній вигляд елемента та його призначення. Значення атрибута "text" вказує, що в браузері елемент відображатиметься однорядковим текстовим полем, куди користувач зможе ввести рядок.

name="data1"– атрибут "name", вказує ім'я, вірніше індекс даних у масиві, отриманих сервером. Це обов'язковий параметр, за яким у php-обробнику можна буде отримати доступ переданому значенню. Ім'я може бути обране довільно, проте, зручніше, коли це значення має якийсь зрозумілий зміст.

type="submit"- Тег з таким значенням параметра "type" відображатиметься на сторінці як кнопка. Насправді на формі можна обійтися без кнопки. Якщо, наприклад, у формі є текстові поля, відправку можна здійснити, просто натиснувши "Введення" на клавіатурі. Але наявність кнопки робить форму зрозумілішою.

value="(!LANG:Надіслати" !}– у цьому випадку (для type="submit") визначає лише напис на кнопці. Для type="text", наприклад, це буде текст, який буде виведено у текстовому полі.

У результаті, на сторінці цей код виглядатиме приблизно так:

За натисканням на кнопку буде виконано відправлення даних на вказану сторінку, і якщо вона існує і коректно працює, дані будуть оброблені.

Обробка відправлених HTML формою даних у PHP

Відправлені описаним способом дані, що містяться в суперглобальні масиви $_POST, $_GET і $_REQUEST. $_POST або $_GET міститимуть дані в залежності від того, яким методом здійснювалося відправлення. $_REQUEST містить надіслані дані будь-яким із зазначених методів.

$_POST, $_GET і $_REQUEST – це асоціативні масиви, поля-індекси яких збігаються з атрибутами "name" тегів . Відповідно, для роботи з даними у файлі myform.php можна присвоїти змінним значення елементів такого масиву вказавши як індекс ім'я поля:

// для методу GET
$a = $_GET[ "data1"];
$b = $_GET[ "data2"];

// для методу POST
$a = $_POST[ "data1"];
$b = $_POST[ "data2"];

// за будь-якого методу
$a = $_REQUEST[ "data1"];
$b = $_REQUEST[ "data2"];

Перевірка заповнення полів форми

Іноді при отриманні даних потрібно перевірити, чи користувач не відправив порожню форму. Для цього можна використовувати функцію empty.

if (empty ($_REQUEST["data1" ])) (
echo "Поле не заповнено";
} else (
echo "Поле було заповнено";
$a = $_REQUEST[ "data1"];
}

Зазвичай цього рішення достатньо. Якщо потрібно вводити текст, то буде зрозуміло, чи введений він чи ні. Однак, якщо користувач навмисно для обчислень введе нуль, то функція empty покаже, що значення немає. Тому для таких ситуацій краще використовувати функцію isset. Вона явно перевірятиме, чи задане значення чи ні.

if (isset ($_REQUEST["data1"])) (
echo "Поле було заповнено";
$a = $_REQUEST[ "data1"];
} else (
echo "Поле не заповнено";
}

У статті докладно йдеться про використання змінної PHP _SELF.

Що за змінна PHP _SELF?

Змінна PHP _SELF повертає ім'я та шлях до поточного файлу (щодо кореня документа). Ви можете використовувати цю змінну в атрибуті форми action. Існують також деякі нюанси, які ви маєте знати. Ми, звичайно, ніяк не можемо обминути ці нюанси.

Давайте розглянемо кілька прикладів.

Echo $_SERVER["PHP_SELF"];

1) Припустимо, що ваш php файл розташований за наступною адресою:

http://www.yourserver.com/form-action.php

У цьому випадку змінна PHP _SELF міститиме:

"/form-action.php"

2) Припустимо, ваш php файл розташований за такою адресою:

http://www.yourserver.com/dir1/form-action.php

PHP _SELF буде:

"/dir1/form-action.php"

PHP _SELF в атрибуті форми action. Навіщо вона там знадобилася?

Зазвичай змінну PHP _SELF використовують у атрибуті action тега form . В атрибуті action вказується адреса, за якою буде надіслано зміст форми після підтвердження (клік користувачем по кнопці з type="submit"). Як правило це та сама сторінка, з якої пішла форма.

Однак, якщо ви перейменуєте файл, на який посилається форма, вам знадобиться перейменувати назву файлу в атрибуті action, інакше форма не працюватиме.

Змінна PHP _SELF позбавить вас зайвих виправлень, оскільки адреса сторінки буде генеруватися автоматично, виходячи з назви файлу.

Допустимо, у вас є файл з формою form-action.php, і ви хочете, щоб після підтвердження форма відправлялася на той самий файл. Зазвичай пишуть так:

Але ви можете використовувати змінну PHP _SELF замість form-action.php. У цьому випадку код виглядатиме:

" >

Код для form-action.php

Об'єднаємо скрипт із формою:

$name"; echo"
Ви можетевикористовувати форму, щоб ввійти до нового імені."; ) ?> ">

Код, який знаходиться у верхній частині HTML сторінки, буде виконаний першим. У першому рядку коду перевіряється: форму відправлено чи ні. Якщо існує $_POST["submit"] , конструкція IF виконується (TRUE) і буде виведено ім'я, введене користувачем.

Якщо змінної $_POST["submit"] не існує, форма не була відправлена ​​і, відповідно, конструкція IF виконуватися не буде (FALSE). Тому ім'я користувача не буде виведено.

Небажані моменти, пов'язані зі змінною PHP _SELF

Змінна PHP _SELF використовується для того, щоб отримати ім'я та шлях до поточного файлу – добре, але її також можуть використовувати хакери – погано. Якщо на вашій сторінці стоїть PHP _SELF, користувач може ввести слєш (/) і прописати шкідливі XXS скрипти.

Розглянемо приклад:

" method="post">

Тепер, якщо користувач зайшов з нормального URL, то в адресному рядку буде щось на кшталт:
http://www.yourdomain.com/form-action.php
а код, наведений вище, можна прочитати так:

В цьому випадку, як ви бачите, все гаразд.

Тепер давайте розглянемо ситуацію, коли користувач починає "хімічити" з адресним рядком:
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert("xss")%3C
/script%3E%3Cfoo%22

У цьому випадку, після роботи PHP ваш код набуде такого вигляду:

Ви можете бачити самі, що код додано тег script і команда alert . Коли ця сторінка буде завантажена, користувач побачить вікно із попередженням. Це простий приклад того, як можна експлуатувати змінну PHP_SELF.

Будь - який JavaScript код може бути доданий між тегами script . Хакер також може посилатися на файл JavaScript, який буде розташований на іншому сервері. У цьому файлі, ймовірно, буде шкідливий код, за допомогою якого хакер може змінити глобальні змінні та переправити форму на іншу адресу з метою перехоплення даних, введених користувачем.

Як уникнути неприємностей, пов'язаних з PHP _SELF

Неприємностей можна уникнути, використовуючи функцію htmlentities(). Погляньте на код форми, де є функція htmlentities() .

" method="post">

Функція htmlentities() перетворює всі можливі символи у відповідні HTML-сутності. Тепер спроба обійти змінну PHP _SELF зазнає краху і результат впровадження шкідливого коду виразиться в наступному:



  • Create a form with search field and submit button in index.php, you can use GET or POST method, set action to search.php. I used "query" as name for text field

GET - means your information will be stored in url (http://localhost/tutorial_search/search.php?query=yourQuery )
POST - means your information won"t be displayed it is used for passwords, private information, much more secure than GET

Ok, let"s get started with php.

  • Open search.php
  • Start php ()
  • Connect to a database(read comments in following code)

< to > $query = mysql_real_escape_string($query); // makes sure nobody uses SQL injection $raw_results = mysql_query("SELECT * FROM articles WHERE (`title` LIKE "%".$query."%") OR (`text` LIKE "%".$query."%")") or die(mysql_error()); // * means that it selects all fields, you can also write: `id`, `title`, `text` // articles is the name of our table // "%$query%" is what we"re looking for, % means anything, for example if $query is Hello // it will match "hello", "Hello man", "gogohello", if you want exact match use `title`="$query" // or if you want to match just full word so "gogohello" is out use "% $query %" ...OR ... "$query %" ... OR ... "% $query" if(mysql_num_rows($raw_results) >

".$results["title"]."

".$results["text"]."

"; // posts results gotten from database(title and text) you can also show id ($results["id"]) } } else{ // if there is no matching rows do following echo "No results"; } } else{ // if query length is less than minimum echo "Minimum length is ".$min_length; } ?>

Done!

Now it works. Try different words, variations, editing code, experiment. I"m adding full code of both files in case you think you"ve missed something. Feel free to ask questions or ask for tutorials.

index.php

Search



search.php

Search results = $min_length){ // if query length is more or equal minimum length then $query = htmlspecialchars($query); // changes characters used in html to their equivalents, for example: < to > $query = mysql_real_escape_string($query); // makes sure nobody uses SQL injection $raw_results = mysql_query("SELECT * FROM articles WHERE (`title` LIKE "%".$query."%") OR (`text` LIKE "%".$query."%")") or die(mysql_error()); // * means that it selects all fields, you can also write: `id`, `title`, `text` // articles is the name of our table // "%$query%" is what we"re looking for, % means anything, for example if $query is Hello // it will match "hello", "Hello man", "gogohello", if you want exact match use `title`="$query" // or if you want to match just full word so "gogohello" is out use "% $query %" ...OR ... "$query %" ... OR ... "% $query" if(mysql_num_rows($raw_results) > 0){ // if one or more rows are returned do following while($results = mysql_fetch_array($raw_results)){ // $results = mysql_fetch_array($raw_results) puts data from database into array, while it"s valid it does the loop echo "

".$results["title"]."

".$results["text"]."

"; // posts results gotten from database(title and text) you can also show id ($results["id"]) } } else{ // if there is no matching rows do following echo "No results"; } } else{ // if query length is less than minimum echo "Minimum length is ".$min_length; } ?>

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Работа с формами

Для передачи данных от пользователя Web-страницы на сервер используются HTML-формы. Для работы с формами в PHP предусмотрен ряд специальных средств.

Предварительно определенные переменные

В PHP существует ряд предварительно определенных переменных, которые не меняются при выполнении всех приложений в конкретной среде. Их также называют переменными окружения или переменными среды. Они отражают установки среды Web-сервера Apache, а также информацию о запросе данного браузера. Есть возможность получить значения URL, строки запроса и других элементов HTTP-запроса.

Все предварительно определенные переменные содержатся в ассоциативном массиве $GLOBALS . Кроме переменных окружения этот массив содержит также глобальные переменные, определенные в программе.

Пример 1

Просмотр массива $GLOBALS $value) echo "\$GLOBALS[\"$key\"] == $value
"; ?>

В результате на экране появится список всех глобальных переменных, включая переменные окружения. Наиболее часто используемые из них:

Переменная Описание Cодержание
$_SERVER["HTTP_USER_AGENT"] Название и версия клиента Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
$_SERVER["REMOTE_ADDR"] IP-адрес 144.76.78.4
getenv("HTTP_X_FORWARDED_FOR") Внутренний IP-адрес клиента
$_SERVER["REQUEST_METHOD"] Метод запроса (GET или POST ) GET
$_SERVER["QUERY_STRING"] При запросе GET закодированные данные, передаваемые вместе с URL
$_SERVER["REQUEST_URL"] Полный адрес клиента, включая строку запроса
$_SERVER["HTTP_REFERER"] Адрес страницы, с которой был сделан запрос
$_SERVER["PHP_SELF"] Путь к выполняемой программе /index.php
$_SERVER["SERVER_NAME"] Домен сайт
$_SERVER["REQUEST_URI"] Путь /php/php_form.php

Обработка ввода пользователя

PHP-программу обработки ввода можно отделить от HTML-текста, содержащего формы ввода, а можно расположить на одной странице.

Пример 2

Пример обработки ввода

" method="post">

Номер карточки:



Здесь отсутствует кнопка передачи данных, т.к. форма, состоящая из одного поля, передается автоматически при нажатии клавиши .

При обработки элемента с многозначным выбором для доступа ко всем выбранным значениям нужно к имени элемента добавить пару квадратных скобок. Для выбора нескольких эллементов следует удерживать клавишу Ctrl.

Пример 3.1

Список



РЕЗУЛЬТАТ ПРИМЕРА 3.1:

Пример 3.2

Обработка списка из файла ex1.htm

    "; foreach ($Item as $value) echo "
  • $value"; echo "
"; ?>

Пример 4. Прием значений от checkbox-флажков

$v) { if($v) echo "Вы знаете язык программирования $k!
"; else echo "Вы не знаете языка программирования $k.
"; } } ?>
" method="post"> Какие языки программирования вы знаете?
PHP
Perl

РЕЗУЛЬТАТ ПРИМЕРА 4:

Пример 5

"; ?>
" method="post">

Можно обрабатывать формы, не заботясь о фактических именах полей.

Для этого можно использовать (в зависимости от метода передачи) ассоциативный массив $HTTP_GET_VARS или $HTTP_POST_VARS . Эти массивы содержат пары имя/значение для каждого элемента переданной формы. Если Вам все равно, Вы можете использовать ассоциативный массив $_REQUEST .

Пример 6

Обработка произвольного ввода независимо от метода передачи $value) echo "$key == $value
"; ?>

Пример 7. Обработка нажатия на кнопку с использованием оператора "@".

">

С помощью функции header() , послав браузеру заголовок "Location" , можно перенаправить пользователя на новую страницу.

Например:

Передача файла на сервер. Залить файл. UpLoad

PHP позволяет передавать на сервер файлы. HTML-форма, предназначенная для передачи файла, должна содержать аргумент enctype="multipart/form-data" .

Кроме того в форме перед полем для копирования файла должно находиться скрытое поле с именем max_file_size . В это скрытое поле должен быть записан максимальный размер передаваемого файла (обычно не больше 2 Мбайт).

Само поле для передачи файла - обычный элемент INPUT с аргументом type="file" .

Например:

" method="post">

После того, как файл передан на сервер, он получает уникальное имя и сохраняется в каталоге для временных файлов. Полный путь к файлу записывается в глобальную переменную, имя которой совпадает с именем поля для передачи этого файла. Кроме этого PHP сохраняет еще некоторую дополнительную информацию о переданном файле в других глобальных переменных:

Пример 8

Обработка переданного файла "; echo "имя: ".$_FILES["userfile"]["name"]."
"; echo "размер: ".$_FILES["userfile"]["size"]."
"; echo "тип: ".$_FILES["userfile"]["type"]."
"; } ?>
" method="post">



Примеры загрузки файлов на сервер

Если возникнут проблеммы с перекодировкой сервером загруженного файла, символ с кодом 0х00 заменен на пробел (символ с кодом 0х20 ), допишите в файл httpd.conf из каталога Апача (/usr/local/apache) следующие строки.

CharsetRecodeMultipartForms Off

11.1K

Одна из самых популярных и необходимых функций на любом сайте – это поиск, реализованный с помощью специальной формы. Этот функционал позволяет посетителям быстро находить на сайте интересующий их контент.

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

Разрабатывать формы поиска при помощи PHP , а также познакомитесь с SQL (Structured Query Language ) – специальным языком для сбора, записи и модификации информации, содержащейся в базах данных. Перед тем как начать, рекомендуем вам скачать файлы проекта .

Что вам понадобится

  • Инструмент для работы с базами данных MySQL .
  • Локальный или удаленный сервер с поддержкой PHP .
  • Текстовый редактор.

Создаем базу данных

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

Самым популярным инструментом для управления MySQL является PHP My Admin , Этого инструмента будет достаточно для нашего сегодняшнего руководства.

Создание таблицы

Наша таблица должна быть создана в следующем формате:

Column Name Data Type Length Null or Not Null Primary key? Auto Increment
ID INT 1 Not Null Yes Yes
FirstName Varchar 50 Not Null No No
LastName Varchar 50 Not Null No No
Email Varchar 50 Not Null No No
PhoneNumber Varchar 15 Not Null No No

Таблица базы данных состоит из столбцов и строк, как в Excel . Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных ), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина ) указывается максимальный объем памяти (хранилища ) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений (null, empty ). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

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

Как только разберетесь с таблицей, начните заполнять ее данными. 6 записей вполне достаточно, чтобы закрепить в уме процедуру. Ниже предлагаю вам собственный пример:

Column ID FirstName LastName Email PhoneNumber
2 Ryan Butler [email protected] 417-854-8547
3 Brent Callahan [email protected] 417-854-6587

Разработка формы

Чтобы создать форму поиска по сайту через Google , откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad . Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода . Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php , иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:

Поиск контактов:

Детальный поиск контактов

Вы можете искать по имени или фамилии



Если вы знакомы с языком HTML , то тут вам все должно быть понятно как минимум до открывающего тега form . Внутри этого тега находится важнейший элемент всего кода – атрибут action . В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “go ”.

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

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “go ”. На данном этапе мы проверяем наличие строки запроса go . Если результат положительный, выводим результаты поиска.

До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата (true ), то от нас не требуется выполнять какие-либо действия.

Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега :



Сначала мы открываем блок PHP-кода тегом ””.

Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:

Введите поисковый запрос

"; } ?>

Мы воспользуемся встроенной функцией isset , которая возвращает значение типа bool , и поместим в нее массив $_POST . Логическое выражение в программировании позволяет получить нам либо true , либо false .

Следовательно, если функция возвращает значение true , то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false , то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php .

Введите поисковый запрос

"; } } } ?>

Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “go ”. Сохраните изменения в файле search_go.php .

Теперь нам нужно убедиться, что посетители могут вводить первую букву в строку запроса только в верхнем или только в нижнем регистре. Нам также нужно предусмотреть способ учета критериев поиска, введенных посетителем. Лучше всего проверять введенные посетителем данные с помощью регулярного выражения:

Мы вкладываем еще одно условное логическое выражение внутрь наших двух. На этот раз мы используем регулярное выражение для проверки ввода. Мы используем встроенную функцию preg_match с двумя параметрами: регулярное выражение, и поле формы, к которому должна применяться проверка.

В нашем случае, это будет поле «Имя » (name ). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе . Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Результаты Connect, Select, Query и Return из таблицы базы данных

Чтобы получить данные из таблицы, сначала в скрипте поиска по сайту нужно подключиться к серверу. Для этого мы используем следующий код:

", "") or die (" Я не могу подключиться к базе данных, так как: " . mysql_error()); else{ echo "

Пожалуйста, введите поисковый запрос

"; } } }?>

Мы создаем переменную $db , и привязываем ее к встроенной функции MySQL mysql_connect , которая принимает три параметра: сервер с базой данных (localhost , если вы работаете локально ), логин и пароль.

После этого мы запускаем встроенную PHP-функцию die , которая останавливает дальнейшее выполнение кода, если нет соединения с базой данных. И выводим информацию об ошибке, запуская встроенную функцию MySQL mysql_error , которая вернет причину ошибки. Сохраните файл search_connectdb.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

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

Пожалуйста, введите поисковый запрос

"; } } } ?>

При опросе таблицы базы данных мы создаем переменную $sql , и привязываем ее к строке, содержащей SQL-запрос . Мы используем оператор SELECT для извлечения значений из столбцов id , а также имени и фамилии из таблицы contacts . Затем мы используем инструкцию WHERE вместе со значениями имени и фамилии, чтобы сузить поиск.

Вместе с оператором LIKE мы используем знак процента (%) – спецсимвол, который возвращает 0 и более знаков, а также переменную name из строки поиска. В результате LIKE (в сочетании со спецсимволом ) находит любое соответствующее имя в таблице базы данных. Можно описать весь процесс следующим образом: «Мы выбираем имя и фамилию из таблицы contacts , которые соответствуют введенным посетителем ». Сохраните файл search_query.php .

Пожалуйста, введите поисковый запрос

"; } } } ?>

Мы создаем переменную $result , и присваиваем ей значение функции mysql_query () , внося ее в $query. Теперь наш запрос хранится в переменной result . Чтобы вывести результат в PHP , мы создаем цикл, а затем выводим данные в неупорядоченном списке:

n"; echo "

  • " . "
  • n"; echo ""; } } else{ echo "

    Пожалуйста, введите поисковый запрос

    "; } } } ?>

    Сначала мы создаем цикл while , внутри него создаем переменную под названием row , и инициализируем ее возвращаемым значением функции mysql_fetch_array , которая принимает переменную result , в которой находится наш SQL-запрос . Внутри цикла while мы присваиваем каждому значению столбца значение переменной с идентичным названием. Затем мы выводим значения внутрь неупорядоченного списка.

    Здесь важно обратить внимание на два момента: (1) внутри цикла while не нужно присваивать значения переменным массива row , так как значения можно брать напрямую из массива row ; (2) тег anchor , который мы используем в названии нашего файла вместе с id и основным ключом. Причина этого заключается в том, что во многих поисковых элементах изначально ничего не отображается.

    Так как мы показываем только имя и фамилию, приписывая ID в конце нашего тега anchor , то мы можем использовать ID для дополнительного запроса, который позволит вывести дополнительную информацию о персонале. Сохраните файл и протестируйте форму PHP поиска по сайту (search_display.php ).

    Убираем табуляцию

    Результаты выводятся в виде неупорядоченного списка, но суть в том, что нам не нужна табуляция. Чтобы избавиться от нее, добавьте следующее CSS-правило в самое начало вашего файла в head :

    Поиск по буквам

    Для реализации поиска по буквам потребуется лишь несколько дополнительных строк кода. Добавим этот удобный функционал для посетителей. Таким образом, они смогут находить представителей персонала по буквам, которые содержатся в имени или фамилии.

    Добавьте следующую строку кода после закрывающего тега form :

    A | B | K

    Мы привязываем тег к строке запроса с by с помощью анкора, и устанавливаем его равным определенной букве. Чтобы реализовать функционал поиска по буквам, нам нужно добавить следующий код прямо после закрывающей фигурной скобки в исходном скрипте, как показано ниже:

    }//Окончание скрипта поисковой формы if(isset($_GET["by"])){ $letter=$_GET["by"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-Выберете базу данных $mydb=mysql_select_db("yourDatabase"); //-Запрос к таблице базы $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 . " results found for " . $letter . "

    "; //-Запуск цикла и сортировка результатов while($row=mysql_fetch_array($result)){ $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$row["ID"]; //-Вывести результат в массиве echo "
      n"; echo "
    • " . "" .$FirstName . " " . $LastName . "
    • n"; echo "
    "; } }

    Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

    • Мы используем функцию isset() , и вносим в нее массив $_GET , а затем проверяем значение by ;
    • Создаем переменную $letter и инициализируем ее значение массивом $_GET ;
    • Добавляем переменную letter в SQL-запрос ;
    • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

    Сохраните файл search_byletter.php и проверьте результат.

    Поиск определенного сотрудника

    Чтобы отобразить информацию об остальном персонале, которая передается через уникальное id внутри нашей ссылки, нужно добавить следующий код прямо после закрывающей фигурной скобки в скрипте letter , как показано ниже:

    }//Окончание скрипта if(isset($_GET["id"])){ $contactid=$_GET["id"]; //Подключение к базе данных $db=mysql_connect ("servername", "username", "password") or die ("Я не могу подключиться к базе данных, так как: " . mysql_error()); //-select the database to use $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 и проверьте результат.

    Обратите внимание, что наш функционал работает так, как и положено. При вводе имени или фамилии в поле, или при выборе буквы в качестве гиперссылки, отображаются только имена представителей персонала. Если навести курсор на ссылку, то в строке статуса можно увидеть уникальный ID . Если кликнуть по конкретному человеку, то адресная строка изменится, и отобразится дополнительная информация об этом сотруднике.

    SQL-инъекция

    Причина, по которой мы добавили в наше поле поиска регулярное выражение, заключается в том, чтобы никто не смог вмешаться в наш SQL-запрос . Раньше эта проблема была распространена, и хакеры умудрялись проводить собственные SQL-запросы , манипулируя при этом вашим приложением. Например, если бы мы допустили возможность использовать апостроф в нашем поле, то хакер мог бы просто удалить базу данных, используя запрос:

    "DROP TABLE

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

    В завершение

    В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

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

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

    Данная публикация представляет собой перевод статьи «How to Create a Search Feature with PHP and MySQL » , подготовленной дружной командой проекта