Поскольку 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($str){
return (!isset($str) || trim($str) === '');
}
Хотя это решает проблему, я не уверен, что это проще. +1 в любом случае
Поскольку OP просит «более простую» версию чрезвычайно простой операции, я собираюсь сказать, что на самом деле оправдано «лучше».
Я превратил это в функцию. это должно упростить ваш код проверки
Использование функции - лучший способ упростить это, я делаю то же самое
какова цель здесь! isset ()? чем он отличается от is_null ()?
также return (! empty ($ question) || trim ($ question) === '');
@nickf В этом случае они идентичны. is_null() выдает ошибку при передаче необъявленной переменной, но аргумент функции всегда объявляется. !isset() имел больше смысла в исходном ответе, который не был функцией.
@ SpYk3HH: Нет, потому что empty считает ноль пустым, а OP указывает, что 0 НЕ считается пустым. Если один знал, что вход был строкой, то у вас почти правильный подход, за исключением того, что вы забыли удалить ! - должно быть empty, а не !empty.
Кстати, экспериментируя, я обнаружил, что trim(null) и trim($a), где $ a не был объявлен, возвращают пустую строку, поэтому функцию можно упростить до return trim($question==='');
@ SpYk3HH больше экспериментов, которые показывают, что использование пустого чревато ошибками. empty("0") возвращает true. empty(" 0") возвращает false. Сколько людей знают эти тонкости? Использование empty может привести к незначительным ошибкам; Я бы этого избегал.
а если на входе массив?
Он проверяет, является ли массив нулевым или пустым!
Быстрая придирка, разве PHP не использует camel_case? Зачем использовать PascalCase для этой функции?
Исправление моего предыдущего комментария (неправильная правая скобка): может просто сделать return trim($question)==='';
Нет лучшего способа, но поскольку это операция, которую вы обычно делаете довольно часто, вам лучше автоматизировать процесс.
Большинство фреймворков позволяют упростить анализ аргументов. Для этого вы можете построить свой собственный объект. Быстрый и грязный пример:
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 массово использует такой сахар.
Но вы говорите не только об этом: здесь вы видите ошибку "// Обработка ошибок". ". Вы смешиваете две задачи: получение данных и их обработку. Это совсем не одно и то же.
Есть и другие механизмы, которые вы можете использовать для проверки данных. Опять же, фреймворки могут показать вам лучшие практики.
Создайте объекты, представляющие данные вашей формы, затем присоедините процессы и вернитесь к ним. Кажется, что взлом быстрого PHP-скрипта намного сложнее (и это впервые), но он многоразовый, гибкий и гораздо менее подвержен ошибкам, поскольку проверка формы с помощью обычного PHP имеет тенденцию быстро превращаться в спагетти-код.
Вы сделали прямо противоположное тому, что он хотел ... простоты.
Остерегайтесь ложноотрицательных результатов от функции 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
Я бы сказал, что если вы получите массив, в котором ожидали строку, это должно быть ошибкой. Если вы ожидаете массив, у вас должна быть отдельная функция фильтрации для этого.
Разве этот код не рассматривает это как ошибку? Если фильтрация выполняется где-то еще, следует позаботиться о том, чтобы она не дублировала сведения о правилах проверки аргументов в отдельные места.
Старый пост, но кому-то он может понадобиться, как и мне;)
if (strlen($str) == 0){
do what ever
}
замените $str своей переменной.
NULL и "" возвращают 0 при использовании strlen.
И всегда есть: if (strcmp('', $var) == 0)...
Почему == 0, а не только if (strlen ($ str))?
@Noumenon Потому что это ухудшит читаемость, ничего не решая. Очень легко прочитать ваше предложение как «если есть длина», в то время как оно (конечно) означает обратное.
Не поможет только строка с пробелами, если это кому-то нужно.
Если переменная не установлена, появится предупреждение.
Было бы неплохо добавить обрезку между strlen и $ str, чтобы удалить пробелы.
Если у вас включен declare(strict_types=1);, вы получите сообщение об ошибке, если $ var имеет значение null. Вы должны либо сделать $var === null || strlen($var) === 0, либо использовать empty($var)
@DanMorphis - кроме вас не следует использовать empty() для ситуации, запрошенной OP, так как это будет неверно для таких строк, как '0' и '0.0' (будет false, но OP хочет true для строк, содержащих контент).
Я смиренно соглашусь, если я ошибаюсь, но я протестировал на своем собственном конце и обнаружил, что следующее работает для проверки как строковых (0) "", так и переменных со значением NULL:
if ( $question ) {
// Handle success here
}
Что также может быть отменено для проверки успеха как такового:
if ( !$question ) {
// Handle error here
}
могу ли я предложить "if (trim ($ n)) .." в противном случае, если переменная $ _POST (например) просто "", она будет считаться действительной, тогда как в большинстве случаев это так же хорошо, как и пустая строка
Если "" не является приемлемым значением для конкретной функции, то использование обрезки будет отличной идеей.
Это вернет false для «0», числовой 0 или 0,0 и FALSE.
Используйте функцию 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" пустым
empty () раньше работал для этого, но поведение empty () менялось несколько раз. Как всегда, php-документы всегда являются лучшим источником точного поведения, а комментарии на этих страницах обычно содержат хорошую историю изменений с течением времени. Если вы хотите проверить отсутствие свойств объекта, на данный момент очень защитный метод:
if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
Если вы хотите проверить, предоставлено ли значение для поля, это поле может быть string, array или неопределенным. Итак, достаточно следующего
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;
}
Неплохо. Ответ PHPst делает то же самое, но более кратко.
для большей надежности (табуляция, возврат…) я определяю:
function is_not_empty_string($str) {
if (is_string($str) && trim($str, " \t\n\r\0") !== '')
return true;
else
return false;
}
// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
var_export($value);
if (is_not_empty_string($value))
print(" is a none empty string!\n");
else
print(" is not a string or is an empty string\n");
}
источники:
Я бы сказал использовать пустой ($ вопрос), но он также считает, что 0 пуст.