2012-02-06 2 views
19
if(isset($_POST['submit'])) { 
    if(!isset($_POST['userName'])) { 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

Я не могу получить $username как «Анонимный»? Это либо пустое, либо значение $_POST['userName'].

+1

Значение isset проверяет, была ли уже установлена ​​переменная. однако, когда вы отправляете форму, переменная будет пустой строкой. – miki725

ответ

35

isset() вернет true, если переменная была инициализирована. Если у вас есть поле формы с его значением name, установленным в userName, когда эта форма будет отправлена, значение всегда будет «установлено», хотя в нем могут не быть никаких данных.

Вместо trim() струну и проверить его длину

if("" == trim($_POST['userName'])){ 
    $username = 'Anonymous'; 
}  
+0

Безопасно ли использовать глобальную переменную напрямую без санировки или выхода из них? –

+3

@edwardtorvalds в приведенном выше примере переменная не используется, а не сравнивается. Если это изменение контекста (например, вывод в HTML/JSON, используемый в запросе на хранилище данных и т. Д.), То его следует рассматривать как ненадежное и обрабатывать контекст соответствующим образом. – Andy

35

Если форма была успешно отправлена, $_POST['userName'] всегда должны быть установлены, хотя она может содержать пустую строку, которая отличается от не устанавливаются на все , Вместо того, чтобы проверить, если это empty()

if(isset($_POST['submit'])){ 

    if(empty($_POST['userName'])){ 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 
+3

+1 Для полноты см. Http://php.net/empty, что считается «пустым». – deceze

0

Исеть тестирует ли не ключ, который вы проверяете в хэш (или ассоциативный массив) является «установить». Значение в этом контексте означает только то, знает ли оно значение. Ничто не является ценностью. Таким образом, он определяется как пустая строка.

По этой причине, если у вас есть поле ввода с именем userName, независимо от того, заполнит ли он это, это будет верно. То, что вы действительно хотите сделать, это проверить, если имя_пользователя равно пустой строке «»

7

Чтобы проверить, если свойство присутствует, независимо от стоимости, использования:

if (array_key_exists('userName', $_POST)) {} 

Чтобы проверить свойства устанавливается (свойство присутствует и значение не null или false), использовать:

if (isset($_POST['userName'])) {} 

Для того, чтобы проверить, если свойство имеет значение, а не пустой (не пустая строка, 0 (целое число), 0.0 (с плавающей точкой), '0' (строка), null, false или [] (пустой массив)), использование:

if (!empty($_POST['userName'])) {} 
1

Изменить это:

if(isset($_POST['submit'])){ 

    if(!(isset($_POST['userName']))){ 
    $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

Для этого:

if(!empty($_POST['userName'])){ 
    $username = $_POST['userName']; 
} 

if(empty($_POST['userName'])){ 
    $username = 'Anonymous'; 
} 
+0

Возможно, вы захотите попробовать это самостоятельно – jprofitt

+0

Да, хороший звонок должен быть пуст(). –

3

Вопрос: Проверить ли значение $ _POST равно пусто.

Проверьте, имеет ли значение атрибут/индекс массива значение, связанное с ним.

Ответ: В зависимости от вашего внимания к безопасности. Зависит от допустимого ввода.

1. Some people say use empty(). 

Из Руководства PHP: «[Empty] определяет, считается ли переменная быть пустым переменной считается пустым, если она не существует, или если его значение равно FALSE..» Таким образом, считается пустым.

"" (an empty string) 
0 (0 as an integer) 
0.0 (0 as a float) 
"0" (0 as a string) 
NULL 
FALSE 
array() (an empty array) 
$var; (a variable declared, but without a value) 

Если ни одно из этих значений не действительны для входного контроля, то empty() будет работать. Проблема здесь в том, что может быть слишком широким, который будет использоваться последовательно (так же, по той же причине, на разных входах управления доступом до $_POST или $_GET). Хорошее использование empty() состоит в том, чтобы проверить, что пустой массив пуст (не имеет элементов).

2. Some people say use isset(). 

isset() (конструкция языка) не может работать на целых массивов, как и в isset($myArray). Он может работать только с переменными и элементами массива (с помощью индекса/ключа): isset($var) и isset($_POST['username']). Конструкция языка isset() делает две вещи. Сначала он проверяет, имеет ли переменная или индекс/ключ массива значение, связанное с ним. Во-вторых, он проверяет, чтобы значение не было равно значению NULL PHP.

Короче говоря, наиболее точную проверку можно выполнить с помощью isset(), так как некоторые элементы управления вводом даже не регистрируются с помощью $ _POST, когда они не выбраны или не выбраны. Я никогда не знал формы, которая предоставила значение PHP NULL. Ничего из этого не делаю, поэтому я использую isset(), чтобы проверить, не связан ли ключ $_POST (и это не NULL). isset() является более строгим тестом пустоты (в смысле вашего вопроса), чем empty().

3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness. 

Вы можете проверить все, что оценивает в истинной или ложные в если заявление. Пустые массивы оцениваются как false, поэтому переменные не заданы. Переменные, содержащие значение NULL PHP, также оцениваются как false. К сожалению, в этом случае, как и в случае с empty(), многие другие вещи также вычисляют значение false: 1. пустая строка '', ноль (0), zero.zero (0.0), строка 0 ', логическая ложь и некоторая пустая Объекты XML.

--Doyle, начиная с PHP 5.3

В заключение, используйте isset() и рассмотреть вопрос об объединении с другими тестами. Пример:

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

if(is_array($_POST) && !empty($_POST)) 
{ 
    //Now test for your successful controls in $_POST with isset() 
} 

Это тоже должно работать.

if(is_array($_POST) && $_POST) 
{ 
    //Now test for your successful controls in $_POST with isset() 
    //Always validate your input. 
} 

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

Полезные ссылки:

PHP Manual: Type Testing Comparison Tables

1

я бы использовал простой одна линия comparisant для этих случаев использования

$username = trim($_POST['userName'])?:'Anonymous'; 

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

это параноидальная версия:

$username = trim(isset($_POST['userName'])?$_POST['userName']:'')?:'Anonymous'; 

Это реализуется проверка, если переменная $_POST установлена. перед доступом к нему.

+0

Если значение равно «0», переменная будет NULL. Не используйте его. – Erikas

Смежные вопросы