Créer une table avec une requête préparée

Fermé
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 - 9 févr. 2014 à 01:30
 Utilisateur anonyme - 9 févr. 2014 à 11:21
Bonjour,

Je voudrais créer une table avec une requête préparée, quand j'ai fait mon essai, aucune erreur s'est affichée mais la table n'a pas été créée.

Voici mon code qui ne marche pas :

$req = $bdd->prepare('
    CREATE TABLE :nom (
        id INT(11) NOT NULL AUTO_INCREMENT,
        name VARCHAR(255) NOT NULL,
        PRIMARY KEY (id)
     )
     ENGINE=INNODB;
');

$req->execute(array('nom'=>$nom));


Tandis que sans requête préparée, tout marche bien :

$bdd->query('
    CREATE TABLE nom (
        id INT(11) NOT NULL AUTO_INCREMENT,
        name VARCHAR(255) NOT NULL,
        PRIMARY KEY (id)
    )
    ENGINE=INNODB
')


Je voudrais savoir les modifications à faire pour que je puisse créer des tables avec des requêtes préparées.

Merci de votre aide.
A voir également:

2 réponses

Bonjour

Pas possible. Pour les requêtes préparées, un marqueur (:nom) peut être utilisé seulement à la place de valeurs, pas de mots clés SQL ni d'identificateurs. Or les noms de bases et de tables sont des identificateurs.
Extrait de la doc mysql :
"Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth."

Par contre, tu peux très bien obtenir le même résultat par concaténation, ou avec des double quotes, après avoir vérifié très soigneusement que $nom était un nom acceptable, et de préférence en l'entourant d'accents graves :

$bdd->exec("CREATE TABLE '$nom' (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
)
ENGINE=INNODB;");
0
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 262
9 févr. 2014 à 10:49
Très bien merci. Y'a-t-il une fonction qui permet d'éviter les injections MySQL du genre htmlsecialchar pour le HTML ?
0
Utilisateur anonyme
9 févr. 2014 à 11:21
Non. Il y a bien la fonction PDO::quote(), mais elle aussi ne sert que pour les données.
C'est déjà bizarre de laisser l'utilisateur rentrer un nom de table à créer (tu refais phpMySQL ?), es-tu sûr d'en avoir vraiment besoin ?
Si tu es sûr, ne peux-tu pas forcer ton utilisateur à se limiter à des choses "raisonnables" ? C'est facile en php de vérifier qu'il n'y a pas de trucs trop exotiques dans une chaîne.
Pour référence, ce qui est autorisé : https://dev.mysql.com/doc/refman/5.0/fr/legal-names.html
Note que comme tu as droit à "ce qui est autorisé dans un nom de dossier / fichier", ça dépend du système d'exploitation de ton serveur. Il vaut mieux être beaucoup plus restrictif pour passer partout.
0