Отправляем введенные в форму данные
Здравствуйте, уважаемый посетитель!
В предыдущих статьях мы выполнили все необходимые подготовительные мероприятия - сформировали HTML-элементы формы, обеспечили проверку данных на стороне клиента, а затем получили данные в PHP с валидацией формы на стороне сервера. И теперь можем заняться и ее отправкой.
В связи с тем, что при отправке созданной формы онлайн заказа данные должны быть определенным образом сохранены, основное внимание здесь будет уделено взаимодействию формы с базой данных MySQL.
Тем более, что рассмотренный механизм может быть в дальнейшем использован в качестве типового решения и в других подобных случаях. В частности, в этой статье рассмотрим PHP-код, который позволит при отправке формы производить необходимые записи в специально созданную для этого таблицу MySQL.
При этом, для того, чтобы обеспечить достоверность сохраненных данных, в рассматриваемом варианте будет предусмотрена проверка результатов выполнения с выводом соответствующих сообщений в окне браузера.
Содержание
- Создаем таблицу БД MySQL
- Формируем функцию записи данных из формы в таблицу MySQL
- Дополняем скрипт отправки формы записью данных в БД MySQL
- Проверяем результат отправки формы
- Исходные файлы сайта
Создаем таблицу БД MySQL
В первую очередь составим таблицу MySQL, в которую будем записывать данные. Очевидно, в этом случае количество полей таблицы должно соответствовать количеству элементов ввода формы из расчета: одно поле таблицы - один элемент ввода формы.
Кроме того, в таблицу необходимо будет добавить еще некоторые поля, предназначенные для фиксирования даты и времени выполнения онлайн заказа. И конечно идентификатор "id", который автоматически будет увеличиваться на единицу при каждом создании новой записи.
В результате общий перечень полей таблицы можно представить в следующем виде:
№ пп | Имя поля таблицы | Имя поля фомы | Данные |
1 | id | - | Идентификатор |
2 | date | - | Дата оформления заказа |
3 | time | - | Время оформления заказа |
4 | make-date | - | Дата выполнения заказа |
5 | client-name | Имя | Имя |
6 | client-login | Логин | Логин |
7 | marka | Марка автомобиля | Марка автомобиля |
8 | model | Модель | Модель автомобиля |
9 | year | Год выпуска | Год выпуска автомобиля |
10 | vin | Последние 6 цифр VIN | Последние 6 цифр VIN автомобиля |
11 | insurance | Страховая компания | Страховая компания |
12 | client-email | Почтовый адрес | |
13 | namer-order | Вид заказа | Вид заказа |
14 | center-price | Цена сервис-центра | Цена сервис-центра |
15 | discount-price | Цена со скидкой | Цена со скидкой |
16 | password-hash | Пароль | Пароль |
Рис.1 Перечень полей создаваемой таблицы
После того, как мы определили поля таблицы, теперь можно ее создать. Ранее, этой теме была специально отведена отдельная статья Создаем таблицы MySQL c помощью phpMyAdmin, SQL-команд и в PHP.
Поэтому сейчас на этом подробно останавливаться не будем. Отметим лишь, что при формировании таблицы в зависимости от вида данных будем использовать следующие типы полей: "int", "date", "time" и "varchar" с различными параметрами количества символов.
Ниже показан скриншот структуры созданной таблицы с именем "orders", сделанный в приложении phpMyAdmin.

