Ответ 1
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($question){
return (!isset($question) || trim($question)==='');
}
Поскольку PHP - это динамический язык, лучший способ проверить, пустое ли предоставленное поле?
Я хочу, чтобы:
Это то, что у меня есть до сих пор:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
Должен быть более простой способ сделать это?
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($question){
return (!isset($question) || trim($question)==='');
}
Старый пост, но кому-то это может понадобиться, как и я;)
if (strlen($str) == 0){
do what ever
}
замените $str
на свою переменную.
NULL
и ""
оба возвращают 0 при использовании strlen
.
Использовать функцию PHP empty(). Следующие вещи считаются пустыми
"" (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)
Подробнее... пустая функция
Я смиренно признаю, если я ошибаюсь, но я протестировал на своем собственном конце и обнаружил, что следующие работы для тестирования переменных как строки (0) ", так и NULL:
if ( $question ) {
// Handle success here
}
Который также может быть отменен, чтобы проверить успех как таковой:
if ( !$question ) {
// Handle error here
}
Остерегайтесь ложных негативов из функции trim()
- он выполняет отбрасывание до строки перед обрезкой и, таким образом, возвращается, например. "Массив", если вы передадите ему пустой массив. Это может быть не проблема, в зависимости от того, как вы обрабатываете свои данные, но с кодом, который вы поставляете, поле с именем question[]
может быть предоставлено в данных POST и выглядит как непустая строка. Вместо этого я бы предложил:
$question = $_POST['question'];
if (!is_string || ($question = trim($question))) {
// Handle error here
}
// If $question was a string, it will have been trimmed by this point
Нет лучшего способа, но поскольку это операция, которую вы обычно делаете довольно часто, вам лучше автоматизировать этот процесс.
Большинство фреймворков предлагают способ анализа аргументов простой задачи. Вы можете построить для себя собственный объект. Быстрый и грязный пример:
class Request
{
// This is the spirit but you may want to make that cleaner :-)
function get($key, $default=null, $from=null)
{
if ($from) :
if (isset(${'_'.$from}[$key]));
return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
else
if isset($_REQUEST[$key])
return sanitize($_REQUEST[$key]);
return $default;
}
// basics. Enforce it with filters according to your needs
function sanitize($data)
{
return addslashes(trim($data));
}
// your rules here
function isEmptyString($data)
{
return (trim($data) === "" or $data === null);
}
function exists($key) {}
function setFlash($name, $value) {}
[...]
}
$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);
Symfony использует этот вид сахара.
Но вы говорите больше, чем с этой ошибкой //Handle здесь "Вы смешиваете 2 задания: получение данных и обработка их. Это совсем не то, что нужно.
Существуют другие механизмы, которые вы можете использовать для проверки данных. Опять же, рамки могут показать вам лучшие оценки.
Создайте объекты, которые представляют данные вашей формы, затем присоедините процессы и вернитесь к ней. Звучит намного больше, чем взломать быстрый PHP script (и это первый раз), но он многоразовый, гибкий и гораздо меньше подвержен ошибкам, поскольку проверка формы с помощью обычного PHP имеет тенденцию быстро превращаться в код spaguetti.
Если вы хотите проверить, предоставлено ли значение для поля, это поле может быть string
, array
или unifined. Итак, достаточно
function isSet($param)
{
return (is_array($param) && count($param)) || trim($param) !== '';
}
Это проверяет массивы и строки:
function is_set($val) {
if(is_array($val)) return !empty($val);
return strlen(trim($val)) ? true : false;
}
empty() используется для работы, но поведение empty() несколько раз менялось. Как всегда, php docs всегда являются лучшим источником точного поведения, и комментарии на этих страницах обычно дают хорошую историю изменений с течением времени. Если вы хотите проверить отсутствие свойств объекта, в настоящий момент очень защитный метод:
if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {