2012-01-19 3 views
2

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

if ($_POST) 

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

+2

Кстати, почему вы проверяете массив POST? Вы будете правильно проверять переменные POST? '$ _POST [" data1 "]' –

+1

, вероятно, лучше проверить отдельные переменные 'POST' для достоверности, но причина для его использования заключается в том, что пользователь переходит на страницу обработки формы вручную, в этом случае массив' POST' будет пустым, и вы можете справиться с ситуацией соответствующим образом. Я не думаю, что есть ситуация, когда этот бит кода не удастся. Я считаю, что лучше всего использовать это, а затем проверить каждую переменную отдельно внутри 'if'. – martincarlin87

+0

Я всегда проверяю определенные значения. Мне просто интересно, следует ли мне пройти и редактировать сотни экземпляров if ($ _POST), найденных в коде других народов. – teynon

ответ

6

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

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

if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... } 
1

Там не должно быть ни одного случая, когда он не будет (не то, что я могу думать, так или иначе), но я бы до сих пор:

if (!empty($_POST)) { 

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

+0

неправильный. Если массив (0) также пуст. Используйте ['count'] (http://php.net/count), чтобы проверить размер. –

+0

@WouterJ 'Если массив (0) также пуст' - не верно. Попробуйте этот '$ arr = array (0); var_dump (empty ($ arr)); ' – DaveRandom

+0

@DaveRandom, попробуйте следующее: if (empty (array (0))) echo" I'm empty "; – HappyTimeGopher

0
[[email protected]/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) или аналогичный.

0

В случае, когда форма программатора не ожидала POST, она становится очень опасным тестом. Моя модель должна проверить для каждого поля я ожидаю:

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

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

3

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

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

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

if($_SERVER['REQUEST_METHOD'] === 'POST') 
{ # Form submitted 
} 
1

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

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

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

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

+0

Это имеет немного больше смысла, так как я работаю с доисторическим кодом. – teynon