Soucis technique sur la verification de plusieurs champs..

WRInaute passionné
Salut,
Je rencontre un petit soucis sur la vérification de plusieurs champs. Si un champ est différent du résultat souhaité je lui ajoute +1 et je vérifie ainsi 3 champ. Donc si le résultat est supérieure à 0 ou inférieure à 3, j'ai mon erreur qui s'affiche!
La ou sa merdouille, c'est qu'il faut qu'il y est une erreur à partir de la ligne 2 pour que l'erreur de la ligne 1 s'affiche 8O ...
En résumé:
Actuellement si j'ai une erreur sur mes 3 premier champ et aucune erreur dans les 3 suivants, j'ai rien qui s'affiche.
Code:
...
$i =0;
$a =0;
//ligne 1
if($lechamp21 != 0000-00-00){
$i++;
}
if($lechamp22 != 0000-00-00){
$i++;
}
if($lechamp23 != 0){
$i++;
}
if($i > 0 and $i < 3){
echo 'erreur ligne 1';}

//ligne 2

if($lechamp24 != 0000-00-00){
$a++;
}
if($lechamp25 != 0000-00-00){
$a++;
}
if($lechamp26 != 0){
$a++;
}
if($a > 0 and $a < 3){
echo 'erreur ligne 2';}
...
J'ai essayé avec des else if mais rien n'y fait !
Ou se trouve mes erreurs svp ?
Merci
 
WRInaute passionné
A mon avis tu utilises quelque chose de bien compliqué pour pas grand chose.

Que souhaites tu faire exactement?

Car là avec un booléen :
Code:
$err = false;
$ligne = '';
if($lechamp21 != '0000-00-00' || $lechamp22 != '0000-00-00' || $lechamp23 != '0'){
$err = true;
$ligne = '1';
}


if($lechamp24 != '0000-00-00' || $lechamp25 != '0000-00-00' || $lechamp26 != '0'){
if (err) {
 $ligne .= '& 2';
} else {
  $ligne .= '2';
}
$err = true
}

if ($err) {
  echo 'Erreur ligne ' . $ligne;
}
Y'a sureement de faire ça mieux et plus simplement selon ce que tu veux faire.
 
WRInaute passionné
Merci de m'avoir répondu Bacteries :).

Alors, ce que je souhaite faire:

Les variables suivantes
$lechamp21 $lechamp22 $lechamp23
correspondent aux champs suivant
date debut1 date fin1 prix1
et ainsi de suite sur 10 lignes .. jusqu'à date debut10 date fin10 prix10soit en tout 20 dates et 10 prix.
Je veux contrôler chaque ligne par groupe de 3 de façon à ce que si un des 3 champs de la première ligne date debut1 date fin1 prix1 est vide, cela me retourne une erreur.
Soit sur une même ligne les 3 champs sont vides, soit ils sont tout les 3 remplis et ainsi de suite.

Par ailleurs et pour vérifier en plus la validité de chaque champ "date", je souhaiterais ajouter la condition suivante:
Code:
else if(!eregi("^([0-9]{4})-([0-9]{2})-([0-9]{2})*$",$lechamp21))
et pour les différents prix:
Code:
else if (!eregi("^[0-9]*$",$lechamp23))

Voilou en gros ce que je tente de faire ^^.
 
WRInaute passionné
Et pourquoi ne fais tu pas une boucle sur un tableau pour la gestion de tes "lignes" ? Ca me semblerait quand même beaucoup plus logique qu'un immonde copier/coller difficilement maintenable :p
 
WRInaute passionné
..immonde copier/coller?

Pour être franc, je suis un peut largué sur l'histoire de la boucle sur un tableau .. un exemple stp ?
Merci
 
WRInaute passionné
D'après ce que tu disais, tu as 10 lignes qui contiennent chacune 3 champs.

C'est à dire que tu as 10 fois ce genre de code, les uns à la suite des autres :
Code:
//ligne 1
if($lechamp21 != 0000-00-00){
$i++;
}
if($lechamp22 != 0000-00-00){
$i++;
}
if($lechamp23 != 0){
$i++;
}
if($i > 0 and $i < 3){
echo 'erreur ligne 1';}

Et ça ne te choque pas ?
 
WRInaute passionné
Bhin .. je ne suis pas une flèche dans le domaine alors je sais pertinemment que c'est pas génial même si parfois sa fonctionne ... et compte tenue de mes maigres "compétences" en php ... non, sa ne me choque pas plus que sa.

Ceci dit, j'essaye ^^.

La ou je sèche, c'est que je ne parvient pas à contrôler c'est 3 champs en même temps.
Si je fais if($lechamp21 != '0000-00-00' || $lechamp22 != '0000-00-00' || $lechamp23 != '0') sa ne marchera pas si un des champs est remplit correctement, idem avec des or ou alors il y a une subtilitée qui ma échappé...

Tu me parle de boucle dans un tableau .. moi je pense à un 'while' et dans ce cas, je ne vois pas quelle peut être la condition.

C'est pas manque d'essayer et de vouloir comprendre ^^ !
 
