Puisque PHP est un langage dynamique, quel est le meilleur moyen de vérifier si un champ fourni est vide?
Je veux m'assurer que:
C'est ce que j'ai jusqu'ici:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
Il doit y avoir un moyen plus simple de faire cela?
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
Ancien post mais quelqu'un pourrait en avoir besoin comme moi;)
if (strlen($str) == 0){
do what ever
}
remplacez $str
par votre variable. NULL
et ""
renvoient tous deux 0 lorsque vous utilisez strlen
.
Utilisez la fonction empty () de PHP. Les éléments suivants sont considérés comme vides
"" (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)
Pour plus de détails vérifier fonction vide
J'accepterai humblement si je me trompe, mais j'ai testé moi-même et constaté que les méthodes suivantes fonctionnent pour tester les variables à valeur string (0) "" et NULL:
if ( $question ) {
// Handle success here
}
Ce qui pourrait également être inversé pour tester le succès en tant que tel:
if ( !$question ) {
// Handle error here
}
Méfiez-vous des faux négatifs de la fonction trim()
- elle effectue une conversion en chaîne avant l'ajustement et renvoie par ex. "Array" si vous lui passez un tableau vide. Cela peut ne pas être un problème, selon la façon dont vous traitez vos données, mais avec le code que vous fournissez, un champ nommé question[]
pourrait être fourni dans les données POST et sembler être un non chaîne vide. Au lieu de cela, je suggérerais:
$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
Il n'y a pas de meilleur moyen, mais comme c'est une opération que vous faites habituellement assez souvent, vous feriez mieux d'automatiser le processus.
La plupart des frameworks offrent un moyen de créer des arguments en analysant une tâche facile. Vous pouvez construire votre propre objet pour cela. Exemple rapide et sale:
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 utilise ce type de sucre en masse.
Mais vous parlez de plus que cela, avec votre "// Handle error here". Vous mélangez 2 tâches: obtenir les données et les traiter. Ce n'est pas du tout la même chose.
Il existe d'autres mécanismes que vous pouvez utiliser pour valider les données. Encore une fois, les cadres peuvent vous montrer les meilleures pratiques.
Créez des objets qui représentent les données de votre formulaire, puis attachez des processus et revenez-y. Le piratage d'un script PHP rapide (et c'est la première fois) semble bien plus fastidieux, mais il est réutilisable, flexible et beaucoup moins sujet aux erreurs depuis la validation du formulaire avec PHP tendance devenir rapidement le code spaguetti.
pour être plus robuste (tabulation, retour…), je définis:
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");
}
sources:
Celui-ci vérifie les tableaux et chaînes:
function is_set($val) {
if(is_array($val)) return !empty($val);
return strlen(trim($val)) ? true : false;
}
Lorsque vous voulez vérifier si une valeur est fournie pour un champ, ce champ peut être un string
, un array
ou unifine. Donc, ce qui suit suffit
function isSet($param)
{
return (is_array($param) && count($param)) || trim($param) !== '';
}
empty () travaillait pour cela, mais le comportement de empty () a changé plusieurs fois. Comme toujours, les documents php sont toujours la meilleure source de comportement exact et les commentaires sur ces pages fournissent généralement un bon historique des modifications apportées au fil du temps. Si vous voulez vérifier l'absence de propriétés d'objet, une méthode très défensive pour le moment est la suivante:
if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {