IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Erreur Undefined offset dans un tableau


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Erreur Undefined offset dans un tableau
    Bonjour,

    Je suis en train d'écrire une fonction.

    Dans la table "langues" j'ai les valeurs suivantes :
    a français
    b anglais
    c allemand
    d russe

    J'ai une erreur "Undefined offset: 1" et "Undefined offset: 2" quand je fais les echos de $row[1] et $row[2]. Par contre l'echo de $row[0] fonctionne et m'affiche bien : "français"

    PS : la fonction est en cours d'écriture et n'est evidemment pas complète.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    require_once 'connectbdd.php';
    $id_langue = ('abc');
    $table = ('langues');
    $langue = donne($id_langue,$table);
     
    function donne($id_langue,$table) {   
    $lg_chaine = strlen($id_langue);
     
    for($i = 0 ; $i < $lg_chaine ; $i++) {
    $resultat = mysql_query('SELECT nom_langue FROM ' . $table . ' WHERE langue_id = "' . ($id_langue[$i]) . '"')
    or die('Erreur de sélection dans la base de données '.mysql_error());
    $row =  mysql_fetch_array($resultat);
    }
     
    echo $row[0];
    echo $row[1];
    echo $row[2];
    exit();
    // return $langue;
    }
    ?>
    Dans la boucle j'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row =  mysql_fetch_array($resultat);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row[$i] =  mysql_fetch_array($resultat);
    et là ça affiche "ArrayArrayArray"

    Merci pour votre aide

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Tu peux utiliser ma fonction de debugging préférée pour analyser une variable, elle te dira plein de choses :
    http://fr.php.net/manual/fr/function.var-dump.php
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 148
    Points : 186
    Points
    186
    Par défaut
    Bonjour

    "SELECT nom_langue FROM"

    tu ne peux donc faire que $row[0] ou $rox['nom_langue'] sauf si tu as mis en MYSQL_ASSOC, ou MYSQL_NUM.

    Tu ne peux ressortir que nom_langue à chaque passage dans la boucle. donc à quoi pourrait bien correspondre $row[1] et $row[2] ?

    GoT

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Débutant
    Je précise que je suis débutant !

    J'ai fait des essais : id_langue[0] a la valeur "a", id_langue[1] = "b", id_langue[2] = "c".

    J'implémente donc $i dans la boucle pour récupérer les valeurs "français", "anglais" et "allemand" de la table 'langues', et les mettre dans le tableau $row.


    $row[0] à bien la valeur "français", mais pour une raison que je ne comprends pas $row[1] et $row[2] sont indéfinis...

    Dans ma logique (qui vaut ce qu'elle vaut !) $row[1] et $row[2] devrait correspondre respectivement à "anglais" et "allemand"

    Jml94 Je suis en train d'étudier var_dump mais ça reste un peu (beaucoup) nébuleux ! Si tu pouvais l'adapter dans mon code ce serait sympa !

    Merci !

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 148
    Points : 186
    Points
    186
    Par défaut
    ReBonjour,

    Il n'est pas nécessaire de faire un var_dump.

    Pour faire simple, mysql_fetch_array va te retourner un tableau ($row), celui-ci va contenir tout ce qu'il y a dans la ligne.

    la boucle while correspondant à TANT QUE $row = mysql_fetch_array($requete) FAIRE, donc tant qu'il y a un enregistrement à ressortir et mettre dans le $row on continue à boucler.


    Imagine avec ton principe, une base de données avec 4 000 000 d'enregistrements, est-ce que que tu te vois mettre $row[362530], $row[362531] et ainsi de suite ?


    $row[ ELEMENT ], ELEMENT va correspondre à :

    par défault : MYSQL_BOTH, donc tu peux mettre des valeurs numériques ou associatives.
    EX: $row[0], $row['nom_langue']
    Donc ce que tu as selectionné dans ta table grâce à la requête.

    MYSQL_NUM : tu ne peux mettre que $row[0] en rapport avec ta requête
    MYSQL_ASSOC : tu ne peux mettre que $row['nom_langue'].



    Pour conclure, tu utilises une boucle qui va parcourir le tableau et attribuer à row ta requête, dans ta requête tu ne selectionnes que nom_langue, donc à chaque enregistrement $row[0] = nom_langue = la valeur de cette langue.


    Par conséquent enlève $row[1], $row[2] et ton code devrait marcher .
    Enlève au passage ton exit; celui-ci va mettre fin à l'exécution de ton programme et tu ne feras qu'un seul passage dans la boucle.



    Si tu as des questions je suis à disposition, le cours d'économie est beaucoup moins intéressant que la progra


    GoT



    EDIT : j'oubliais quelque chose de très important, le offset que tu as eu en erreur te dit qu'il ne trouve pas de valeur dans le tableau à la position 1 et 2.
    C'est grâce à ça que j'ai direct su où se situait l'erreur. Si tu veux tester, fait un $row[200] ou un $row['bonjour'], tu verras que $row['bonjour'] ne contient rien du tout, ni une chaine vide, ni 0, un faux, mais vraiment NULL (si mes souvenirs sont bons).

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par GoTrUnKo Voir le message
    ReBonjour,

    Il n'est pas nécessaire de faire un var_dump...
    Salut GoTrunko,

    Le reste de ton post est tout à fait exact, mais je ne suis pas d'accord avec ce démarrage. Un professeur en cours ne va pas te faire de cours magistral s'il peut s'en passer pour te laisser réfléchir et trouver la solution en t'orientant sur les bonnes pistes. C'est aussi ce que je préfère faire : orienter les gens, pas leur mâcher un travail qu'ils ne seront pas capables de reproduire au moindre changement.

    Donc si, le var_dump est hautement nécessaire afin de comprendre la structure de la variable d'accueil, ce qui est largement aussi parlant que des explications théoriques.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 148
    Points : 186
    Points
    186
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Salut GoTrunko,

    Le reste de ton post est tout à fait exact, mais je ne suis pas d'accord avec ce démarrage. Un professeur en cours ne va pas te faire de cours magistral s'il peut s'en passer pour te laisser réfléchir et trouver la solution en t'orientant sur les bonnes pistes. C'est aussi ce que je préfère faire : orienter les gens, pas leur mâcher un travail qu'ils ne seront pas capables de reproduire au moindre changement.

    Donc si, le var_dump est hautement nécessaire afin de comprendre la structure de la variable d'accueil, ce qui est largement aussi parlant que des explications théoriques.
    Bonjour, je suis désolé je pensais que toi aussi tu n'avais pas vu l'erreur, étant donné que pasc06 est débutant je l'ai directement mis sur la voie, sa logique n'était pas la bonne, et continuer à réfléchir dans ce sens lui aurait vallut des heures de perdues.




    Pasc06, il faut que tu te dises que mysql_fetch_array va te créer un tableau contenant le resultat de ta requête.

    http://fr.php.net/manual/fr/function...etch-array.php

    C'est à dire qu'à chaque passage dans la boucle tu demandes le résultat de ta requête, quand tu selectionnes la langue, dans ta base de données, sur le même enregistrement tu n'as pas "français,anglais,allemand". Il faut que tu te dises que $row[0] = nom_langue, et donc tu dois faire trois passages dans la boucle.

    Si tu avais mis

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $requete = "SELECT nom_langue, pays FROM machinTruc";
    $result = mysql_query($requete);
    while($row = mysql_fetch_array($result))
    {
       echo $row[0]; //va retourner la valeur de nom_langue
       echo $row[1]; //va retourner la valeur de pays
    }

    Comprends-tu le principe maintenant ?

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par pasc06 Voir le message
    Dans ma logique (qui vaut ce qu'elle vaut !) $row[1] et $row[2] devrait correspondre respectivement à "anglais" et "allemand"
    C'est là que ta logique est bancale, mais c'est normal au début.
    Jml94 Je suis en train d'étudier var_dump mais ça reste un peu (beaucoup) nébuleux ! Si tu pouvais l'adapter dans mon code ce serait sympa !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    $row =  mysql_fetch_array($resultat);
    var_dump($row);
    exit();
    Ainsi tu verras ton problème, comme l'a aussi expliqué gotrunko : $row est un tableau à deux dimensions (que j'appellerais plutôt $rows d'ailleurs)
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut GoTrUnKo
    OK oui j'ai compris GoTrUnKo ! En + je l'ai déjà fait je suis nul !

  10. #10
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Vos échanges sont de très bonne qualité et j'ai d'autres trucs sur le feu, aussi je vous laisse.

    @+
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Ce n'est qu'un au revoir...


    Ok jml94 merci de ton aide... A+

    Effectivement GoTrUnKo mon histoire de $row[1] et $row[2] ne pouvait pas marcher... La logique n'était pas bonne !

    Mais comment faire alors pour récupérer dans une boucle les valeurs "français", "anglais" et "allemand" de ma table en ayant pour indice "a", "b" et "c" ?

    Je précise que je pourrais avoir $id_langue = ('acd')

    Je devrais dans ce cas récupérer dans la table 'langues' les valeurs "français","allemand" et "russe" (russe ayant l'indice "d")

  12. #12
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Y a quelqu'un ?
    Personne pour m'aider ?

  13. #13
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ben si, mais avec ce que t'a donné gotrunko, tu devrais t'en sortir.
    N'est-ce pas le cas ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  14. #14
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Bin non...
    Voir mon message de 9h59...

    En fait je voudrais qu'à la fin de ma boucle si j'ai par exemple $id_langue = ('acd')

    $row[0] = "français"
    $row[1] = "allemand"
    $row[2] = "russe"

    Et ça je n'y arrive pô...

  15. #15
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bon, c'est bien parce que c'est toi et que j'ai faim :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $requete = "SELECT nom_langue FROM machinTruc";
    $result = mysql_query($requete);
    $langues = array(); // initialisation du tableau voulu
    while($row = mysql_fetch_array($result))
       $langues[] = $row[0]; //ajoute la valeur de nom_langue au tableau final
     
    // la boucle est finie, le tableau est prêt
    var_dump($langues);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  16. #16
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut La fin dans le monde
    Merci de ton aide

    Je crois que j'étais sur la même voie que ta solution : un 2ème tableau...

    Ca faisait 6 heures que je galérais... Heureusement que tu avais faim...

    D'un point de vue philosophique j'ai rien à redire... Mais d'un point de vue pratique ça se discute...!

  17. #17
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut La solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    //Paramètre de la fonction : $id_langue et le nom de la table
    require_once 'connectbdd.php';
     
    $id_langue = ('acd');  // le paramètre
    $table = ('langues');  // Le nom de la table
    $langue = donne($id_langue,$table);  // L'appel de la fonction
     
    function donne($id_langue,$table) {   
    $lg_chaine = strlen($id_langue); // Calcul de la longueur de $id_langue
     
    $tab = array();
    for($i = 0 ; $i < $lg_chaine ; $i++) { 
    $resultat = mysql_query('SELECT nom_langue FROM ' . $table . ' WHERE langue_id = "' . ($id_langue[$i]) . '"') // Exemple $id_langue[0] = français
     
    or die('Erreur de sélection dans la base de données '.mysql_error());
    $row =  mysql_fetch_array($resultat);
    $tab[$i] = $row[0];
    }
    // Ici la suite de la fonction qui est en cours d'écriture ! Le but
    // étant de renvoyer une chaîne $langues qui sera égale à 
    // "français, allemand et russe" dans le cas ou id_langue = ('acd')
     
    return $langues;
    }
    ?>
    J'ai bien :
    $tab[0] = "français"
    $tab[1] = "allemand"
    $tab[2] = "russe"

  18. #18
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Là je comprend pas trop ta fonction.
    C'est quoi cette longueur de chaîne que tu parcours ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  19. #19
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Plus c'est long...
    Attention l'écriture de la fonction n'est pas terminée !

    Je viens de laisser un nouveau post toujours dans "syntaxe" pour la suite

    J'ai ajouté des commentaire dans le message "la solution"

  20. #20
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ok, je vois.
    Le truc c'est pourquoi tu passes tous tes ids concaténés dans un chaîne ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ERREUR Undefined offset dans une boucle
    Par xounet dans le forum Langage
    Réponses: 7
    Dernier message: 08/05/2014, 11h08
  2. Réponses: 2
    Dernier message: 05/05/2008, 22h19
  3. ERREUR D INSERE DANS UN TABLEAU A PARTIR DE JTextField
    Par fatimazahrazaidi dans le forum JDBC
    Réponses: 1
    Dernier message: 06/04/2008, 18h15
  4. Réponses: 1
    Dernier message: 28/01/2008, 16h33
  5. erreur Undefined offset
    Par wbagg2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 01/12/2005, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo