Erreur undefined offset

Fermé
prof_info Messages postés 8 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 8 mai 2009 - 17 janv. 2009 à 00:11
 prof_info - 20 janv. 2009 à 13:49
Bonjour,

j'aimerais savoir quelle erreur j'ai commis dans le bout de code php suivant qui à travers duquel j'ai essayé de lister le contenu d'un fichier CSV.

Nom du fichier : pers.csv ===> le fichier est placé dans le même dossier que la page de traitement

Contenu du fichier :

==============================
= ab120 = aaaaaa = bbbbbbbbb = 20 =
==============================
= cd250 = gggggg = ddddddddd = 35 =
==============================
= mk570 = qqqqqq = vvvvvvvvvv = 72 =
==============================
= bd984 = nnnnnnn = ppppppppp = 67 =
==============================

le code php traitant ce fichier est comme suit : (page : test.php)

1.   <?
2.   /* On ouvre le fichier CSV à importer en mode lecture seulement */
3.   $fichier="pers.csv";
4.
5.   if (file_exists($fichier))
6.   $fp = fopen("$fichier", "r");
7.   else
8.   { /* le fichier CSV n'existe pas */
9.   echo "Fichier inexistant!<br>affichage impossible.";
10.   exit();
11.   }
12.
13.   echo "<br><table border='1' width='70%' align='center'>";
14.   echo "<tr>";
15.   echo "<th> Code </th><th> Nom </th><th> Prénom </th><th> age </th> </tr>";
16.
17.    while (!feof($fp)) /* importation du fichier CSV */
18.    {
19.    /* Tant qu'on n'a pars encore atteint la fin du fichier CSV*/
20.    $ligne = fgets($fp,4096); /* On lit une ligne du fichier CSV*/
21.
22.    /* On récupère les champs de la ligne lue séparés par ; dans la variable liste : tableau de 4 champs */
23.    $liste = explode( ";",$ligne);
24.   
25.   /* On assigne les variables */
26.   $code = $liste[0];
27.   $nom = $liste[1];
28.    $pren = $liste[2];
29.    $age = $liste[3];
30.
31.   /* Ajouter un nouvel enregistrement dans le tableau */
32.   echo "<tr>";
33.   echo "<td> $code </td><td> $nom </td><td> $pren </th><td> $age </td> </tr>";
34.   }
35.   echo "</table>";
36.   echo "<br><h3>affichage terminé, avec succès.</h3>";
37.
38.   /* Fermeture */
39.   fclose($fp);
40.   ?>


les erreurs générées lors de l'exécution de ce code sont :

Notice: Undefined offset: 1 in c:\program files\easyphp1-8\www\excel\test.php on line 27

Notice: Undefined offset: 2 in c:\program files\easyphp1-8\www\excel\test.php on line 28

Notice: Undefined offset: 3 in c:\program files\easyphp1-8\www\excel\test.php on line 29

après avoir généré ces erreurs, le contenu du fichier CSV est affiché correctement.

5 réponses

arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
17 janv. 2009 à 03:36
Tu es sûr que $liste est bien un tableau?

Je m'y connais pas trop en php mais il ne faudrait pas plutôt faire $liste[] = ?

A mon avis il ne voit qu'un seul élément pour ta variable, c'est pour cela qu'il ne tique pas sur [0] en revanche il n'a pas l'aire de voir plus d'une seule case si tant est que liste est bien sous forme de tableau.

Pour être sûr affiche $liste puis $liste[0] et si les valeurs sont les même alors tu as un problème d'explode je crois.
0
Bonjour

Ça m'étonnait beaucoup que ton tableau s'affiche correctement.. Alors j'ai essayé ton programme et effectivement, le contenu du fichier n'est pas CSV est affiché correctement. Ça n'est pas possible avec ton programme.

Mais pourquoi ne dis-tu pas tout ? Ta description de ton, problème est fausse : tu ne dis pas qu'il affiche taille=1, mais surtout que les 3 erreurs que tu mentionnes sont répétées 9 fois. Enfin tu dis que ton tableau est correct alors qu'il ne l'est pas : tout est dans la colonne code !

