Получение данных. GET, POST

GET

Если есть внешние переменные, то как их прочитать?

Когда мы вводим в адресную строку браузера некий адрес и нажимаем на оправку, то серверу отправляется запрос типа GET. В PHP по умолчанию определен глобальный ассоциативный массив $_GET, который хранит все значения, передаваемые в запросах GET. Используя ключи передаваемых данных, мы можем из массива $_GET получить передаваемые значения.

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

Итак все параметры запроса находятся в специальном, ассоциативном массиве $_GET, а значит, сценарий, вызванный с таким адресом: day.php?date=2017-10-15&tscale=celsius будет иметь в этом массиве два значения с ключами date и scale.

Запрос на получение данных за выбранный день выглядит так:

<?php
$date = $_GET['date'] ?? date('Y-m-d');
// теперь можем попытаться составить какой то запрос к БД. 
$sql = sprintf('SELECT * FROM weather WHERE day = "%s"', $date);

Переданные параметры следует экранировать перед вставкой их в запрос и следовало бы написать mysqli_real_escape_string($dbCon, $date), но у нас пока не создано никакого соединения с БД $dbCon.

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

Никогда не полагайтесь на существование параметра в массиве $_GET и делайте проверку либо как в этом примере, либо функцией isset():

$date = isset($_GET["date"]) ? $_GET["date"]: date('Y-m-d');

Отправка формы

Рассмотрим один типичный пример — форма обратной связи. Для связи пользователей с авторами сайта, как правило, используются формы обратной связи, где человек указывает имя, почту для обратной связи и текст своего сообщения.

Такая форма в HTML может выглядеть следующим образом:

<form name="feedback" method="POST" action="form.php">
	<label>Ваше имя: <input type="text" name="name"></label>
	<label>Ваш email: <input type="text" name="email"></label>
	<label>Сообщение: <textarea name="message"></textarea></label>
	<input type="submit" name="send" value="Отправить">
</form>

Это очень простая форма, состоящая из трёх полей и одной кнопки отправки.

Почти весь приведённый код описывает внешний вид и содержание формы, но следует обратить внимание на два атрибута тега <form>, которые нужны для указания на способ обработки данных:

method — этот атрибут используется для определения метода HTTP, который будет использован для передачи данных на сервер. Вы уже знакомы с HTTP-методом GET, предписывающим серверу просто вернуть определённый документ.

Метод POST сообщает о намерении передать на сервер некоторую информацию, что, впрочем, не отменяет последующее получение контента.

action — содержит адрес PHP-скрипта, который должен обработать эту форму.

После нажатия на кнопку «отправить», браузер выполняет POST запрос с введёнными данными на адрес, указанный в атрибуте action.

После отправки формы управление передаётся PHP-скрипту, который должен получить переданные данные, выполнить с ними какие-либо действия (например, сохранить в базе данных) и показать результат.

Результатом может быть какое-нибудь сообщение об успешном завершении операции, например, «ваши данные успешно отправлены».

Поэтому требуется в первую очередь научиться получать данные из формы в сценарии.

POST. Обработка формы

Получение данных в обрабатывающем php скрипте из POST запроса — все данные из формы находятся в глобальном ассоциативном массиве $_POST. Этот массив всегда будет неявно присутствовать в сценарии, если он был загружен по методу POST.

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

<?php
	if (isset($_POST)) {
		print("Имя: " . $_POST['name']);
		print("<br>Email: " . $_POST['email']);
		print("<br>Сообщение: " . $_POST['message']);
	}
?>

Функция isset служит для определения, существует ли переданная ей переменная. Так мы проверяем, что сценарий загружен методом POST, то есть была отправлена форма.

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

Валидация формы

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

Так, например, при регистрации пользователя на сайте, он должен заполнить поля с адресом электронной почты и придумать себе пароль. Оба поля обязательны к заполнению, но значение из поля email также должно быть корректным email-адресом.

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

Общий подход к валидации

При выполнения валидации любой формы порядок действий будет всегда одним:

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

Формирование URI с параметрами запроса

Иногда нужно совершить обратную операцию: сформировать адрес страницы, включив туда нужные параметры запроса из массива.

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

Вот как это можно сделать:

<?php
$params = $_GET;
$date = $params['date'] ?? date('Y-m-d');

$tomorrow = date('Y-m-d', strtotime('tomorrow', strtotime($date)));
$params['date'] = $tomorrow;

$url = basename(__FILE__) . '/?' . http_build_query($params);
print($url);

Здесь мы использовали две функции:

  • basename(__FILE__) — получает имя текущего сценария;
  • http_build_query() — преобразует ассоциативный массив в строку запроса.

Отправка файлов

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

<form name="file_upload" method="POST" action="form.php" enctype="multipart/form-data">
	<label>Ваш аватар: <input type="file" name="avatar"></label>
	<input type="submit" name="send" value="Отправить файл">
</form>

Тут есть два важных отличия от первого примера:

  • Добавился новый атрибут enctype, который всегда должен иметь значение multipart/form-data. Если его не будет, то файл не отправится.
  • Сам файл загружается при помощи поля с типом file.

В PHP загруженный файл будет доступен в другом специальном массиве — $_FILES.

<?php
	if (isset($_FILES['avatar'])) {
		$file = $_FILES['avatar'];
		print("Загружен файл с именем " . $file['name'] . " и размером " . $file['size'] . " байт");
	}
?>

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

Для начала нужно убедиться, что в рабочей директории проекта существует папка для хранения загруженных файлов. Пусть она называется uploads.

Перемещение загруженного файла

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

С текущим адресом всё крайне просто — он уже находится в массиве $_FILES. Новый адрес файла, в свою очередь, состоит из пути к папке и имени файла. Так как папка uploads находится там же, где и текущий сценарий, получить путь к ней можно так: dirname(__FILE__)`.

Код для перемещения файла в новую папку:

<?php
	$current_path = $_FILES['avatar']['tmp_name'];
	$filename = $_FILES['avatar']['name'];
	$new_path = dirname(**__FILE__**) . '/' . $filename;
	move_uploaded_file($current_path, $new_path);
?>

Функция move_uploaded_file()выполняет два действия:

  • Проверяет, что файл действительно загружен через форму.
  • Перемещает загруженный файл по новому адресу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *