Bien utiliser empty() !

Je ne compte même plus le nombre de bouts de code que j'ai lu et où l'utilisation de empty() était inutile et foireuse !
empty() retourne false si ce qu'on test vaut :

  • "" (une chaine vide)
  • 0, null ou false
  • "0" (en tant que chaine de caractère)

Pas mal de monde utilise empty() pour tester si des données postées dans un formulaires sont vides ou pas, or, empty() retourna true si des espaces ont été insérés.

<?php

$test_1 = "";
$test_2 = '';
$test_3 = " ";
$test_4 = ' ';

if(empty($test_1))
  echo '$test_1 vide', "\n";
else
  echo '$test_1 non vide', "\n";


if(empty($test_2))
  echo '$test_2 vide', "\n";
else
  echo '$test_2 non vide', "\n";


if(empty($test_3))
  echo '$test_3 vide', "\n";
else
  echo '$test_3 non vide', "\n";


if(empty($test_4))
  echo '$test_4 vide', "\n";
else
  echo '$test_4 non vide', "\n";
?>
Résulat :
$test_1 vide
$test_2 vide
$test_3 non vide
$test_4 non vide

Il faut donc l'utiliser autrement...ou même prendre autre chose si on veut tester des champs de formulaires.

On pourrait dégager les caractères d'échappements (retours à la lignes, espaces, tabulations...) et pour cela, la fonction magique est trim() :

<?php
if(empty(trim("  "))) echo "Vide";
?>

Seulement, empty() va générer une erreur :

Note: empty() ne vérifie que les variables, toute autre chose retournera une erreur d'analyse. En d'autres termes, ce qui suit ne fonctionne pas : empty(trim($name)).

http://fr2.php.net/manual/fr/function.empty.php

L'ideal est donc d'utiliser trim() avant empty :

<?php
$var = " ";
$var = trim($var);
if(empty($var)) echo 'variable vide !';
else echo 'ok';

/* résulat : variable vide ! */

$var = "salut !";
$var = trim($var);
if(empty($var)) echo 'variable vide !';
else echo 'ok';

/* résulat : ok */
?>

On a donc utiliser correctement empty(), de plus, cela permet de vraiment savoir si les données ne sont pas vides.

Le problème de cette technique, c'est que ça devient lourd...en effet, si il y a des dizaines de variables a tester, ça va vite devenir agaçant !

On peut déjà créer une fonction :

<?php
function empty_($var) {
  $var = trim($var);
  return empty($var);
}

/* si on veut des paramètres multiples */

function empty_() {
  $bool = false;
  $args = func_get_args();
  
  foreach($args as $var) {
    $var = trim($var);
    if(empty($var)) {
      $bool = true;
    }
  }
  return $bool;
}
?>

Maintenant, il existe une fonction qui retourne le même résultat que empty_() mais où la fonction empty() n'est pas utilisée....A vous de voir ce que vous voulez !

J'espère donc que vous aurez compris ou je veux en venir et que si vous utilisez empty() pour tester des infos de types POST ou GET et bien faites attention :)

Simon Vieille

Capture, un reverse proxy pour analyser les requêtes de vos applications

Capture, un reverse proxy pour analyser les requêtes de vos applications

Capture est un reverse proxy HTTP qui se place entre votre application cliente et une API. C…

Un modèle pour démarrer un script shell

Un modèle pour démarrer un script shell

J'ai régulièrement le besoin d'écrire des scripts shell un peu évolués. Il y a quelques mois…

Gitea et forgejo v1.19.0 sont dans les bacs 🥳

Gitea et forgejo v1.19.0 sont dans les bacs 🥳

Le 20 mars dernier a été publiée la version v1.19.0 de Gitea ! Forgejo, le soft fork de Gite…


  • Thymos
  • Bonjour, monsieur le génie,

    Il me semble que c'est toi qui m'a appris cela en plus :)

    Très bon cours, même si la fonction en bas est " complexe " :)
  • Haku
  • Bonjour,

    Il est bon de préciser que ces fonctions génèreront une erreur (undefined variable) si la variable n'est pas déclarée précédemment, ce qui est plutôt moche.
  • Haku
  • Pourtant empty() vérifie si la variable et déclarée en plus de vérifier son contenu.
    Et bien souvent, les codeurs se base uniquement sur empty() pour vérifier que le formulaire a été soumis et que les champs ont été remplis avec un bête if(!empty($_POST['truc']) && !empty($_POST['machin']) && ..).

    Il ne faudrait donc pas qu'en lisant cet article ils utilisent empty_($_POST['truc'], $_POST['machin'], ...) au lieu de ce qu'ils faisaient précédemment.
  • Simon
  • C'est à l'utlisateur de comprendre la fonction.
    Ils doivent savoir que isset() doit etre utilisé et ils le verront vite avec le joli undefined variable.
    Je ne pourrais donner le nombre de personnes que j'ai pu voir utiliser empty() avec des messages vides (par exemple) postés sur leur livre d'or....
  • Yanis
  • Bonjour, je tiens à te remercier!
    Je rend un travail de fin d'études ce soir et je viens de tomber sur ta fonction qui va me permettre de contourner les insertions sauvages d'espace! merci ;-)

Ajouter un commentaire

Votre commentaire - Vous pouvez utiliser du markdown

Renouveler