banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 30 August 2016 12:03

JAUFRYBenjamin
Participant occasionnel
Date d'inscription: 25 Nov 2015
Messages: 11

Php et SQL (postgres)

Bonjour,
Je ne sais pas si c'est le bon endroit pour poster cette question, je verrai bien...

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:

$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:

$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:

foreach($re as $res){
    echo $res['????????'];
}

Je suis débutant en php etc et mon stage se termine bientôt... hmm

Merci infiniment pour votre aide.

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

Code:

                        <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>

Hors ligne

 

#2 Wed 31 August 2016 18:27

VianneyD
Participant assidu
Date d'inscription: 30 May 2011
Messages: 153

Re: Php et SQL (postgres)

Bonjour,

Comment se fait le lien entre le formulaire et le traitement php s'ils sont dans deux fichiers distincts ? Je ne vois pas de action='result.php' dans le formulaire html...

Vu le message d'erreur, on dirait que le php n'arrive pas à récupérer la valeur de ton form.

Autre chose : dans la requête, la variable doit être placée en dehors des quotes (à moins de les remplacer par des doubles quotes) :

Code:

$req='select * from other_map.'.$name;

Vraisemblablement tu utilises une connexion PDO. fetchAll() te retourne un tableau contenant toutes les lignes du résultat de ta requête. Dans le foreach, il te suffit de préciser le nom de la colonne dont tu souhaites afficher les valeurs.

Code:

echo $res['la_colonne_a_afficher'];

Vianney Dugrain

Hors ligne

 

#3 Thu 01 September 2016 09:05

JAUFRYBenjamin
Participant occasionnel
Date d'inscription: 25 Nov 2015
Messages: 11

Re: Php et SQL (postgres)

Merci encore !
Alors pour la récupération de la liste déroulante j'ai réussi, c'était un soucis avec ajax.
Pour le SQL c'est plus compliqué. En fait les tables qui sont proposées dans la listes déroulantes n'ont pas les même champs, ni le même nombre de champs, du coup il faut que j'adapte le sql en fonction du résultat de la liste déroulante et c'est bien la mon soucis  hmm

Hors ligne

 

#4 Thu 01 September 2016 13:23

JAUFRYBenjamin
Participant occasionnel
Date d'inscription: 25 Nov 2015
Messages: 11

Re: Php et SQL (postgres)

C'est bon c'est résolu !
Voici le code de la page result.php

Code:

<?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
    }
    ?>

Hors ligne

 

#5 Fri 02 September 2016 08:22

Laurent Jégou
Participant assidu
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 447
Site web

Re: Php et SQL (postgres)

Bonjour, juste une remarque en lisant votre code : il faudrait vous protéger des attaques en injection SQL en utilisant une requête paramétrée plutôt que d'inclure la variable transmise dans une chaîne de caractères.


Enseignant-Chercheur en Géomatique
UT2J - Dept Géo / CNRS UMR LISST-Cieu / Master Sigma - Revue Mappemonde

Hors ligne

 

#6 Fri 02 September 2016 13:57

JAUFRYBenjamin
Participant occasionnel
Date d'inscription: 25 Nov 2015
Messages: 11

Re: Php et SQL (postgres)

Bonjour, merci pour ce conseil.
J'ai tenté la requête paramétrée :

Code:

<?php

    $table_name = 'other_map.'.$_GET['list_other'];

    $sql = "select * from :table_name";
    $sqls = $bdd->prepare($sql);
    $sqls->bindParam(":table_name", $table_name, PDO::PARAM_STR, 100);
    $sqls->execute();
    $results = $sqls->fetchAll(PDO::FETCH_NUM);

?>

Et voici l'erreur...

Warning: PDOStatement::execute(): SQLSTATE[42601]: Syntax error: 7 ERREUR: erreur de syntaxe sur ou près de « $1 » LINE 1: select * from $1 ^ in C:\Users\postgres\Documents\smiddest\result.php on line 10

La ligne 10 c'est : $sqls->execute();

Dernière modification par JAUFRYBenjamin (Fri 02 September 2016 14:10)

Hors ligne

 

#7 Fri 02 September 2016 16:31

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Php et SQL (postgres)

Bonjour,

Hélas, les paramètres dynamiques ne marchent pas pour le nom des objets (colonnes, tables, schémas, etc.), mais seulement pour des valeurs (where col = param).

Ici, il vous faut échapper vous-même les paramètres web. Il y a des fonctions PHP pour cela, mais ca reste néanmoins un problème de sécurité.

Si vous devez fournir un contenu dynamique de tables, vous pouvez peut etre regarder du coté de PhpPgAdmin: il fait cela par défaut, et avec de la configuration, vous pouvez limiter les objets accessibles aux gens coté web.

Sinon, vous pouvez préparer coté server la liste des tables concernées (celles qui remplissent votre select), avec leur select *, et utiliser le paramètre web comme clé d'un dictionnaire contenant ces tables. Si la clé n'est pas trouvée, la table n'existe pas, rien n'est fait coté SQL.

Nicolas

Hors ligne

 

#8 Sun 04 September 2016 08:35

Laurent Jégou
Participant assidu
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 447
Site web

Re: Php et SQL (postgres)

C'est éventuellement possible en utilisant la possibilité de commande dynamique "EXECUTE" (en pl/pgsql) : https://www.postgresql.org/docs/current … CUTING-DYN


Enseignant-Chercheur en Géomatique
UT2J - Dept Géo / CNRS UMR LISST-Cieu / Master Sigma - Revue Mappemonde

Hors ligne

 

#9 Sun 04 September 2016 11:04

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Php et SQL (postgres)

Bonjour,

Cette fonctionnalité en pl/pgsql est équivalente au code php fabriquant la requête avec une chaine de caractère et l'exécutant.
Elle est sensible aussi à l'injection SQL et la bonne pratique consiste à appeler la fonction quote_ident() pour "nettoyer" les paramètres. (A faire en PHP avec les fonctions équivalentes).
Ca oblige également à écrire une fonction qui sera appelée par le code PHP.

Nicolas

Hors ligne

 

#10 Sun 04 September 2016 18:39

Laurent Jégou
Participant assidu
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 447
Site web

Re: Php et SQL (postgres)

En effet ! La solution pour éviter tout pb. pourrait alors être de valider le nom de la table strictement en relation à une liste de tables valides.


Enseignant-Chercheur en Géomatique
UT2J - Dept Géo / CNRS UMR LISST-Cieu / Master Sigma - Revue Mappemonde

Hors ligne

 

Pied de page des forums

Powered by FluxBB