[RESOLU] Problème valeur liste déroulante et ajax

jaufry
Invité n'ayant pas de compte PHPfrance

31 août 2016, 11:17

Bonjour,
alors voilà, j'essai depuis 2 jours de récupérer une valeur d'une liste déroulante pour l'intégrer dans une requête. J'utilise Ajax pour ne pas à avoir à recharger la page.
Le principe : l'utilisateur choisi une couche, et dynamiquement les enregistrements de cette couche s'affichent en dessous. Mon ajax est bon, je pense. Mon problème c'est que je ne sais pas pourquoi mais le navigateur, dans le firebug ou dans chroom m'indique toujours sur ma requête :

Notice: Undefined index: list_other in C:\Users\postgres\Documents\smiddest\result.php on line 8
Warning: PDOStatement::execute(): SQLSTATE[42601]: Syntax error: 7 ERREUR: erreur de syntaxe à la fin de l'entrée LINE 1: select * from other_map. ^ in C:\Users\postgres\Documents\smiddest\result.php on line 11


Voici mes codes :
Ajax :

Code : Tout sélectionner

$(".button-collapse").sideNav(); $(document).ready(function(){ chargerCouches(); }); function chargerCouches(){ $.get("list.php",function(reponse){ $(".return").html(reponse); $("list_other").change(function(){ chargerTableau($(this).val()); }); }); } function chargerTableau(Na){ $.get("result.php?names="+Na,function(reponse){ $(".afficher").html(reponse); }); }
[/color]

Page result.php :

Code : Tout sélectionner

<?php require_once("connect.php"); ?> <?php include ('profil.php'); $names = $_GET['list_other']; $req = "select * from other_map.$names"; $reqs = $bdd->prepare($req); $reqs->execute(); $re = $reqs->fetchAll(); ?> <table border="1"> <tr> <th>Date</th> <th>Remarque</th> </tr> <?php foreach ($re as $res) { ?> <tr> <td><?php echo $res['date']; ?></td> <td><?php echo $res['remarq']; ?></td> </tr> <?php } ?>
Page list.php :

Code : Tout sélectionner

