J'ai 5 champs et j'aimerais faire une vérification pour savoir si au minimum un

Résolu
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 - 2 juil. 2008 à 18:01
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 - 8 déc. 2008 à 09:49
Hello à tous :)
Voilà, j'ai un problème de dev php.
J'ai 5 champs et j'aimerais faire une vérification pour savoir si au minimum un des 5 est rempli.

L'instruction que j'ai mise en place (Voilà ce qui arrive quand on prog à 3h du mat') :

if (empty($_POST[champ1]) XOR empty($_POST[champ2]) XOR empty($_POST[champ3]) XOR empty($_POST[champ4]) XOR empty($_POST[champ5])) {
echo "Erreur : Veuillez remplir au minimum un des champs.";
}

Tout d'abord, je sais que l'instruction que j'ai écrite est *dégueulasse*.
Le truc, c'est que ça marche... sauf si le nombre de champs remplis est pair !
Je m'explique : Si il y a 2 champs remplis sur les 5 => Erreur. Si y'en a 3 => Pas d'erreur, on continue.
D'habitude je demande pas d'aide car j'aime bien persévérer, mais là j'avoue que mêmes mes cours d'électronique ne m'aide pas =/
S'il vous plaît, éclairez ma lanterne ^^ d'avance merci :)

12 réponses

JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
3 juil. 2008 à 09:56
Hello ^^

Après, une autre méthode, tu fais une somme (ça peut peu être, être utile pour ceux ayant beaucoup de champs); Ou tu as encore la solution de mettre dans un array et de faire un count(); Ensuite tu compare avec le nombre de résultat attendus :p

echo $test = empty($a) + empty($b) + empty($c) + empty($d) + empty($e);

// revient à :

function sum_empty()
{
    // on prend tous les arguments
    $args = func_get_args();
    $return = 0;
   
    foreach( $args as $arg )
    {
        $trim_arg = trim($arg);
        $return += ( is_array($arg) && empty($arg) ) || ( empty($trim_arg) &&  !strlen($trim_arg) );
        // On ajoute "+1" si $arg est vide (vide ET (0 caractère) //OU// vide ET est un array
    }
   
    return $return;
}

echo sum_empty($a, $b, $c, $d, $e);

Donc, avec un sum_epmty($a, $b, $c, $d, $e); on obtient un chiffre compris entre 0 et 5 ; 0 -> tout est remplie, 5 -> rien.
Donc, ici, ca reviendrait à :
// Si le nombre de champs vide est different de 5 ( càd, 5, 4, 3, 2, 1 => nombre de champs remplis)
if ( sum_empty($_POST['champ1'], $_POST['champ2'], $_POST['champ3'], $_POST['champ4'],$_POST['champ5']) <> 5 )
{
}
Bien sûr, rien ne faut la bonne méthode avec AND (plus performante); Ici, je teste juste en plus les '', "", 0, '0', "0" (j'ai pas mis les null par contre)
<hr />Si ma reponse te convient, merci de l'accepter ! 
3
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
9 juil. 2008 à 15:53
Lu'

Euh ... je crois qu'une solution plus simple à été donnée ...

if( isset($_POST['champ1'], $_POST['champ2'], $_POST['champ3']) )
{
    if( empty($_POST['champ1']) AND empty($_POST['champ2']) AND empty($_POST['champ3']) )
    {
       echo 'TOUS les champs sont vides';
    }
    else
    {
       echo 'Au moins un champ n\'est pas vide';
    }
}
else
{
  echo 'Un des champ n\'existe pas !';
}

<hr />Si ma reponse te convient, merci de l'accepter ! 
3
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
2 juil. 2008 à 18:17
Hello,

des "and" à la place des "xor" et ça devrait marcher, avec 3 ou 5 ou 50 :)

