8722 sujets

Développement web côté serveur, CMS

Bonjour,

Aprés avoir cherché dans la doc je ne trouve pas la solution pour remplacer le nom d'une table dans une requête préparée par la valeur d'une variable, pour éviter la possibilité d'une
injection SQL, car le nom de la table peux changer en fonction d'une valeur envoyé par le client.

Exemple :


$sth = $dbh->prepare('SELECT nom FROM '.$_GET['table'].' WHERE id = :id');

$sth ->execute(array('id' => 1));


Cordialement
Modifié par o-o (17 Aug 2014 - 19:53)
Je ne pense pas qu'on puisse indiquer de nom de champs ou de tables dynamiquement dans des requêtes préparées.

Cette limitation paraît aller plus ou moins de soi car le SGBD calcule normalement le plan d'exécution de la requête lors de sa préparation, et pour calculer ce plan, il doit connaître toutes les tables et les champs impliqués.

D'un autre côté, je ne vois pas vraiment dans quel cas concret tu pourrais avoir besoin de ça...
1 - Si tu as plusieurs tables avec exactement la même structure, pourquoi les avoir séparées ? Si tu as besoin d'une séparation physique de plusieurs ensembles de données, les bons SGBD proposent des moyens plus efficaces pour faire du partitionnement.
2 - Si c'est dans le cadre d'une spécialisation et que tu as une classe et une sous-classe avec plus d'attributs, le découpage est mal conçu; les attributs supplémentaires de la sous-classe seulement vont dans la deuxième table, et elles sont liées par une clé étrangère.
3 - Si tu codes un gestionnaire à la phpmyadmin et que les requêtes sont hautement génériques au point qu'il n'y a que peu de chances que la même requête soit exécutée plusieurs fois, alors les requêtes préparées ne servent pas à grand chose à mon avis.

Si tu expliquais pourquoi tu as besoin de faire ça, peut-être que les réponses pourraient être plus précises et/ou t'aider mieux.
Ah non mais ça c'est pas pareil, c'est une fonctionnalité propre à PDO, pas du SGBD.

PDO a la capacité d'émuler les requêtes préparées si le SGBD ne les supporte pas, mais normalement il est censé utiliser les mécanismes du SGBD en priorité s'ils sont supportés.

Je crois que je n'ai pas dû bien comprendre ta question et que je suis du coup complètement à l'ouest; préciser un peu mieux ne fera sûrement pas de mal...
Apparemment c'est pas possible, donc la solution qui me reste c'est de de noter la table dans l'id,
comme par exemple "table_15" , mais peut-on dire dire à MySQL de rajouter "table_" devant les id qu'il ajoute automatiquement ?

Sinon faudra que j'ajoute les id à la main

Cordialement