WRInaute passionné
Et si demain tu passes de 10 à 100 lignes, tu fais comment ?

Code:
foreach( $listeLignes as $numeroLigne as $uneLigne ){
    if( $ligne['dateDebut'] != 'XXX' or $ligne['dateFin'] != 'XXX'  [etc...] ){
        echo "Erreur ligne $numeroLigne.\n";
    }
}
Cela ne te semble pas beaucoup plus clair comme code ?


Sinon pour ton test, tu cherches à faire quoi au juste ? Declencher une erreur dès qu'un champ est "non renseigné" ?

Code:
if($lechamp21 != '0000-00-00' or $lechamp22 != '0000-00-00' or $lechamp23 != '0') {
// au moins un des champs est "rempli"
}

Code:
if($lechamp21 != '0000-00-00' and $lechamp22 != '0000-00-00' and $lechamp23 != '0') {
// les 3 champs sont "remplis"
}

Autre ?
 
WRInaute passionné
Bool a dit:
Sinon pour ton test, tu cherches à faire quoi au juste ? Declencher une erreur dès qu'un champ est "non renseigné" ?

Ouiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ^^ .Je veux passer à l'action suivante uniquement si tout les champs d'une même ligne sont renseignés ou non renseignés. Soit c'est totalement vide, soit c'est totalement plein.

Code:
if($lechamp21 != '0000-00-00' or $lechamp22 != '0000-00-00' or $lechamp23 != '0') {
// au moins un des champs est "rempli"
}
Donc sa me retourne une erreur si 1 ou 2 ou les 3 champs sont remplit.


Je dois mal m'expliquer ^^, alors je ré essaye une dernière fois:
En version "bourrin" sa donne un truc du style:
Code:
...
$lechamp21 = $_POST["date_debut_1"];
$lechamp22 = $_POST["date_fin_1"];
$lechamp23 = $_POST["prix_1"];
$lechamp24 = $_POST["date_debut_2"];
$lechamp25 = $_POST["date_fin_2"];
$lechamp26 = $_POST["prix_2"];

//on contrôle les champs

if($lechamp21 != '' || $lechamp22 == '' || $lechamp23 != ''){
echo 'erreur ligne 1';
}
else if($lechamp21 != '' || $lechamp22 != '' || $lechamp23 == ''){
echo 'erreur ligne 1';
}
else if($lechamp21 != '' || $lechamp22 == '' || $lechamp23 == ''){
echo 'erreur ligne 1';
}
else if($lechamp21 == '' || $lechamp22 != '' || $lechamp23 != ''){
echo 'erreur ligne 1';
}
else if($lechamp21 == '' || $lechamp22 == '' || $lechamp23 != ''){
echo 'erreur ligne 1';
}
else if($lechamp21 == '' || $lechamp22 != '' || $lechamp23 == ''){
echo 'erreur ligne 1';
}
else if(!eregi("^([0-9]{4})-([0-9]{2})-([0-9]{2})*$",$lechamp21)){ 
echo 'erreur ligne 1';
}
else if(!eregi("^([0-9]{4})-([0-9]{2})-([0-9]{2})*$",$lechamp22)){ 
echo 'erreur ligne 1';
}
else if (!eregi("^[0-9]*$",$lechamp23)){ 
echo 'erreur ligne 1';
}

//Arrivé ici c'est ok, alors je recommence pour la seconde ligne

if($lechamp24 != '' || $lechamp25 == '' || $lechamp26 != ''){
echo 'erreur ligne 2';
}
else if($lechamp24 != '' || $lechamp25 != '' || $lechamp26 == ''){
echo 'erreur ligne 2';
}
else if($lechamp24 != '' || $lechamp25 == '' || $lechamp26 == ''){
echo 'erreur ligne 2';
}
else if($lechamp24 == '' || $lechamp25 != '' || $lechamp26 != ''){
echo 'erreur ligne 2';
}
else if($lechamp24 == '' || $lechamp25 == '' || $lechamp26 != ''){
echo 'erreur ligne 2';
}
else if($lechamp24 == '' || $lechamp25 != '' || $lechamp26 == ''){
echo 'erreur ligne 2';
}
else if(!eregi("^([0-9]{4})-([0-9]{2})-([0-9]{2})*$",$lechamp24)){ 
echo 'erreur ligne 2';
}
else if(!eregi("^([0-9]{4})-([0-9]{2})-([0-9]{2})*$",$lechamp25)){ 
echo 'erreur ligne 2';
}
else if (!eregi("^[0-9]*$",$lechamp26)){ 
echo 'erreur ligne 2';
}

//Arrivé ici c'est ok, alors je recommence pour la troisième ligne
etc....
etc...
Bon, c'est long, pas esthétique, et en plus sa marche pas .. mais c'est le principe que je cherche..
 
WRInaute passionné
Justement le fait de dupliquer 40 fois le même test ne fait qu'ajouter de la complexité inutilement...

L'essentiel est d'exprimer clairement le besoin.
Pour une même ligne, tu veux que tous les champs soient remplis ou aucun. (cf ton "Soit c'est totalement vide, soit c'est totalement plein.").