<?php include("connect.php"); $listes = $bdd->prepare("WITH mytables AS (SELECT tablename,schemaname FROM pg_tables WHERE schemaname = 'other_map') SELECT tablename, d.description FROM mytables JOIN pg_class c ON tablename = c.relname JOIN pg_description d ON d.objoid = c.oid WHERE d.objsubid = 0 ORDER BY tablename ASC"); $listes->execute(); $arrListe = $listes->fetchall(); ?> <select name="list_other" id='list_other' class='browser-default'> <OPTION value=''>Couches</OPTION> <?php foreach($arrListe as $L) { $table_name = $L['tablename']; $schema_name = $L['description']; ?> <OPTION VALUE="<?php echo $table_name ?>"> <?php echo $schema_name ?> </OPTION>\n; <?php } ?> </select>
Et la page profil.php (qui est accessible que par des membres (suite à une page de connexion qui fonctionne bien) :

Code : Tout sélectionner

<?php session_start(); include("connect.php"); if(isset($_GET['id']) AND $_GET['id'] > 0) { $getid = intval($_GET['id']); $requser = $bdd->prepare('SELECT * FROM base.membres WHERE mem_id = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); ?> <html> <head> <meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1.0"> <title>Smiddest</title> <link type="text/css" rel="stylesheet" href="css/jquery-ui.css"> <link rel="stylesheet" href="http://openlayers.org/en/v3.17.1/css/ol.css" type="text/css"> <link rel="stylesheet" href="css/ol3-layerswitcher.css"> <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link type="text/css" rel="stylesheet" href="css/materialize.css" media="screen,projection"> <link type="text/css" rel="stylesheet" href="css/main.css"> <link type="text/css" rel="stylesheet" href="css/ol3-popup.css"> </head> <body> <?php if(isset($_SESSION['mem_id']) AND $userinfo['mem_id'] == $_SESSION['mem_id']) { ?> <header> <?php include 'header.php' ?> </header> <main> <div class="row"> <div class="col s8 m8 l8"> <div id="map" class="map"></div> <div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div> </div> <div class="col s4 m4 4"> <div class="col s6 m6 l6"></div> <div class="col s6 m6 l6"> <?php $date = date("d/m/Y"); Print('<div class="heure">' . "$date" . '</div>'); ?> </div> <div class="other"> <div> <div class='return'></div> </div> <div> produits : <div class="afficher"> </div> </div> </div> </div> </div> </div> </main> <!-- Fin du isset --> <?php } ?> <script src="libs/ol-debug.js" type="text/javascript"></script> <script src="libs/ol3-layerswitcher.js" type="text/javascript"></script> <script type="text/javascript" src="libs/jquery-3.1.0.js"></script> <script type="text/javascript" src="libs/jquery-ui.js"></script> <script src="libs/materialize.js"></script> <script src="js/map.js"></script> <script src="js/functions.js"></script> </body> </html> <?php } ?>
Merci pour votre aide, parce que la je ne comprend pas...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2016, 12:07

salut,

php t'indiques qu'il y a une erreur, les messages sont assez explicites :
Notice: Undefined index: list_other in C:\Users\postgres\Documents\smiddest\result.php on line 8
=> cela veux dire qu'a la ligne 8 du fichier C:\Users\postgres\Documents\smiddest\result.php tu utilise un index (de tableau donc) qui n'existe pas
Warning: PDOStatement::execute(): SQLSTATE[42601]: Syntax error: 7 ERREUR: erreur de syntaxe à la fin de l'entrée LINE 1:
select * from other_map. ^ in C:\Users\postgres\Documents\smiddest\result.php on line 11
=> cela veux dire que PDO n'as pas pus exécuter la requête à la ligne 11 du fichier C:\Users\postgres\Documents\smiddest\result.php
et comme il est sympa il te donne la requête qui foire : select * from other_map. (le point est compris dans la requête

en clair dans ton code (en propre)
<?php
require_once("connect.php");
// require ou include fait un choix :)
include ('profil.php');
// boooommmmm list_other n'existe pas dans le tableau $_GET
$names = $_GET['list_other'];
// re bbbooommmm parce que $names est vide et que la table other_map. n'existe pas
$req = "select * from other_map.$names";
$reqs = $bdd->prepare($req);
$reqs->execute();
$re = $reqs->fetchAll();
?>
en gros tu appels le fichier result.php sans lui passer le paramètre d'url list_other ==> result.php?list_other=xxxx

Pour ce qui est de la conception je pense que c'est foireux. Faire du select de table dynamique implique un modèle dynamique quetu ne maîtrise pas et ça c'est source d'emmerde a coup sur.

Je pense qu'il serait beaucoup plus pérenne de partir sur un modèle de données clair et fixe pour éviter les ennuis.


au passage utiliser directement une info qui vient de l'utilisateur dans une requêtes sql c'est la base de l'injection SQL (cf google ;) )


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

31 août 2016, 12:19

Merci pour cette réponse très détaillée !

Concernant la table other_map, c'est n'est pas une table mais un schéma dans postgres. :)
D'où l'utilité du "select * from other_map.(le nom de la table). Par exemple si je ne me sert pas de la liste déroulante, la requête select * from other_map.embacles fonctionnent très bien.
Le passage au select dynamique est obligé en ce qui me concerne. Il faut que l'on puisse rajouter des tables dans postgres sans avoir à mettre à jour le code.

Du coup justement c'est bien la le problème, j'avais compris que PHP ne trouvé pas de valeur dans "list_other", mais je ne sais pas du tout comment lui dire qu'il faut qu'il fasse comme tu dis : result.php?list_other="nom de la table".
En effet quand je tape dans l'url : http:// 127.0.0.1:8888/edsa-tableau%20de%20bord/result.php?list_other=embacles cela fonctionne parfaitement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2016, 12:38

Concernant la table other_map, c'est n'est pas une table mais un schéma dans postgres. :)
je sais bien que c'est un schéma et ta requête m'indique que tu veux une table dans ce schéma :)
Le passage au select dynamique est obligé en ce qui me concerne. Il faut que l'on puisse rajouter des tables dans postgres sans avoir à mettre à jour le code.[/code]

c'est foireux d’emblée ;)
Après cela dépends des données mais je reste persuadé que bon modèle n'impose pas ce genre de pratique qui va forcément faire chier.
si les tables on les mêmes colonnes c'est donc que c'est la même table. Si y a besoin de séparer les données dans "catégories" il faut donc une colonne en plus pour une jointure sur une table qui va contenir les "catégories".
si les tables n'ont pas les mêmes colonnes tu va devoir créer des cas spécifique par tout avec des risques d'erreurs ou d'oublis et va engendrer de la complexité là où ce n'est pas nécessaire.
je ne parle pas du fait que tu ne maîtriseras pas le nombre des tables ni même leurs noms, pas plus de leurs structures. Comment être certain qu'une table existe ? etc...

Pour le reste il faut que ton appel ajax ajoute le paramètre d'url avec la valeur.
du coup je pense la solution est la (vu que la moitié du boulot est fait ;) )
function chargerTableau(Na){

// la c'est pas names mais list_other ou alors dans le code php tu changes en names
    $.get("result.php?names="+Na,function(reponse){
        $(".afficher").html(reponse);
    });
}

si tu le souhiate on peux discuter du modèle, mais sur un autre sujet pour pas perdre tout le monde :)
sur le sujet le modèle entité association de la méthode merise est le plus courant et le mieux (en fait sinon c'est UML et modèle objet dans les bien ;) )

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

31 août 2016, 13:02

A force de faire des tests j'avais oublié de corriger cette partie... En en fait c'est étrange mais j'avais beau changer le "names" en "list_other" et rien ne se passait, j'ai vue que chrom ou firefox ne se mettait pas à jour la page ajax. Du coup j'ai du redémarrer l'ordinateur.
En effet j'ai un gros soucis de modélisation comme tu as pu le voir, en fait j'ai changer mes tables dans postgres dans un soucis de facilité... Je te montre ce que j'ai fait dans un autre sujet !
Merci pour ton aide précieuse !!! :D

La suite : php-debutant/modelisation-modele-postgres-t276864.html

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2016, 14:38

pour chrome dans l'onglet developper, dans les options de celui ci tu peux décocher "disabled cache" (cela n'est effectif que lorsque l'outils de dev est ouvert ;)
Il en faut peu pour être heureux ......