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 :

requête SQL sur une table en fonction d'un formulaire [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut requête SQL sur une table en fonction d'un formulaire
    Bonjour,

    Alors j'ai fait en php une requête permettant de récupérer des informations dans la base.
    Cette requête fonctionne parfaitement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $req='select * from other_map.embacles';
    $reqs = $bdd->prepare($req);
    $reqs ->execute();
    $re = $reqs->fetchAll();
     
    foreach($re as $res){
        echo $res['emb_id'];
    }
    Le problème c'est quelle est très limitée et ce n'est pas ce que je veux faire.
    Je souhaiterai pouvoir, à la place de "embâcles" récupérer la valeur d'une liste déroulante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $name = ($_POST['list_other_map']); //list_other_map est le nom du select du form
    $req='select * from other_map.$name';
    $reqs = $bdd->prepare($req);
    $reqs ->execute();
    $re = $reqs->fetchAll();
    }
    Deja ici ça me met cette erreur...

    "Undefined index: list_other_map in C:\Users\postgres\Documents\smiddest\result.php on line 5"

    Ensuite du coup, vue que j'ai plusieurs choix avec la liste déroulante, je ne sais pas comment remplir les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($re as $res){
        echo $res['????????']; // on met quoi à la place des '???' ?
    }
    Je suis débutant en php etc et mon stage se termine bientôt...

    Merci infiniment pour votre aide.

    Ps : Le formulaire (qui n'est pas dans le même fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     <form method='post' class='formulaire'>
                                <div class='return'></div>
                                <?php
                                    echo "<select id='list_other' class='browser-default' name='list_other_map'>";
                                    echo "<OPTION value='' disabled selected>Couches</OPTION>";
                                        foreach($arrListe as $L) {
                                            $table_name = $L['tablename'];
                                            $schema_name = $L['description'];
                                            echo "<OPTION VALUE='$table_name'> $schema_name </OPTION>\n";
                                        }
                                    echo "</select>";
                                    echo "<input class='submit' type='submit' name='recherche' value='Rechercher'/>";
                                ?>
                            </form>

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par benjioleron Voir le message
    ...
    Cette requête fonctionne parfaitement
    ...
    ...ce n'est pas ce que je veux faire...
    Pour sûr !!

    1/ "embacles", c'est quoi ? une table ?
    $L['tablename'] : c'est aussi le nom d'une table ?

    Tout ça n'est pas clair.
    Merci d'expliquer CLAIREMENT ce que tu veux faire, en précisant suffisamment pour qu'on comprenne, sans avoi recours à une boule de cristal.

    2/ concernant le message d'erreur
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( !empty($_POST['list_other_map']) )
    {
      $name = ($_POST['list_other_map']);
    } else {
      $name = '';
    }
    Qui peut aussi s'écrire en 1 ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
      $name = ( !empty($_POST['list_other_map']) )? $_POST['list_other_map'] : '';


    3/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req='select * from other_map.$name';
    Non. Il ne faut pas confondre ' et "
    Avec '$name', la variable n'est PAS interprété. c'est juste la chaine de caractères $name.
    Pour interpréter la variable, il faut des " :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = "SELECT * FROM other_map.$name";
    Ou encore (à noter: la coloration syntaxique) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = 'select * from other_map.' . $name;
    Dernière modification par Invité ; 31/08/2016 à 14h56.

  3. #3
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    La solution facile : faire une requête différente pour chaque cas :
    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
    switch ($_POST['list_other_map']) {
        case "1" : 
    		$sql = "select emb_id as id from embacles";
    	break;
    	case "2" : 
    		$sql = "select truc_id as id from table_des_trucs";
    	break;
    } 
    $reqs = $bdd->prepare($sql);
    $reqs ->execute();
    $re = $reqs->fetchAll();
     
    foreach($re as $res){
        echo $res['id'];
    }
    Ce qui a l'immense avantage de te protéger des injections sur le nom des tables, de permettre de gérer le cas où la valeur qui est envoyée par le formulaire n'est pas une valeur autorisée (Ne jamais faire confiance à ce que l'utilisateur envoie...) et de savoir quelle colonne utiliser pour quelle table.
    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]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Un grand merci à vous deux !
    Pour ce qui est de récupérer le résultat de la liste déroulante en effet il y avait ce soucis de guillemets mais aussi un soucis dans ajax.
    Concernant le SQL en effet la solution est plutôt pas mal. Le problème c'est que mes tables n'ont pas le même nombre de champs. N'est pas pas possible de rendre tout ça dynamique et que si on rentre une table dans postgres elle s'affiche directement sans avoir de code à taper ?
    J'en demande beaucoup mais j'ai vraiment envie d'apprendre, ça va au delà de mon stage du coup

  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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Pour lister les colonnes d'une table, tu peux exécuter la requête SHOW COLUMNS FROM nom_de_la_table (attention, cette requête fonctionne pour MySQL, pour les autres SGDB, je ne suis pas sûre)
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    En effet sous postgres c'est plutôt : SELECT column_name FROM information_schema.columns WHERE table_name = 'embacles';

    Mais je ne suis pas certain que ça m'aide :/

  7. #7
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu peux récupérer les noms des colonnes en utilisant cette requête et ensuite t'en servir pour afficher les données.
    Ou alors, tu boucles sur les données de la ligne pour construire un tableau, comme dans ce tuto : Affichage de données dans un tableau HTML : Affichage "en ligne" avec Base de Données
    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]

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Tu peux récupérer les résultats de chaque ligne dans un tableau associatif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $re = $reqs->fetchAll(PDO::FETCH_ASSOC); // PDO::FETCH_ASSOC: retourne un tableau indexé par le nom de la colonne comme retourné dans le jeu de résultats 
     foreach($re as $res){
       foreach($res as $nomColonne=>$valeur){
           echo $nomColonne." : ". $valeur . "; ";
       }
       echo "<br />";
    }
    A+.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Merci ! Le tableau associatif fonctionne très bien !
    Encore un autre soucis... Je ne veux pas afficher la première colonne et la dernière colonne (qui est respectivement l'id et la géométrie, mais le nom change en fonction des tables). Peut on dire de faire cela en SQL du coup ?

  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     $i=1;
    $nbColonne = count($res);
    foreach($res as $nomColonne=>$valeur){
           if($i>1 && $i<$nbColonne){
              echo $nomColonne." : ". $valeur . "; ";
          }
         $i++;
       }

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Super tout fonctionne, problème résolu !

    Voici 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
    <?php
     
    require_once("connect.php");
     
    ?>
    <?php
        $names = $_GET['list_other'];
     
        $req = "select * from other_map.$names";
        $reqs = $bdd->prepare($req);
        $reqs->execute();
        $re = $reqs->fetchAll(PDO::FETCH_ASSOC);
     
    ?>
        <?php
        foreach ($re as $res) {
            $i=1;
            $nbColonne= count($res);
            foreach ($res as $nomColonne=>$valeur) {
                if ($i > 1 && $i < $nbColonne) {
     
                    echo $valeur;
     
                }
                $i++;
            }
            ?>
            <button class="bouton">Centrer</button>
                        <button class="bouton">Ajouter</button>
                        <button class="bouton">Modifier</button>
                        <button class="bouton">Supprimer</button>
                <br />
        <?php
        }
        ?>

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Si t'as pas besoin des noms de colonne, PDO::FETCH_NUM fera l'affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $re = $reqs->fetchAll(PDO::FETCH_NUM);
    ...
     foreach ($res as $valeur) {
                if ($i > 1 && $i < $nbColonne) {
     
                    echo $valeur;
     
                }
                $i++;
            }

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    En effet, ça fonctionne très bien ! Merci

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Du coup vue que $valeur contient toutes les infos il n'est pas possible d'agir sur la mise en page, par exemple sur la distance entre la date et "test" : 2015-09-21 test ?

  15. #15
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Tu peux le mettre dans un tableau HTML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    echo "<table>";
    $re = $reqs->fetchAll(PDO::FETCH_NUM); 
    echo "<tr>";
     foreach($re as $res){
       foreach($res as $valeur){
           echo "<td>". $valeur . "</td> ";
       }
    echo "</tr>";
    }
    echo "</table>";
    Ce n'est qu'un exemple.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Super ! Merci de prendre du temps pour me réponse J'avais fait un tableau mais je ne l'avais pas placé au bon endroit...

    Encore une petite question et après je pense que c'est finit.

    Du coup $valeur peut prendre comme valeur la date et une remarque. La date, venant de postgres est dans un autre format que celui souhaité (2015-12-05).
    J'ai essayé un : $valeur = date('d/m/Y', strtotime($valeur));
    Ça marque quand $valeur contient la date, mais quand $valeur contient la remarque ça me met la remarque en date. C'est logique et je comprend que ça fasse cela, mais je en sais pas comme contourner le problème. J'ai cherché du coté des "if($valeur = date){$valeur = date('d/m/Y', strtotime($valeur));} Mais forcément je ne dois pas être sur le bon chemin...

    Merci encore

  17. #17
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Regarde ici pour voir le type de colonne retourné: http://php.net/manual/fr/pdostatement.getcolumnmeta.php

    A+.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Merci !
    J'ai réussi à afficher les type, le soucis c'est qu'ils ne correspondent pas à $valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    if ($i > 1 && $i < $nbColonne) {
                            $col = $reqs->getColumnMeta($i);
     
                            echo $col['native_type'] . ';';
                            echo "<td>" . $valeur . "</td> ";
                    }
    Dans ma table j'ai :
    id - date - varchar - geometry

    $col me renvoi : varchar et geometry
    $valeur me renvoi : date et varchar

    Étrange non ?

  19. #19
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Peut-être que c'est ton affichage qui est mal formaté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $col = $reqs->getColumnMeta($i);
    echo "<td>" . $valeur . " : ".$col['native_type'] ."</td> ";

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    C'est le même résultat.
    Voilà le code au cas où il y ait une erreur autre part mais je vois pas.
    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
    39
    40
    41
    42
    43
    44
    <?php
     
        $table_name = $_GET['list_other'];
     
        $sql = "select * from other_map.$table_name";
        $sqls = $bdd->prepare($sql);
        $sqls->execute();
        $results = $sqls->fetchAll(PDO::FETCH_NUM);
     
    ?>
     
    <input id="btn_voir" type="button" value="Voir" onclick="chargerCouchesC();"/><br/>
     
    <?php
     
        foreach ($results as $result) {
            $i=1;
            $nb_column= count($result);
     
            echo "<table>";
            echo "<tr>";
     
            foreach ($result as $value) {
                if ($i > 1 && $i < $nb_column) {
                    $col = $sqls->getColumnMeta($i);
                    echo "<td>" . $value . " : ".$col['native_type'] ."</td> ";
                }
                $i++;
            }
     
            echo "</tr>";
            echo "</table>";
     
            ?>
     
            <input type="button" value="Centrer"/>
            <input type="button" value="Ajouter"/>
            <input type="button" value="Modifier"/>
            <input type="button" value="Supprimer"/>
            <br />
     
        <?php
        }
    ?>

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 22/01/2014, 19h30
  2. [WD16] Faire une requête SQL sur une table ?
    Par EriCstoFF dans le forum WinDev
    Réponses: 9
    Dernier message: 01/09/2011, 10h16
  3. Réponses: 4
    Dernier message: 27/12/2006, 21h53
  4. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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