Et bah en PHP ça se retranscrit de la même façon...
Cas valide 1 : tous les champs sont vides.
Code:
if( $champ1 == '' and $champ2 == '' and $champ3 == '' )
Cas valide 2 : tous les champs sont remplis.
Code:
if( $champ1 != '' and $champ2 != '' and $champ3 != '' )

On regroupe les deux :
Code:
if( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) )

Et comme toi tu cherches le contraire, on ajoute le "NOT" (et les parenthèses qui vont bien) :
Code:
if( ! ( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) ) )

Ou encore, on ressort le théorème de De Morgan... hum, j'en avais même oublié le nom :
Code:
if( ( $champ1 != '' or $champ2 != '' or $champ3 != '' ) and
    ( $champ1 == '' or $champ2 == '' or $champ3 == '' ) )
 
WRInaute passionné
Merci Bool ,

Je comprend le fond mais pas la logique ..(désolé).
J'ai repris tes différents codes que je me suis "traduit" pour mieux comprendre.
Code:
if( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) )
La les conditions sont remplies, donc ces ok.

Après tu dis que l'on cherche le contraire:

Code:
if( ! ( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) ) )
En version "traduite" sa donne donc:
Code:
	Si
	$champ1 plein et $champ2 plein et $champ3 plein 
	OU
	$champ1 vide et $champ2 vide et $champ3 vide
Donc normalement sur le echo qui suit sa me retourne une erreur si les 3 champs sont remplit ou vide. Ce qui revient à la finale au 1er code, donc pas bon .. non ?

Sur le code suivant:
Code:
if( ( $champ1 != '' or $champ2 != '' or $champ3 != '' ) and
    ( $champ1 == '' or $champ2 == '' or $champ3 == '' ) )
Version traduit sa donne:
Code:
	SI 
	$champ1 plein ou $champ2 plein ou $champ3 plein
	ET
	$champ1 vide ou $champ2 vide ou $champ3 vide
Donc normalement sur le echo qui suit, sa me retourne une erreur si un des champs est remplit ou vide donc pas bon non plus..non ?

Les conditions recherchés devrait être normalement:
Code:
	Si
	$champ1 plein et $champ2 plein et $champ3 vide 
   OU	
	$champ1 plein et $champ2 vide et $champ3 plein 
	OU
	$champ1 plein et $champ2 vide et $champ3 vide 
	OU
	$champ1 vide et $champ2 plein et $champ3 plein 
	OU
	$champ1 vide et $champ2 vide et $champ3 plein 
	OU
	$champ1 vide et $champ2 plein et $champ3 vide

	--> ERREUR
    --> SI OK ON CONTINUE

D'avance navré si je suis totalement à côté de la plaque !
PS: sur les conditions je fais comme sa:
Si -> ma condition est pas remplit -> erreur -> sinon je continue
 
WRInaute passionné
Donc normalement sur le echo qui suit sa me retourne une erreur si les 3 champs sont remplit ou vide. Ce qui revient à la finale au 1er code, donc pas bon .. non ?

Non tu as oublié de "traduire" le "NOT" devant, qui a pour unique effet d'inverser la condition.

Et surtout dans la suite, si tu négliges les parenthèses tu n'y arriveras jamais...

Code:
   SI
(   $champ1 plein ou $champ2 plein ou $champ3 plein )
   ET
(   $champ1 vide ou $champ2 vide ou $champ3 vide )

Ici ça veut dire que si tu as à la fois un champ vide et un champ plein, c'est qu'il y a une erreur. Et ça correspond exactement à ce que tu disais : "tout ou rien".
 
WRInaute passionné
Bhin non, je ne l'ai pas oublié justement.

Ton code:
Code:
if( ! ( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) ) )
revient de façon traduite à:
Code:
   Si
   ($champ1 plein et $champ2 plein et $champ3 plein)
   OU
   ($champ1 vide et $champ2 vide et $champ3 vide)
Le contraire de $champ1 == '' sinon dit $champ1 vide est bien $champ1 plein ?
Donc la première ligne du code dit bien:
-> si tout est plein
ou
Pour la seconde:
-> si tout est vide

PS: si je te prend la tête, tu as le droit de ne pas me répondre ^^.
 
WRInaute passionné
Lol, non tu vas trop vite en raccourcis :
Code:
if( ! ( ( $champ1 == '' and $champ2 == '' and $champ3 == '' ) or
    ( $champ1 != '' and $champ2 != '' and $champ3 != '' ) ) )
correspond à ça :
Code:
   Si
   ($champ1 plein OU $champ2 plein OU $champ3 plein)
   ET
   ($champ1 vide OU $champ2 vide OU $champ3 vide)

C'est à dire la même chose que mon dernier bloc.

Cf le théorème de De Morgan justement. Si tu veux "simplifier" le NOT, il faut l'appliquer à tous les éléments et remplacer tous les OU par des ET (et vice/versa).
 
WRInaute passionné
Avec un peut de retard, merci Bool ^^.

Je ne pensais pas que le "NOT" influait également sur les "and" ,"or" ...
En tout cas, j'espère m'en souvenir et encore merci :wink:
 
Discussions similaires
Haut