Рис.2 Структуры созданной таблицы
Таким образом таблица, в которой в дальнейшем мы сможем сохранять данные при отправке формы, создана.
Формируем функцию записи данных из формы в таблицу MySQL
Ранее нам уже не раз приходилось создавать подобные пользовательские функции. Все они размещались в отдельном файле "functions.php" папки "mysql", созданном специально для этих целей еще на этапе подключения базы данных.
Таким же образом мы поступим и сейчас, разместив в этом файле PHP-код функции, предназначенной для записи данных при отправке формы онлайн заказа.
В данном случае при указании параметров функции будем исходить из того, что передаваемые значения в порядке очередности должны соответствовать значениям полей таблицы. Ниже показан вариант PHP-кода сформированной пользовательской функции, созданной под именем "addOrders".
-
-
//----Функция записи данных при отправке формы онлайн заказа"-------------
-
function addOrders($date, $time, $make_date, $client_name, $client_login, $marka, $model, $year, $vin, $insurance, $client_email, $namer_order, $center_price, $discount_price, $password_hash) {
-
global $mysqli;
-
if (!$mysqli->query("INSERT INTO `orders` (`date`, `time`, `make-date`, `client-name`, `client-login`, `marka`, `model`, `year`, `vin`, `insurance`, `client-email`, `namer-order`, `center-price`, `discount-price`, `password-hash`) VALUES ('$date', '$time', '$make_date', '$client_name', '$client_login', '$marka', '$model', '$year', '$vin', '$insurance', '$client_email', '$namer_order', '$center_price', '$discount_price', '$password_hash')")) {
-
//print ('Запись не выполнена: Код ошибки: '.$mysqli->errno.' - '.$mysqli->error);
-
return false;
-
}
-
return true;
-
}
-
?>
Рис.3 Функция записи данных при отправке формы онлайн заказа
В представленном коде хорошо видно соответствие локальных переменных, указанных в круглых скобках в качестве аргументов функции $date, $time, $make_date, $client_name, $client_login, $marka, $model, $year, $vin, $insurance, $client_email, $namer_order, $center_price, $discount_price и $password (поз.3), именам полей `date`, `time`, `make-date`, `client-name`, `client-login`, `marka`, `model`, `year`, `vin`, `insurance`, `client-email`, `namer-order`, `center-price`, `discount-price` и `password` (поз.5), в которые с помощью MySQL-команды "INSERT INTO" будут записываться переданные значения локальных переменных. В остальном, работа функции будет происходить аналогично тому, как это было в других подобных случаях.
Так, с помощью условного оператора if в зависимости от результата выполнения, функция завершается либо с возвратом скрипту значения true при успешном выполнении (поз.9), либо false - в случае, если при записи данных возникнут какие-либо проблемы (поз.7).
При этом, неуспешное выполнение записи данных, с помощью функции print() (поз.6) сопровождается выводом на страницу соответствующего сообщения с указанием кода ошибки и строкового ее описания.
Такая возможность вывода информации об ошибке предназначена в первую очередь для отладки программы, либо для случаев выяснения причин возникших проблем с записью данных. Пользователю это совсем не интересно и поэтому в нормальном рабочем состоянии этот фрагмент кода можно закомментировать.
В итоге, мы получили нужную функцию, при вызове которой будет происходить запись полученных из формы данных в соответствующие поля созданной таблицы "orders". И теперь осталось ее применить в скрипте отправки формы.
Дополняем скрипт отправки формы записью данных в БД MySQL
В предыдущей статье мы создали скрипт, с помощью которого получили данные при отправке формы в виде значений PHP-переменных. Поэтому, для того, чтобы записать их в таблицу MySQL, достаточно в этот скрипт добавить код вызова созданной в предыдущем разделе пользовательской функции "addOrders".
Но кроме этого, чтобы пользователь имел возможность получения информации об отправке формы, необходимо будет предусмотреть элементы проверки результатов выполнения функции записи данных с выводом соответствующих сообщений в диалоговом окне браузера.
Ниже показан добавленный к ранее созданным фрагментам код скрипта отправки формы онлайн заказа, обеспечивающий запись данных в базу MySQL (темным фоном обозначены ранее сформированные строки кода, светлым - вновь созданные).
-
-
if (!empty($_POST["righting-button"])) {
-
$marka = $_POST["marka"];
-
$marka = check_symbol($marka, "Марка автомобиля", "1", "/^[ A-ZА-ЯЁ]+\z/iu");
-
$model = $_POST["model"];
-
$model = check_symbol($model, "Модель", "1", "/^[0-9A-ZА-ЯЁ]+\z/iu");
-
$year = $_POST["year"];
-
$year = check_symbol($year, "Год выпуска", "1", "/^[0-9]{4}\z/");
-
$vin = $_POST["vin"];
-
$vin = check_symbol($vin, "Последние 6 цифр VIN", "1", "/^[0-9]{6}\z/");
-
$insurance = $_POST["insurance"];
-
$insurance = check_symbol($insurance, "Страховая компания", "1", "/^[ 0-9A-ZА-ЯЁ-]+\z/iu");
-
$order = $_POST["order"];
-
if ($order == "1") $namer_order = "Набор для самостоятельной маркировки";
-
if ($order == "2") $namer_order = "Противоугонная маркировка специалистом в сервис-центре";
-
if ($order == "3") $namer_order = "Маркировка с индивидуальным дизайном";
-
$namer_order = check_symbol($namer_order, "Вид заказа", "1", "/^[ А-ЯЁ-]+\z/iu");
-
$center_price = $_POST["center-price"];
-
$center_price = check_symbol($center_price, "Цена сервис-центра", "0", "/^[0-9]+р\.\z/");
-
$discount_price = $_POST["discount-price"];
-
$discount_price = check_symbol($discount_price, "Цена со скидкой", "0", "/^[0-9]+р\.\z/");
-
$client_name = $_POST["client-name"];
-
$client_name = check_symbol($client_name, "Имя", "1", "/^[А-ЯЁ]{3,}\z/iu");
-
$client_email = $_POST["client-email"];
-
$client_email = check_symbol($client_email, "E-mail", "0", "/^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z]{2,6}\z/i");
-
$client_login = $_POST["client-login"];
-
$client_login = check_symbol($client_login, "Логин", "1", "/^[0-9A-Z]{3,}\z/i");
-
$client_password_1 = $_POST["client-password_1"];
-
$client_password_1 = check_symbol($client_password_1, "Пароль", "1", "/^[0-9A-Z]{6,}\z/i");
-
$client_password_2 = $_POST["client-password_2"];
-
$client_password_2 = check_symbol($client_password_2, "Подтверждение пароля", "1", "/^[0-9A-Z]{6,}\z/i");
-
if ($client_password_1 != $client_password_2) $GLOBALS['alert'] = $GLOBALS['alert'].'Значения в полях ввода пароля не совпадают';
-
//echo nl2br($marka. "\n" .$model. "\n" .$year."\n".$vin. "\n" .$insurance. "\n" .$namer_order. "\n" .$center_price. "\n" .$discount_price. "\n" .$client_name. "\n" .$client_email. "\n" .$client_login. "\n" .$client_password_1. "\n" .$client_password_2);
-
if (!empty($GLOBALS['alert'])) {
-
$GLOBALS['alert'] = 'Данные из формы не отправлены. Обнаружены следующие ошибки: \n'.$alert;
-
include "alert.php";
-
}
-
else {
-
$date = date("Y-m-d");
-
$time = date("H:i:s");
-
$salt = substr(sha1(mt_rand()),6,22);
-
$password_hash = crypt($client_password_1, '$2y$10$'.$salt.'$');
-
$success = addOrders($date, $time, $make_date, $client_name, $client_login, $marka, $model, $year, $vin, $insurance, $client_email, $namer_order, $center_price, $discount_price, $password_hash);
-
if ($success) $GLOBALS['alert'] = "Вы успешно отправили форму онлайн заказа. Информацию о статусе заявки и порядке получения скидки Вы сможете найти в личном кабинете.";
-
else
-
$GLOBALS['alert'] = "Ошибка при отправке формы. Попробуйте еще раз. В случае повторения ошибки, пожалуйста обратитесь к администратору сайта через вкладку Контакты.";
-
include "alert.php";
-
}
-
}
-
?>
Рис.4 PHP-код скрипта отправки формы онлайн заказа с записью данных в БД MySQL
Как видно, дополненный фрагмент кода состоит всего из нескольких строк (поз.39÷47). Сначала с помощью встроенной функции PHP date() формируются недостающие значения аргументов, такие как, текущая дата в виде переменной $date (поз.39) и время в виде переменной $time (поз.40).
Кроме того, в целях защиты паролей пользователей, для значения переменной $client_password_1 с помощью функции crypt() применено необратимое хеширование (поз.42) с Blowfish-шифрованием и добавлением к параметру алгоритма Blowfish автоматически генерированной уникальной "соли" в виде значения $salt. Которая в свою очередь сформирована извлечением строки из хеша псевдослучайной последовательности длиной в 22 символа с помощью функций substr(), sha1() и mt_rand() (поз.41).
В итоге после выполненных преобразований пароля, переменной $password_hash будет присвоено значение его хеша (поз.42), которое в дальнейшем будет записано в базу данных в качестве одного из значений учетной записи пользователя.
Вообще, хеширование пароля это один из важнейших вопросов защиты данных учетных записей, требующий отдельного рассмотрения. Все же пользователи доверяют нам свои персональные данные, и к этому нужно относиться серьезно. Поэтому, сейчас мы не будем на этом останавливаться, а в следующей статье подробно рассмотрим этот и другие варианты хеширования данных.
Остальные параметры функции соответствуют ранее полученным значениям переменных $client_name, $client_login, $marka, $model, $year, $vin, $insurance, $client_email, $namer_order, $center_price и $discount_price.
После того, как определены все параметры, выполняется вызов функции "addOrders" (поз.43). И исходя из возвращенного значения в виде переменной $success, с помощью условного оператора if (поз.44), в глобальную переменную $GLOBALS['alert'] записывается либо текст, соответствующий успешной записи в таблицу MySQL (поз.44), либо информационное сообщение о возникшей проблеме (поз.46).
Таким образом вместе с ранее созданными фрагментами, скрипт отправки формы онлайн заказа полностью готов для выполнения всех необходимых действий с данными, включая:
- получение в виде значений переменных PHP;
- валидацию на стороне сервера;
- запись в базу данных;
- проверку на успешность записи онлайн заказа
- вывод информационного сообщения в диалоговом окне браузера о результатах выполнения отправки формы.
И теперь осталось нам только это проверить.
Проверяем результат отправки формы
Проверку отправки формы сделаем в два этапа. Сначала отправим форму с намерено сделанной какой-нибудь ошибкой в коде пользовательской функции записи данных, нарушающей нормальное ее функционирование. А затем проверим отправку формы в рабочем режиме без каких-либо ошибок.
Для первого варианта изменим, к примеру, имя поля "time" на ошибочное "times", как показано в следующей таблице кода пользовательской функции "addOrders". Где строка с изменениями выделена светлым фоном, а имя поля с ошибкой - красным светом. И кроме этого, для вывода кода ошибки в случае проблем записи данных, раскомментируем соответствующую строку кода под номером 6.
-
-
//----Функция записи данных при отправке формы онлайн заказа"-------------
-
function addOrders($date, $time, $make_date, $client_name, $client_login, $marka, $model, $year, $vin, $insurance, $client_email, $namer_order, $center_price, $discount_price, $password_hash) {
-
global $mysqli;
-
if (!$mysqli->query("INSERT INTO `orders` (`date`, `times`, `make-date`, `client-name`, `client-login`, `marka`, `model`, `year`, `vin`, `insurance`, `client-email`, `namer-order`, `center-price`, `discount-price`, `password-hash`) VALUES ('$date', '$time', '$make_date', '$client_name', '$client_login', '$marka', '$model', '$year', '$vin', '$insurance', '$client_email', '$namer_order', '$center_price', '$discount_price', '$password_hash')")) {
-
print('Запись не выполнена: Код ошибки: '.$mysqli->errno.' - '.$mysqli->error);
-
return false;
-
}
-
return true;
-
}
-
?>
Рис.5 PHP-код функции "addOrders" с внесенной ошибкой
А затем в таком положении отправим форму.
Ниже, на рис.6 показан скриншот формы онлайн заказ с введенными для проверки данными, а на рис.7 полученный результат отправки формы по первому варианту, а именно: с допущенной в коде функции ошибкой в имени поля таблицы MySQL.

