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()
выполняет два действия:
- Проверяет, что файл действительно загружен через форму.
- Перемещает загруженный файл по новому адресу.