Une prochaine fois, pour obtenir de l'aide, donne une description complète et exacte de ce qui se passe.
Et ne donne pas un programme source avec les numéros de ligne : Comment veux-tu qu'on le recopie pour l'essayer ? Il faut enlever tous les numéros de ligne à la main ! Heureusement que c'est un double post, j'ai repris le programme de ton message d'hier.

Pour en revenir à ton problème, voici la raison. Tu as recopié ce script depuis quelque part sans comprendre comment il marche, tu as modifié, alors tu as obtenu n'importe quoi.
$liste = explode( ";",$ligne); : Cette ligne sert à découper chaque ligne lue de ton fichier au niveau des points-virgules. Or, tu n'as pas de points virgules dans ton fichier : les lignes ne sont pas découpées en champs.

Si tu veux obtenir le bon résultat, il faut que tu découpes au niveau des '='.
Ça va déjà mieux marcher mais ça n'est pas tout. Les lignes faites de ======= ne peuvent pas être traitées comme les autres : elles ne correspondent pas à des informations à afficher et il faut les écarter.
Enfin, pour information, mais ça n'empêche pas ton script de marcher, le csv ce n'est pas ça. Si ton fichier doit vraiment être du CSV, tu ferais mieux d'utiliser les fonctions CSV du PHP, qui traitent correctement, en particulier, le cas où il y aurait un = dans les données.
0
Merci, toto

je crois que tous les programmeurs utilisent les codes écrits par d'autres personnes en les modifiant à leur mesure. est ce que j'avais tort quand je le fasse.

concernant le fichier que je suis en train d'utiliser(découper) c'est vraiment un fichier CSV que j'ai enregistré avec Excel2007 de cette façon : CSV(séparateur : point-virgule ;)(*.csv).
et c'est pour cette raison que j'ai fait l'explode selon les ';' et non pas au niveau des '=' car les lignes faites de ======= : ne sont qu'une simple représentation pour vous montrer bien le continu de mon fichier CSV qui contient 4 lignes et 5 colonnes dont la description est la suivante :

ab120 aaaaaa bbbbbbbbb 20
cd250 gggggg ddddddddd 35
mk570 qqqqqq vvvvvvvvvv 72
bd984 nnnnnnn ppppppppp 67

je t'informe que j'ai cité les numéros de lignes à titre explicatif pour te montrer lesquelles sont sources d'erreurs.

enfin mes sincères gratitudes.
0
prof_info Messages postés 8 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 8 mai 2009
17 janv. 2009 à 12:33
Salut arth,

quand j'affiche $liste puis $liste[0] il me donne respectivement comme résultat : Array    ab120.

pour l'explode au niveau des ';' c'est justifié vue que mon fichier a été enregistré comme suit :
CSV(séparateur : point-virgule ;)(*.csv)..

Merci beaucoup.
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
17 janv. 2009 à 15:22
et $liste[1] ??
0

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

Posez votre question
Pourquoi nous donnes-tu un fichier avec des = si ce sont des ; ? J'ai essayé de comprendre d'après les éléments que tu avais donnés, ils étaient faux, tu m'as fait perdre mon temps en même temps que le tien.
Et dans ton message 3, il n'y a plus ni =, ni ; pour séparer les champs.
Tu parles de fichier de 4 lignes et 5 colonnes. Pourquoi dis-tu et 5 colonnes alors que partout on n'en voit que 4 ?

Pas facile de te suivre !

Avec ce nouvelles données, j'ai reproduit le problème avec la série de 3 messages d'erreurs affichée une seule fois. Cela vient simplement du fait que fgets essaye de lire une ligne au-delà de la fin du fichier.
Pour éviter cela, ne traite pas les lignes de longueur 0.

Mais de toutes manières, je répète ce que j'ai dit plus haut, traiter les fichier CSV à l'aide d'explode est une erreur. Sauf si tu es sûr que tes champs ne contiendront jamais de ;. Il faut utiliser les fonctions csv du PHP, elles sont faites pour ça.
0
salut,

Grand merci pour tes remarques très très très précieuses.

je l'avais fait tout à fait avec les fonctions CSV du PHP et ça donne bien le bon résultat.

mes sincères gratitudes.
0