PHP
Чтение данных запроса
Поиск…
замечания
Выбор между GET и POST
GET , лучше всего предоставлять данные, необходимые для отображения страницы, и их можно использовать несколько раз (поисковые запросы, фильтры данных ...). Они являются частью URL-адреса, что означает, что они могут быть добавлены в закладки и часто используются повторно.
Запросы POST, с другой стороны, предназначены для отправки данных на сервер только один раз (контактные формы, формы входа ...). В отличие от GET, который принимает только ASCII, запросы POST также позволяют бинарные данные, включая загрузку файлов .
Вы можете найти более подробное объяснение их различий здесь .
Уязвимость данных запроса
Также посмотрите: какие уязвимости используются при прямом использовании GET и POST?
Получение данных из суперглобальных переменных $ _GET и $ _POST без какой-либо проверки считается плохой практикой и открывает методы для пользователей для потенциального доступа или компрометации данных с помощью инъекций кода и SQL . Неверные данные должны быть проверены и отклонены, чтобы предотвратить такие атаки.
Данные запроса должны быть экранированы в зависимости от того, как они используются в коде, как указано здесь и здесь . В этом ответе можно найти несколько различных функций эвакуации для общих случаев использования данных.
Обработка ошибок загрузки файлов
$_FILES["FILE_NAME"]['error']
(где "FILE_NAME"
- это значение атрибута имени входного файла, представленного в вашей форме) может содержать одно из следующих значений:
-
UPLOAD_ERR_OK
- Нет ошибки, файл загружен с успехом. -
UPLOAD_ERR_INI_SIZE
- Загруженный файл превышает директиву upload_max_filesize вphp.ini
. -
UPLOAD_ERR_PARTIAL
- загруженный файл превышает директиву MAX_FILE_SIZE, указанную в HTML-форме. -
UPLOAD_ERR_NO_FILE
- файл не загружен. -
UPLOAD_ERR_NO_TMP_DIR
- Отсутствует временная папка. (Из PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
- Не удалось записать файл на диск. (Из PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- расширение PHP остановило загрузку файла. (Из PHP 5.2.0).
Основным способом проверки ошибок является следующее:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
Чтение данных POST
Данные из запроса POST хранятся в суперглобальном $_POST
в форме ассоциативного массива.
Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset()
или empty()
или оператора null coalesce.
Пример:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
Чтение данных GET
Данные из запроса GET хранятся в суперглобальном $_GET
в форме ассоциативного массива.
Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset()
или empty()
или оператора null coalesce.
Пример: (для URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
Чтение исходных данных POST
Обычно данные, отправленные в запросе POST, представляют собой структурированные пары ключ / значение с типом MIME- application/x-www-form-urlencoded
. Однако для многих приложений, таких как веб-сервисы, вместо них необходимо отправить необработанные данные, часто в формате XML или JSON. Эти данные могут быть прочитаны с использованием одного из двух методов.
php://input
- это поток, который обеспечивает доступ к необработанному тексту запроса.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
- это глобальная переменная, содержащая необработанные данные POST. Он доступен только в том случае, если always_populate_raw_post_data
директива always_populate_raw_post_data
в php.ini
.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Эта переменная устарела с PHP версии 5.6 и была удалена в PHP 7.0.
Обратите внимание, что ни один из этих методов не доступен, если для типа содержимого задано значение multipart/form-data
, которое используется для загрузки файлов.
Загрузка файлов с помощью HTTP PUT
PHP обеспечивает поддержку метода HTTP PUT, используемого некоторыми клиентами для хранения файлов на сервере. Запросы PUT намного проще, чем загрузка файлов с использованием запросов POST, и они выглядят примерно так:
PUT /path/filename.html HTTP/1.1
В ваш PHP-код вы тогда сделаете что-то вроде этого:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
Также здесь вы можете прочитать интересные вопросы и ответы о получении файла через HTTP PUT.
Передача массивов POST
Обычно элемент HTML-формы, представленный в PHP, приводит к одному значению. Например:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Это приводит к следующему результату:
Array
(
[foo] => bar
)
Однако могут быть случаи, когда вы хотите передать массив значений. Это можно сделать, добавив PHP-подобный суффикс к имени HTML-элементов:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
Это приводит к следующему результату:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Вы также можете указать индексы массива в виде чисел или строк:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
Что возвращает этот вывод:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Этот метод можно использовать, чтобы избежать циклов обработки после массива $_POST
, делая ваш код более компактным и более кратким.