Рис.6 Скриншот формы онлайн заказа с введенными данными

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

Рис.8 Отображение кода ошибки записи данных с ее строковым описанием
В данном случае получено информационное сообщение о том, что запись не выполнена с кодом ошибки 1054. При этом в ее в описании указано, что в списке полей обнаружен неизвестный столбец "times". Что вполне объяснимо, так как ранее мы преднамеренно ввели ошибку в обозначении имени этого поля.
Таким образом мы проверили, как реагирует наш скрипт на отправку формы при наличии проблем с записью данных. Как видно, все отработало должным образом.
И теперь нам осталось проверить второй вариант - отправить форму в нормальном режиме, без внесенных каких-либо ошибок. И посмотреть, будет ли создана новая запись в таблице "orders" и если да, то какие данные в нее будут занесены.
Для этого устраним ранее созданную ошибку в коде пользовательской функции и отправим форму.

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

Рис.10 Данные из формы, записанные в таблицу MySQL
Исключение составляют всего лишь данные в поле "password-hash", в котором записан не сам пароль, а его хеш, состоящей из значительно большего количества символов.
Таким образом проверен и вариант успешной отправки данных из формы.
В итоге мы создали инструмент в виде PHP-скрипта, с помощью которого можно отправлять форму с записью всех введенных в нее данных.
А вот, что касается хеширования данных пароля, то как было ранее сказано, этот вопрос мы подробно рассмотрим в следующей статье.
Исходные файлы сайта
Исходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:
- Файлы каталога www
- Таблицы базы данных MySQL
Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.
Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.
Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.
С уважением,