Forum Programmation.php Undefined index

Posté par  .
Étiquettes : aucune
0
5
avr.
2010
Salut tout le monde
je suis en train de développer un petit script php de gestion de stock pour mon boulot et je suis bloqué sur quelque chose de bien bête.
J'utilise les templates phpLib
J'ai une requête SQL comme ceci:
SELECT M.nom_modele, COUNT(S.id_modele), E.nom_etat 
FROM stock S
LEFT JOIN modeles M
ON S.id_modele = M.id
LEFT JOIN etat E
ON S.id_etat = E.id
AND S.id_societe = ".$societe."
GROUP BY S.id_modele, S.id_etat ;


La variable $societé est définie dans le code au cas où elle ne serait pas définie en GET
Cette requête passe très bien dans phpmyadmin directement, il me retourne un tableau de 2 lignes sur trois colonnes contenant ce que je souhaite des tables en question.
Mais quand je tente de le faire avec le PHP comme ceci:
$statement = requete_sql($sql);
$template->assign_block_vars("liste_stock",array());
while ($resultat=mysql_fetch_array($statement))
{
$quantite = $resultat["COUNT(S.id_modele)"];
$template->assign_block_vars("liste_stock",array(
"MODELE"=>$resultat["M.nom_modele"],
"QUANTITE"=>$quantite,
"ETAT"=>$resultat["E.nom_etat"]
));
}

J'ai des erreurs:

Notice: Undefined index: M.nom_modele in /home/epy/Web/stocks/afficher.php on line 41

Notice: Undefined index: E.nom_etat in /home/epy/Web/stocks/afficher.php on line 43

Notice: Undefined index: M.nom_modele in /home/epy/Web/stocks/afficher.php on line 41

Notice: Undefined index: E.nom_etat in /home/epy/Web/stocks/afficher.php on line 43

Cette façon d'assigner les variables fonctionne avec la requête SELECT sans jointures, est-ce que PhpLib bloque à cause des jointures ? Est-ce que j'ai écrit une bêtise dans mon code ?

Merci !
  • # mysql_fetch_assoc

    Posté par  . Évalué à 2.

    Ça marche pas mieux avec mysql_fetch_assoc() à la place de mysql_fetch_array() ?

    [http://www.php.net/manual/en/function.mysql-fetch-assoc.php]

    Sinon utilise print_r() pour afficher le contenu de la variable $row et vérifier quel est le problème.

    [http://fr2.php.net/manual/en/function.print-r.php]
    • [^] # Re: mysql_fetch_assoc

      Posté par  . Évalué à 1.

      Ah oui pas mal, je vais essayer de suite.
      (Je débute totalement avec php, donc j'ai réutilisé du code que j'avais déjà vu fonctionner)
    • [^] # Re: mysql_fetch_assoc

      Posté par  . Évalué à 1.

      Bon, c'est raté, ça ne donne rien de mieux avec mysql_fetch_assoc mais $row (enfin son équivalent chez moi) correspond exactement à ce qui est attendu, il m'affiche bien les lignes des tables avec les valeurs venant des jointures
      Il continue de me dire index non défini, je ne comprend pas
      • [^] # Re: mysql_fetch_assoc

        Posté par  . Évalué à 2.

        Je ne comprends pas trop. Index non défini, c'est le message d'erreur quand tu essaye d'accéder à une clef qui n'existe pas dans un dictionnaire.

        Tu peux copier/coller le résultat d'un print_r($resultat); mis avant l'assignation de la variable $quantite.

        Sinon une autre piste pour résoudre le problème, tu peux essayer d'utiliser AS dans ton SELECT...

        Par exemple:
        SELECT M.nom_modele AS nom_modele, [...]
        • [^] # Re: mysql_fetch_assoc

          Posté par  . Évalué à 2.

          Voilà une des lignes affichées par le print_r():
          Array ( [nom_modele] => 930 G [COUNT(S.id_modele)] => 1 [nom_etat] => R�serv� )
          • [^] # Re: mysql_fetch_assoc

            Posté par  . Évalué à 2.

            Comme tu peux le voir dans le résultat du print_r, les clés que tu peux utiliser sont:
            * nom_modele
            * COUNT(S.id_modele)
            * nom_etat

            En fait, dans les résultats des requêtes de base de données, il n'y a pas les alias des tables que tu aurais pu définir. C'est pourquoi tu ne peux accéder à M.nom_modele, mais à non_modele.

            La solution proposée par mathgl est aussi valide, mais tu dois utiliser le nom de l'alias pour accéder à la donnée. Par exemple, si tu mets:

            SELECT M.nom_modele as modele, COUNT(S.id_modele) as count, E.nom_etat as etat


            tu pourras accéder aux données via les clés modele, count et etat.
            • [^] # Re: mysql_fetch_assoc

              Posté par  . Évalué à 2.

              Merci, c'était effectivement la bonne piste, je n'ai plus l'avertissement. Je n'avais pas bien compris la solution de mathgl, désolé \o/
              Bon, en revanche, je n'ai plus l'erreur, mais je n'ai toujours pas de résultat affiché :(

              J'ai fait afficher les valeurs avec l'aide des clés modele, count et etat, elles sont bonnes, mais le tableau reste vide malgré la boucle et l'assignation des valeurs à un array du template

              [le code est le même en remplaçant mes clés par celles définies par les AS]

              étrange ..
        • [^] # Re: mysql_fetch_assoc

          Posté par  . Évalué à 2.

          et apparemment les AS ne donnent absolument rien de mieux, j'ai les mêmes erreurs avec celles du COUNT() en plus \o/
  • # Pourquoi refaire la roue

    Posté par  (site web personnel) . Évalué à 2.

    Bonsoir,

    il existe plusieurs logiciels pour gérer des stock, je t'en propose 2:
    - Dolibarr
    - Thélia

    Bonne journée
    Grégoire

    Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

    • [^] # Re: Pourquoi refaire la roue

      Posté par  . Évalué à 2.

      Ah, je m'y attendais à celle là j'aurai mieux fait de ne pas retirer ma phrase dans le post d'origine :D

      Ils ne me conviennent pas car trop lourds et trop chargés (niveau interface) par rapport à mon besoin (c'est un peu le 30 Tonnes pour transporter un matelas gonflable) et je ne pense pas vu leurs interfaces qu'ils soient accessibles proprement depuis un blackberry (y'a ptet des css alternatives cela dit, mais ça reste trop lourd)
      Je gère des stocks dans un coffre de voiture, pas un hangar :)

      Mais merci ;)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.