Quant à rendre ça moins crade, il faudrait faire une boucle. Ou alors je pense que les mettre toutes dans un même tableau et faire un if(empty()) devrait marcher aussi (à condition qu'un tableau de tableaux vides soit considéré comme vide, à vérifier).

à+
0
cs_Arnauti Messages postés 392 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 26 septembre 2009
2 juil. 2008 à 19:26
Il faut mieux utiliser OR ou || car il veut savoir si au moins l'un des champs et vide :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
2 juil. 2008 à 19:55
Euh non non, dans la condition telle qu'il l'a écrite, c'est bien des "and" et pas des "or" qu'il faut
Après évidemment on pourrait tourner le truc à l'envers.
0
cs_Arnauti Messages postés 392 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 26 septembre 2009
2 juil. 2008 à 21:09
Ahhh oui en effet j'avais (tres ?) mal lu ce qu'il avait mis. Désolé Evangun :p
0
Farfadh Messages postés 68 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 7 juillet 2008 4
3 juil. 2008 à 19:18
$trim_arg = trim($arg); génère une erreur quand $arg est un tableau.

Mais l'idée est bonne et je me permet de réécrire cette fonction :


function sum_empty()
{
    $sum = 0;
    foreach(
func_get_args()
as $arg )
    {






       // chaine ? alors on enlève les caractèreres d'espacements au début et à la fin
       if(is_string(
$arr[$arg]
)) $val = trim($arr[$arg]);

       // sinon la valeur est gardée telle quelle

       else                      $val = $arg;


       // valeur vide ? on incrémente le total

       if(empty($val))           $sum += 1;

    }
    return $sum;
}



Seulement l'écriture suivante est incorrecte :

if(sum_empty($_POST['champ1'], $_POST['champ2'], $_POST['champ3'], $_POST['champ4'], $_POST['champ5'])

Car si un champ n'est pas défini, le code va renvoyer une erreur et donc utiliser la fonction sum_empty ne revient nullement à additionner des valeurs renvoyées par empty.

Alors je propose la fonction suivante :

function array_sum_empty()
// teste des valeurs dans un tableau selon leur clé
// renvoie le nombre d'élément indéfinis, vides, nuls, ou égaux à zéro
// syntaxe : array_sum_empty($tableau, $cle1[, $cle2[, ... ]])
{
    // récupère les arguments fournis à la fonction
    $args = func_get_args();

    // on prend le premier argument qui est le tableau dans lequel on effectue les recherches
    // note : le premier argument est retiré du tableau $args
    // note : array_shift renvoie NULL si $args est vide
    $arr = array_shift($args);

    // si le premier argument n'est pas fourni ou n'est pas un tableau, on revoie NULL pour le signaler
    if(!is_array($arr)) return(NULL);

    // initialise le total de valeurs 'vides' et procède aux vérification de chaque argument qui suit
    $sum = 0;
    foreach( $args as $arg )
    {
       // entrée indéfinie ? on considère que la valeur est nulle
       if(!isset($arr[$arg]))        $val = NULL;
       // chaine ? alors on enlève les caractèreres d'espacements au début et à la fin
       elseif(is_string($arr[$arg])) $val = trim($arr[$arg]);
       // sinon la valeur est gardée telle quelle
       else                          $val = $arg;

       // valeur vide ? on incrémente le total
       if(empty($val))               $sum += 1;
    }
    return $sum;
}

Dans notre cas, on l'utiliserait de la manière suivante :

if(array_sum_empty($_POST, 'champ1', 'champ2', 'champ3', 'champ4', 'champ5')) ...

Qu'en pensez-vous ?
0
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 4
4 juil. 2008 à 15:23
Ok merci je vais voir tout ça et je vous dirais si ça marche :)
Merci pour votre rapide aide (ce que j'aime sur ce site).
0
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 4
9 juil. 2008 à 15:44
Y'aurait-il quelqu'un qui est une meilleure solution ?
Le système de boucle peut être une alternative, mais n'y a t-il pas un autre moyen plus, disons léger. Mon problème c'est que mon application est déjà assez lourde au niveau traitement de données...
Merci d'avance ^

H4ck3r vaillant, rien d'impossible.
0
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 4
1 déc. 2008 à 12:44
A l'attention de JoJo738:


Il y a cependant une erreur dans ton code. Il ne fallait pas écrire ceci :
if ( sum_empty($_POST['champ1'], $_POST['champ2'], $_POST['champ3'], $_POST['champ4'],$_POST['champ5']) 5 )</gras>

Mais celà :
if ( sum_empty($_POST['champ1'], $_POST['champ2'], $_POST['champ3'], $_POST['champ4'],$_POST['champ5']) = 5 )

Une petite erreur, mais sinon tout marche impec.
------------

Merci à vous tous pour votre aide.
Si quelqu'un à une meilleure solution je suis toujours preneur :)
@+
0
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
6 déc. 2008 à 12:32
Hello ^^

Euh ... ton code ne marche pas non plus ... le "=" n'est pas reconnu comme comparaison. Ce serait plutôt " == " ou " === ".
En faisant " = 5 " tu donne comme valeur à ce qu'il y a avant (donc pas d'importance ici, car ce n'est pas une variable) le integer 5. Ce qui renvoi 5, donc TRUE (la condition devient inutile car toujours vraie)

SI ( nombre_de_variables_EMPTY == 5 ) ALORS On traite le formulaire comme Erroné
SINON le formulaire est bon

SI ( nombre_de_variables_EMPTY <"est différent de"> 5 ) ALORS Au moins un des champ est rempli (1,2,3,4 ou 5)
SINON le formulaire est Erroné

Donc, le <> convient.
<hr />Si ma reponse te convient, merci de l'accepter ! 
0
Pyrrah Messages postés 127 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 15 février 2010 4
8 déc. 2008 à 09:49
Tout à fait d'accord avec le "==" (j'ai oublié un caractère lors de la recopie, sorry)
Cependant, quand je teste <>, bizarrement ça ne marche pas... et j'ai PHP 5.x.
0
Rejoignez-nous