expression reguliere et warning foreach

Eléphant du PHP | 85 Messages

13 nov. 2005, 23:13

salut, j'ai un probleme avec une expression reguliere et je vois pas trop d'ou ca vient! le but est de verifier un code postal et ...ca marche pô.j'ai l'erreure suivante :
Warning: Invalid argument supplied for foreach() in c:\www\ciridd\formulaire 4\traitement.php on line 39
j'ai mis un commentaire à la ligne 39,voila mon code:
<?php



//champs a tester dans un tableau
    $chps_test=array("nom" => "nom",
                    "prenom" => "prenom",
                    "cp" => "code_postal",
                    "mail" => "e-mail");
//echo "test depart ok <br> ";
//controle de tous les champs vides
foreach($_POST as $cle => $valeur)
    {if ($valeur=="")
        {                       //if{ $cle != "cp" ) {  tous obligatoire sauf cp
        {$champvide[$cle] = "blanc";} 
        }                                
                              

    elseif ($cle == "prenom" or $cle== "nom" )
        {if (!ereg("^[A-Za-z' -]{1,50}$" ,$_POST[$cle]))
        {$mauvaisformat[$cle]="mauvais";}
        }
    elseif ($cle == "mail" )
        {if (!ereg("^.+@.+\..+$", $valeur))
        {$mauvaisformat[$cle]="mauvais";}
        }
    elseif ($cle == "cp" )
        {if (!ereg("^[9-0]{5}?$", $valeur))
        {$mauvaisformat[$cle]="mauvais";}
        }
    }
//echo "control de champ ok <br>";
//si un champ vide afficher message
if (@sizeof($champvide) > 0 or @sizeof($mauvaisformat) > 0) // en cas de champ vide
    {
     echo "<b>un champs obligatoire n'a pas ete renseigne.
     vous devez le saisir :</b><br>";
    // affichage des informations requises
    foreach($champvide as $cle => $valeur)
        {echo "&nbsp;&nbsp;&nbsp;{$chps_test[$cle]}<br>";}
    }
if (@sizeof($mauvaisformat) > 0)
    {echo "<b>Un ou plusieurs champs contiennent des informations qui semblent
        incorrectes. Corriger le format de : </br><br>";
        foreach($mauvaisformat as $cle => $valeur) //ligne 39
            {echo "&nbsp;&nbsp;&nbsp;{$chps_test[$cle]}<br>";}
    }


//mise en forme des données
$nom=trim(strip_tags($_POST['nom']));
$prenom=trim(strip_tags($_POST['prenom']));
$mail=trim(strip_tags($_POST['mail']));
$cp=trim(strip_tags($_POST['cp']));

//affichage formulaire
echo "<p><hr>
    <form action='traitement.php' method='POST'>
    <center>
    <table width='95%' border='0' cellspacing='0' cellpadding='2'>
    <tr>
    <td align='right'><B>{$chps_test['nom']}:</br></td>
    <td><input type'text' name='nom' size='35' value='$nom'></td>
    </tr>
    <tr>
    <td align='right'><B>{$chps_test['prenom']}:</br></td>
    <td><input type'text' name='prenom' size='35' value='$prenom'></td>
    </tr>
    <tr>
    <td align='right'><B>{$chps_test['cp']}:</br></td>
    <td><input type'text' name='cp' size='35' value='$cp'></td>
    </tr>
    <tr>
    <td align='right'><B>{$chps_test['mail']}:</br></td>
    <td><input type'text' name='mail' size='35' value='$mail'></td>
    </tr>
    </table>
    <p><input type='submit' value='validez'>
    </form>
    </center>";
    exit();


echo "ca marche";
?>
merci de votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 nov. 2005, 23:22

Salut, d'apres l'erreur $mauvaisformat n'est pas un tableau...

essaie en initialisant la variable:
$mauvaisformat=array();

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 85 Messages

13 nov. 2005, 23:48

pas de changements, l'erreur et la meme. l'epression reguliere est elle juste? c'est precisement ça qui marche pas. c suffirai à foutre la merde?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 nov. 2005, 23:56

pour l'expression je sais pas trop, c'est pas vraiment mon domaine mais ça me semble correct.

Mais l'erreur ne viens pas forcément de la puisque tu met plusieurs valeurs dans ce tableau suite a des tests.

enleve un peu tous ces @ que tu as partout ça cache les éventuelles erreurs.

verifis aussi le contenu du tableau:
echo '<pre>';
echo var_dump($mauvaisformat);
echo '</pre>';
EDIT: tu peut aussi verifier le format du champ CP avec is_numeric() et en limitant le champ de saisie a 5 chiffres :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 85 Messages

14 nov. 2005, 00:09

rien ne s'affiche pour le contenu du tableau mais il ne peut pas etre vide puisqu'il me revoi la bonne valeur au test de mise en forme.... c'est chopour le cerveau là :shock:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 nov. 2005, 00:18

euh .. au passage tu ne te plante pas de foreach() ?

ligne 39 en faisant un copier coller de ton code je tombe sur:
foreach($champvide as $cle => $valeur) 
et ce tableau $champvide n'existe pas non plus selon le 1er test hors tu fait le foreach meme si ce tableau n'existe pas dans le cas ou l'autre tableau a une taille sup a 0:
if (@sizeof($champvide) > 0 or @sizeof($mauvaisformat) > 0)
remplace par un ET (&&) :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 85 Messages

14 nov. 2005, 00:32

euh ... je me suis effectivement plante sur le foreach. sino j'ai le regret de t'annoncer que y a pas de chahgement, je te fais passer la premiere parti du code :le formulaire .on sait jamas l'erreur vient peut etre d'ici.

Code : Tout sélectionner

<html> <body> <form method="POST" action="traitement.php"> nom* :<input type="text" name="nom" size="16" maxlenght="20" /><br /> prenom* :<input type="text" name="prenom" size="16" /><br /> code postal :<input type="text" name="cp" maxlength="5" /><br /> E-mail* :<input type="text" name="mail" /><br /> <input type="submit" value="ok" /> </form> </body> </html>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 nov. 2005, 00:38

remplace alors ton test, d'ailleur je ne vois pas l'interet de faire une double condition:
if (@sizeof($champvide) > 0 or @sizeof($mauvaisformat) > 0)
par
if (sizeof($champvide) > 0 )
puis de meme initialise le tableau:
$champvide=array();

dde plus tu as trop d'accolades ici:
if ($valeur=="")
        {                       //if{ $cle != "cp" ) {  tous obligatoire sauf cp
        {$champvide[$cle] = "blanc";}
        } 
il suffit:
if ($valeur=="")
        {                       //if{ $cle != "cp" ) {  tous obligatoire sauf cp
        $champvide[$cle] = "blanc";
        } 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 337 Messages

14 nov. 2005, 03:48

J'aurais plutôt mis "^[0-9]{5}?$" pour bien avoir l'intervalle de caractère de 0 à 9 comme masque, je sais pas si mettre 9-0 est correct.

Invité
Invité n'ayant pas de compte PHPfrance

14 nov. 2005, 10:33

j'avai un souci sur apache donc la moitié du probleme est resolu. Maintenant j'ai effectivement un souci sur l'epression reguliere ligne 30. j'ai l'erreur "ereg erang". je pense que je vois le bout du tunnel lol