message "Undefined offset"

message "Undefined offset" - PHP - Programmation

Marsh Posté le 10-03-2005 à 18:45:35    

J'ai une page .PHP qui sert à inscrire une adresse courriel dans un fichier texte.  Pour ne pas inscrire une adresse déjà existante il y à une boucle While qui vérifie chaque adresse (le contenu du fichier texte étant mit dans un tableau) et à la fin il ajoute l'adresse.  Le problème c'est qu'à la fin le compteur s'est rendu jusqu'à une valeur dépassant la dernière ligne du tableau et à cause de la config de mon hébergeur j'obtiens toujours le message "Undefined offset : X " ( X étant le nombre qui suit la dernière ligne du tableau).
 
Voici un bout de mon code :
 
 
//ouverture du fichier en mode ajout
$fichier=fopen('maillist/users.txt','a');  
//transfert du fichier dans un tableau
$liste_users = file("maillist/users.txt" );  
         
    $i=0;
    $exist=0;
     
    //Verification si l'adresse email entree est deja presente
    //Si oui, on met le flag $exist égal a 1
    while($liste_users[$i] != "" )
    {    
     if(trim($liste_users[$i]) == trim($email))
     {
      $exist=1;
                 }  
     $i++;
    }
     
    //si l'adresse email est deja presente dans le fichier texte
    //on affiche un message d'erreur

    if($exist == 1)
    {
     $msg="<p>Erreur!! Vous êtes déjà dans la liste.<BR><BR>
         L'adresse <a href='mailto:$email'>$email</a> est déja dans notre base de données.</p>";
    }
    else //sinon on ecrit l'adresse dans le fichier texte
    {
     fwrite($fichier,"$email\n" );
     $msg="<p>L'adresse émail <a href='mailto:$_POST[email]'>$_POST[email]</a> a été  ajoutée.</p>";
    }
    echo $msg;
   }
   fclose($fichier);
  }
 }
 
 
 
Tout fonctionne bien mais j'ai toujours mon message "Undefined offset"...auriez-vous une idée (autre que demander à l'hébergeur de reconfigurer son php.ini !

Reply

Marsh Posté le 10-03-2005 à 18:45:35   

Reply

Marsh Posté le 10-03-2005 à 18:47:01    

a quelle lignes ??
 
ps : et les balises code c'est pas pour les chiens :fou:


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 10-03-2005 à 18:59:07    

KangOl a écrit :

a quelle lignes ??
 
ps : et les balises code c'est pas pour les chiens :fou:


au while je pense, vu qu'à la fin du tableau passé, son prochain id ne peut exister
 
tu peux faire plus simple Lepwel : utilise in_array pour eviter ton while
 
et si tu veux garder ta boucle pour pas qu'elle plante, utilise foreach à la place de while, t'aura pas d'$id à gerer


Message édité par Profil supprimé le 10-03-2005 à 18:59:41
Reply

Marsh Posté le 10-03-2005 à 19:27:11    

Lepwel a écrit :

...
Tout fonctionne bien mais j'ai toujours mon message "Undefined offset"...auriez-vous une idée (autre que demander à l'hébergeur de reconfigurer son php.ini !


 
Ton code (enfin, la condition de séjour de la boucle while) ne veut strictement rien dire oui, un élément vide ("" ) n'est pas un élément non définit, donc quand $i devient plus grand que la taille du tableau, il couine, tu lui demandes une comparaison sur quelque chose qui n'existe pas.
 
En plus de in_array, tu peux aussi voir isset, count, ou tout ce qui concerne le parcours d'un tableau :)

Reply

Marsh Posté le 14-03-2005 à 03:32:11    

J'ai remplacé ma boucle "while" par la fonction in_array...je n'obtiens donc plus d'erreur.  Mais ca ne fonctionne pas!  Voici mon code :
 

Code :
  1. if (in_array($email,$liste_users))
  2. {
  3.  $exist=1;
  4. }


 
Je veux vérifier si la valeur de la variable $email se trouve dans le tableau $liste_users mais ca ne fonctionne pas...en mettant une addresse déjà existante dans la variable $email il ne mets pas ma variable $exist à 1 et l'adresse est mise en double dans mon fichier texte.  
 
Je présume qu'il y a quelque chose que je n'ai pas bien compris dans le foncionnement de la fonction "in_array" ?  Quelqu'un peut m'aider?

Reply

Marsh Posté le 14-03-2005 à 17:27:06    

C'est plutôt la fonction file que tu as mal comprise à mon avis. N'oublie pas qu'elle conserve les retour-chariots en fin de ligne :)

Reply

Marsh Posté le 14-03-2005 à 18:07:11    

Je ne vois pas pourquoi l'erreur serait dans ma fonction file puisque du temps ou j'avais une boucle while ma fonction marchait...c'est seulement depuis que j'ai remplacé le while par le in_array que je n'arrive plus a détecter les adresses déjà présentes dans mon fichier texte...

Reply

Marsh Posté le 14-03-2005 à 19:02:53    

Je pense comprendre le truc du retour de chariots...j'ai refait mon code comme suit :
 
 
if (in_array($email+"\n", $liste_users))
     {
 $exist=1;
     }
 
 
 
Mais maintenant il met toujours la variable $exist à 1...il y a encore un détail que je ne saisi pas bien...

Reply

Marsh Posté le 14-03-2005 à 19:28:44    

Lepwel a écrit :

Je ne vois pas pourquoi l'erreur serait dans ma fonction file puisque du temps ou j'avais une boucle while ma fonction marchait...c'est seulement depuis que j'ai remplacé le while par le in_array que je n'arrive plus a détecter les adresses déjà présentes dans mon fichier texte...


 
Parce que ton code à base de while fait une comparaison sur le trim des variables, pas sur les variables elle-mêmes. Hors trim supprime entre autre les \n...
 
Deuxio, le + n'est pas le symbole de concaténation en php... (et ce n'est pas la bonne méthode, ça va foirer si ton dernier élément ne comporte pas un retour chariot par exemple)

Reply

Marsh Posté le 14-03-2005 à 19:29:09    

Finalement tout fonctionne...il fallait seulement ajouter le \n comme ceci :
 
if (in_array("$email\n", $liste_users))
     {
 $exist=1;
     }
 
 
Merci pour vos conseils qui m'ont orientés dans mes recherches!

Reply

Marsh Posté le 14-03-2005 à 19:29:09   

Reply

Marsh Posté le 14-03-2005 à 19:29:54    

C'est toujours pas fiable, je dis ça je dis rien hein :D

Reply

Marsh Posté le 14-03-2005 à 19:31:21    

utilise trim pour supprimé les espaces en trop...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed