PHP if ($ _POST) раздражение - PullRequest
       2

PHP if ($ _POST) раздражение

2 голосов
/ 19 января 2012

В настоящее время я работаю над кодом многих других людей. Я заметил if (isset($_POST)) в некотором коде и позаботился об этом. (Это всегда будет оценивать true). Тогда я начинаю видеть это:

if ($_POST)

Подумав, это меня раздражает, но все равно работает. Кто-нибудь видит какие-либо проблемы с использованием этого, чтобы проверить, была ли отправлена ​​форма? Если массив $_POST пуст, то он оценивается как false. В каких особых случаях это может не сработать?

Ответы [ 6 ]

6 голосов
/ 19 января 2012

Это ненадежный тест - предполагается, что будет отправлен хотя бы один элемент формы.Вполне возможно выполнить POST, когда данные не передаются, что может if ($_POST) оценить как ложное, но будет мета-ложным, так как POST был фактически выполнен.

Надлежащий 100% надежный тест -

if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }
3 голосов
/ 19 января 2012

Чтобы проверить, является ли массив пустым, вы должны использовать count() или sizeof() и проверить, является ли он больше нуля:

if( count($_POST) > 0 )
{ # Array not empty
}

Лучший способ проверить, отправлена ​​ли форма, это проверить, отправлены ли почтовые переменные:

if( $_SERVER['REQUEST_METHOD'] === 'POST' )
{ # Form submitted
}
1 голос
/ 19 января 2012

До PHP 4.1 не было $ _POST. Вместо этого была переменная с именем $ HTTP_POST_VARS, которая делала то же самое, за исключением того, что она не была суперглобальной. $ HTTP_POST_VARS устарела, и, надеюсь, вам не нужно слишком беспокоиться об этом, но проверка $ _POST может фактически вернуть false, если вы запустили установку php <4.1, поэтому ваш код мог проверить это. </p>

if ($_POST) ведет себя идентично if (!empty($_POST)), за исключением одного важного различия: первая версия выдаст уведомление, если $ _POST не установлена, пустая () - версия не выдаст уведомление (конечно, error_output должен быть установлен чтобы эхо уведомлений для вас, чтобы увидеть что-то). Вы должны всегда использовать пустой, если проверяемая переменная может быть не установлена.

Я бы сказал, что если вы найдете if ($_POST), то это плохой запах. Вы уже заметили, что намерение оригинального кодера неясно. Если он хочет знать, что HTTP-запрос использовал POST-метод, то ответ Ваутера проясняет намерение. Если он хотел проверить, существует ли вообще $ _POST (проверьте для старой версии PHP), тогда isset($_POST) более понятен. Если он хотел проверить, что POST-запрос имеет хотя бы один параметр, отправленный с использованием POST, то empty($_POST) намного яснее, и такое намерение должно быть крайне редко.

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

1 голос
/ 19 января 2012

Не должно быть случаев, когда этого не произойдет (во всяком случае, я не могу об этом думать), но я все равно сделаю:

if (!empty($_POST)) {

, чтобы было яснее, что именно вы делаете.Это фактически то же утверждение, но делает его более очевидным.

0 голосов
/ 19 января 2012

В случае, когда программист не ожидал POSTed, это становится очень опасным тестом.Мой шаблон должен проверять каждое поле, которое я ожидаю:

if (isset($_POST['foo_id']) && is_numeric($_POST['foo_id'])
    && isset($_POST['name'])
    && isset($_POST['value'])
) {

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

0 голосов
/ 19 января 2012
[timwolla@/var/www]telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: localhost

HTTP/1.0 200 OK
X-Powered-By: PHP/5.3.6-13ubuntu3.3
Content-type: text/html
Content-Length: 13
Connection: close

array(0) {
}

Кажется, что с GET-запросами тоже все в порядке. Но гораздо удобнее использовать !empty($_POST) или аналогичный.

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