mysql05 49

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

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

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

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

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

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

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

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

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

Задача ввода данных в базу данных путем передачи формы 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>';
	}
?>

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

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

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

Возврат данных формы в ту же форму

Такое название присвоено операции, которая позволяет передавать данные в сценарии один или несколько раз (в последнем случае — после внесения правок) с использованием элемента form языка html. Для этого в одном сценарии объединяются одна или несколько форм и один или несколько обработчиков форм.

Необходимость в использовании операции возврата данных формы в ту же форму может также возникнуть в ситуации, когда одна и та же форма должна быть передана несколько раз.

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

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

Значение атрибута action формы
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']) ?>" method="post">

В следующем примере показана обработка формы на той же странице:

Исходный код страницы
<?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>';
	}
	else {
		$target = htmlentities($_SERVER['PHP_SELF']);
		
		// Отобразить страницу в первоначальном варианте
		echo <<<EOT
		<h1>Форма подписки на новости сайта</h1>
<p>Введите адрес электронной почты, и мы вышлем вам нашу еженедельную рассылку: </p>
<form action="{$target}" method="post">
	<input type="text" name="email" placeholder="E-mail адрес">
    <input type="submit" value="Отправить">
</form>
EOT;
	}
?>

</body>
</html>

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

Взаимодействие PHP и MySQL

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

Результаты поиска по запросу

Система Orphus