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

PHP & Base de données Discussion :

Affichage variables PHP en retour d’UNE requête mySQLi procédurale [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 29
    Par défaut Affichage variables PHP en retour d’UNE requête mySQLi procédurale
    Bonjour,
    J’ai besoin de votre aide svp ;
    Je souhaite retourner dans des variables PHP (version 5.6.31 => MyslI) (les variables sont non définies, on ne connait pas le nombre qu’il y aura) les données retournées par UNE requête MysqlI, de la sorte :
    J’ai dans la table t_voiture (exemple ; je simplifie et supprime les conditions):

    ` t_voiture ` (`id_plaque_immat`, `marque`, `modèle`) VALUES
    (850CP13, OPEL, CORSA)
    (722RT84, RENAULT, TWINGO)
    (650CP83, PEUGEOT, 307)

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $resultat = mysqli_query($bdd, 'SELECT COUNT(*) as cpte_nbre_occ FROM t_ voiture) or die (mysqli_error());
    while($t_production = mysqli_fetch_assoc($resultat)) {$bdd_cpte_nbre_occ_tot=$t_production['cpte_nbre_occ']; $bdd_ id_plaque_immat =$t_ voiture [' id_plaque_immat '] ;}
     
    <?php echo $bdd_cpte_nbre_occ_tot; ?> //retournera 3 conformément
    Réellement, je souhaite récupérer id_plaque_immat pour chacune des voitures (3 dans ce cas mais inconnu à l’avance) dans une variable différentes ou tour à tour.
    Je ne veux pas répéter la requête mais faire une boucle sur son résultat.

    En l’état si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $bdd_id_plaque_immat; ?> //retournera la dernière immat et si je tri par ordre desc la première, car lu en dernière….
    J’imagine que ça ne doit pas être bien compliqué… mais qu’est que ça me bloque…

    Je vous remercie par avance,

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Plusieurs problème dans ton code :

    1- Indente le correctement; Vouloir tout mettre sur une ligne ne fait que t'embrouiller. La preuve , ton echo n'est pas dans la boucle , il affiche donc forcément la dernière valeur de la boucle.
    2- Quant tu fais : $bdd_ id_plaque_immat =$t_ voiture [' id_plaque_immat '] tu essais de récupérer un champs (id_plaque_immat ) que tu ne demande pas dans ta requête puisque tu fais un simple count(). De plus tu essais de trouver le champs dans $t_ voiture qui n'existe nul part.

    Quelque chose comme ca devrait déjà être plus proche de ce que tu cherches à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $resultat = mysqli_query($bdd, 'SELECT id_plaque_immat FROM t_ voiture') or die (mysqli_error());
    while($t_production = mysqli_fetch_assoc($resultat)) {
        echo $t_production[' id_plaque_immat '];
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 29
    Par défaut
    Merci Grunk pour ta réponse et ta réactivité,
    Malheureusement celle-là ne correspond pas à mes attentes.
    En effet, j’ai voulu illustrer ma demande par un rapide exemple, mais certainement à tort… je me suis mal exprimé.

    Je te suis bien pour tes remarques ;
    - ok pour le echo pas dans la boucle (mais c’était un peu volontaire, pour afficher les différentes variables inconnues à la suite en sortie, ce qui n’est pas possible avec un simple echo => array sur le résultat de la requête ???)
    - En effet il faut au préalable dans le code partagé récupérer (id_plaque_immat ) une requête.


    Pour mieux exposer mon problème, je vais partir de l’autre bout, et de mon code réel et de ma solution de contournement ;
    Pour contextualiser, Il s’agit d’une boucle récupérant les titres & id d’un menu => niveau1
    (Elle-même est dans une boucle récupérant les menus => niveau 0 non représenté dans le code)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
     
    //Boucle qui passe par toute la table mais qui marche :(
    // DEBUT BOUCLE DES PROD (NIVEAU 1)
    ///////////////
    $resultat = mysqli_query($bdd, 'SELECT COUNT(*) as cpte_nbre_occ FROM t_production') or die (mysqli_error());
    while($t_production = mysqli_fetch_assoc($resultat)) {$bdd_cpte_nbre_occ_tot=$t_production['cpte_nbre_occ'];}
    ///////////////
    $id_production=1;
    $resultat = mysqli_query($bdd, 'SELECT titre, aff_titre_menu, id_artiste, id_menu_parent, statut, niveau FROM t_production WHERE id_production='.$id_production.'') or die (mysqli_error()); 
    while($t_production = mysqli_fetch_assoc($resultat)) 
    {$bdd_titre_prod=$t_production['titre'];$bdd_aff_titre_menu=$t_production['aff_titre_menu'];$bdd_id_artiste=$t_production['id_artiste'];
    $bdd_id_menu_parent=$t_production['id_menu_parent'];$bdd_statut=$t_production['statut'];$bdd_niveau=$t_production['niveau'];}
     
    for ($id_production = 1; $id_production <= $bdd_cpte_nbre_occ_tot; )
    {
    if ($bdd_id_artiste==$id_artiste and $bdd_id_menu_parent==$id_menu and $bdd_statut==1 and $bdd_niveau==1 and $bdd_aff_titre_menu==1)
        {
            echo '<dd><ul><li>';
            if ((!isset($_GET ['niv1'])) or ($_GET ['niv1']!=$id_production)) ///get_menu
                { 
                echo '<a href=production.php?menu='.$id_menu.'&niv1='.$id_production.' style="color:'.$couleur_police.'" class=vert>'.$bdd_titre_prod.'</a>';
                }
                else 
                {
                echo '<a href=production.php?menu='.$id_menu.'&niv1='.$id_production.'  style="color:'.$couleur_1.'" class=vert>'.$bdd_titre_prod.'</a>';
                }
            echo '</li></ul></dd>';
        }
    // FIN BOUCLE DES PROD (NIVEAU 1)
    $id_production++;
    $resultat = mysqli_query($bdd, 'SELECT titre, aff_titre_menu, id_artiste, id_menu_parent, statut, niveau FROM t_production WHERE id_production='.$id_production.'') or die (mysqli_error()); 
    while($t_production = mysqli_fetch_assoc($resultat)) 
    {$bdd_titre_prod=$t_production['titre'];$bdd_aff_titre_menu=$t_production['aff_titre_menu'];$bdd_id_artiste=$t_production['id_artiste'];
    $bdd_id_menu_parent=$t_production['id_menu_parent'];$bdd_statut=$t_production['statut'];$bdd_niveau=$t_production['niveau'];}
    //if ($bdd_titre_prod=="") {break;}
    }

    Cette boucle fonctionne, et est une solution de contournement pour l’avancement du dév (projet), mais elle deviendra vite bien trop couteuse en production puisque la table devrait très vite grandir.
    En l’état la boucle commence par compter les occurrences (lignes) de la table
    Puis elle test (toutes les lignes de la tables) si chacune, jusqu’à la dernière correspond aux conditions php, elle affiche que si ces dernières sont respectées. Cela est bien trop couteux…
    Surtout, que cette requête est répétée pour chacun des menus (boucle des menus non représenté dans le code).
    Cette solution permet de répondre au point de blocage d’une boucle basé sur une incrémentation.


    Je souhaiterais faire une boucle sur les différentes variables en retour de ma requête qui contiendrait directement les conditions de telle manière ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //On arrive de la précédente boucle avec $id_menu (& $id_artiste en début de page)
    					$resultat = mysqli_query($bdd, 'SELECT id_production, titre FROM t_production WHERE id_artiste = '.$id_artiste.' and id_menu_parent = '.$id_menu.' and statut=1 and niveau=1 and aff_titre_menu =1 order by id_production DESC ') or die (mysqli_error());
    while($t_production = mysqli_fetch_assoc($resultat)) 
    	{$bdd_id_production=$t_production['id_production'];$bdd_titre=$t_production['titre'];}
    Lorsque j’exécute cette requête sur mon client sql pour un artiste (1) et pour un menu (1) donnée j’ai bien 3 lignes avec id_production :1 ;2 ;7

    Je souhaiterais pour l’exemple de ce menu via ma boucle afficher les liens directement de telle manière :
    Lien1 $id_menu .$bdd_id_production (1) =>$bdd_titre(‘Expo MILAN 2017’)
    Lien2 $id_menu .$bdd_id_production (2) =>$bdd_titre(‘Expo MARSEILLE 2016’)
    Lien3 $id_menu .$bdd_id_production (7) =>$bdd_titre(‘Expo TOULOUSE 2015’)

    Soit
    Boucle (res_requête_1 / res_requête_2 / res_requête_3): //=> Nombre de résultat en retour inconnu…
    {
    LienX $id_menu.$bdd_id_production (X) =>$bdd_titre(‘XXXX’)
    //Passer à la variable suivante (remplacement de l’incrémentation d’une variable)
    }

    Soit : Solution recherchée : une seule requête par menu
    Vs
    Solution de contournement : autant de requête que ne compte de ligne la table par menu

    En espérant avoir été clair,
    A votre dispo pour plus précisions,
    Je reste impatiemment dans l’attente de votre retour,
    Je vous remercie par avance pour votre aide !

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    J'ai un peu de mal à comprendre l'ensemble mais ce qui me saute au yeux de prime abord :

    1- La requête du count ne sert pour moi à rien
    2- La boucle for ne sert à rien puisque tu boucle déjà sur tous les résultats dans le while de la requête précédente. Tu peux donc tout faire dans le while.

    Dans tous les cas un ensemble de requête imbriqué dans des while c'est la pire des idées en terme de performance.

    Tu semble gérer un menu et chaque élément peut potentiellement avoir un un parent. Y'a t'il une limite de profondeur ? Si non tu n'as pas la bonne structure de données. Ta solution n'es tvaalble que si tu te limite à un ou deux niveau de parent , après les performances sont trop mauvaise. Il faut alors passer sur une représentation intervallaire
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ouh la... C'est plutôt tordu comme façon de faire.
    Bon les problèmes évidents d'abord : tu utilises le count pour calculer les ids. Que se passe-t-il si il y a des trous ? du genre si en base, tu as comme id 1, 2, 4 ?
    Ensuite, pourquoi faire plusieurs requêtes pour récupérer les ids un par un, alors qu'il suffit de faire une requête et de boucler dessus ?
    Enfin, pourquoi faire la condition en php alors que tu peux filtrer directement dans la requête et avoir moins de données à remonter ?

    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
    $resultat = mysqli_query($bdd, 'SELECT titre, aff_titre_menu, id_artiste, id_menu_parent, statut, niveau FROM t_production WHERE 
    id_artiste = '.$id_artiste.' and id_menu_parent == '.$id_menu.' and statut == 1 and niveau == 1 and aff_titre_menu == 1 ORDER BY id_production') or die(mysqli_error());
     
    while ($t_production = mysqli_fetch_assoc($resultat)) {
        $bdd_titre_prod = $t_production['titre'];
        $bdd_id_production = $t_production['id_production'];
        echo '<dd><ul><li>';
        if ((!isset($_GET['niv1'])) or ($_GET['niv1'] != $id_production)) ///get_menu
        {
            echo '<a href=production.php?menu=' . $id_menu . '&niv1=' . $bdd_id_production . ' style="color:' . $couleur_police . '" class=vert>' . $bdd_titre_prod . '</a>';
        }
        else {
            echo '<a href=production.php?menu=' . $id_menu . '&niv1=' . $bdd_id_production . '  style="color:' . $couleur_1 . '" class=vert>' . $bdd_titre_prod . '</a>';
        }
     
        echo '</li></ul></dd>';
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 29
    Par défaut
    Oui je me suis clairement très égaré. Merci beaucoup pour vos réponses. Je me suis embêté pour rien alors que la 1er boucle while fessait déjà tout le travail... mais perte de repère avec mysqlI et 2 ans que je n'avais plus dév... merci++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PHP-HTML AFFICHAGE variable PHP champ INPUT avec disabled
    Par encore_php dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2008, 22h11
  2. Réponses: 7
    Dernier message: 06/04/2007, 20h52
  3. affichage variable avec retour chariot
    Par swissmade dans le forum Langage
    Réponses: 1
    Dernier message: 19/03/2007, 19h02
  4. Insérez variable PHP dans requête Mysql
    Par jeremie74 dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/08/2006, 18h21
  5. Requête maître-détail et affichage en PHP
    Par c2pk dans le forum Requêtes
    Réponses: 11
    Dernier message: 26/01/2006, 18h52

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