Курс PHP для начинающих - с нуля до джуниора за 2 месяца. Жми!
mysql05 42

Базы данных и веб-формы

Курс PHP для начинающих

Возможности обработки форм относятся к числу наилучших средств языка PHP. В основе решения всевозможных задач лежит использование языка HTML для создания форм ввода данных, языка PHP — для обработки данных, а сервера базы данных — для хранения данных.

В статье "Обработка форм" мы уже рассмотрели как передаются данные формы серверу (с помощью методов GET и POST) и создали пару простых сценариев обработки форм без использования баз данных. В этой статье мы усложним примеры и добавим работу с базами данных, при этом нужно учитывать следующие сведения при обработке веб-форм:

  • Необходимо соблюдать исключительную осторожность при использовании любых данных, поступающих из веб-браузера посетителя. Может показаться, что такая рекомендация и без того очевидна, но на практике все еще встречается слишком много программ PHP, в которых не подвергаются проверке и очистке данные, поступающие из веб-форм или веб-браузеров (или тому подобных программных объектов). Никогда не используйте нефильтрованные данные в запросе к базе данных.

  • Следует всегда использовать атрибут name каждого элемента ввода данных (<input>, <select>, <textarea> и т.д.). Такие атрибуты name становятся именами ассоциативного массива (например, $_POST). Это означает, что в программе нельзя будет получить доступ к требуемым значениям, если для каждого элемента, хранящего значение, не задан атрибут name.

  • Атрибут name поля формы не обязательно должен совпадать с соответствующим именем поля базы данных.

  • Если в форме требуется отобразить данные, то можно задать значение атрибута value.

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

Курс PHP для начинающих

Ввод данных в базу данных с помощью передачи простой формы

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

Исходная страница
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
<style>
* { font-family:Calibri }
</style>
</head>

<body>
<h1>Форма подписки на новости сайта</h1>
<p>Введите адрес электронной почты, и мы вышлем вам нашу еженедельную рассылку: </p>
<form action="handler.php" method="post">
	<input type="text" name="email" placeholder="E-mail адрес">
    <input type="submit" value="Отправить">
</form>
</body>
</html>

Ввод данных в базу данных и подготовка сообщения с подтверждением приема выполняются в обработчике формы (form handler), приведенном ниже, которому присвоено имя handler.php (здесь предполагается наличие базы данных users, которую мы создавали в статье "Проектирование базы данных" и файла настроек connect.php из статьи "Взаимодействие PHP и MySQL"):

Код SQL для создания простой таблицы
CREATE TABLE newsletter (
    id INT AUTO_INCREMENT,
    email VARCHAR(128),
PRIMARY KEY(id));
Файл handler.php
<?php
	// Этот файл был определен в предыдущей статье
	require_once 'connect.php';
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
<style>
* { font-family:Calibri }
</style>
</head>
<body>
<?php
// Получить данные из суперглобального массива $_POST и обработать их
	$email = isset($_POST['email']) ? 
		trim(mysqli_real_escape_string($link, $_POST['email'])) : '';
	
	if (!empty($email)) {
		$link->query("INSERT INTO newsletter(email) VALUES ('{$email}')");
		
		// Проверяем прошла ли операция (свойство affected_rows возвращает число строк, 
		// затронутых предыдущей операцией MySQL (в нашем случае 1)
		if ($link->affected_rows == 1)
			echo '<h1>Спасибо за подписку</h1>';
		else
			echo '<p>Что-то пошло не так при попытке записи вашего email в базу данных</p>';
	}
?>