Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/10/2011, 17h27   #1
Membre confirmé
 
Inscription : septembre 2003
Messages : 334
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 334
Points : 292
Points : 292
Par défaut Création base de données

Bonjour,

j'ai écrit le code suivant pour créer une base de données :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                   try {
         $oPdo = new PDO('mysql:host=localhost', 'root', '', 
         array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
 
        $sRequete = "CREATE DATABASE :sBaseName DEFAULT CHARACTER SET utf8";
 
        $oPrepared = $oPdo->prepare($sRequete);
                               echo $oPrepared->queryString; // afficher requête
                               $oPrepared->execute(array("sBaseName" => "test"));
                  }
                  catch(Exception $e) {
                    throw new creationbasededonneesException($e->getMessage());
                  }
J'obtiens le message d'erreur :

Citation:
CREATE DATABASE ':sBaseName' DEFAULT CHARACTER SET utf8Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '':sBaseName' DEFAULT CHARACTER SET utf8' at line 1
A noter que si j'enlève la variable "sBaseName" de la requête préparée et que je mets directement un nom de base (par exemple : "toto"), la base est bien créée.

Voyez-vous d'où le problème peut venir ?

Merci.
karl3i est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 19h13   #2
Membre confirmé
 
Homme Clément
Développeur informatique
Inscription : décembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 213
Points : 277
Points : 277
Ouais, je pense que j'ai une idée d'où peut venir le problème...
A mon avis, quand il remplace ton paramètre, il ajoute des apostrophes autour du nom de la base de données, ce qui donne :
Code :
CREATE DATABASE 'test' DEFAULT CHARACTER SET utf8
Mais avec des apostrophes malheureusement, MySQL aime pas...
Par contre, avec des antiquote, cela marcherait :
Code :
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8
Attention quand même à ce que pourrait contenir la variable avec le nom de la base de données (caractères non autorisés).

Par contre, je sais pas quel est le meilleur moyen de faire ça avec PDO.
Climoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 20h25   #3
Membre confirmé
 
Inscription : septembre 2003
Messages : 334
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 334
Points : 292
Points : 292
Merci pour ta réponse.

Je peux faire ça aussi :

Code :
1
2
3
4
5
6
7
8
9
10
try {
         $oPdo = new PDO('mysql:host=localhost', 'root', '', 
         array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
 
        $sRequete = "CREATE DATABASE $this->sNomBaseDeDonnees DEFAULT CHARACTER SET utf8";
 
        $oPrepared = $oPdo->prepare($sRequete);
		//echo $oPrepared->queryString; // afficher requête
		$oPrepared->execute();
Mais ça me protège (probablement) pas des injections SQL contrairement une PreparedStatement avec variable.
karl3i est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 12h33   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Ceci évitera déjà pas mal de risques je pense :
Code :
mysql_real_escpae_string($this->sNomBaseDeDonnees)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 13h27   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
On ne peut mélanger PDO et autres fonctions (mysql_* comme mysqli_*).

Un nom SQL (comme une table, base de données, fonctions SQL, etc) ne peut faire l'objet d'un paramètre dans une requête préparée. Au final, il faut en faire la "validation" soi-même (ctype, regexp, liste blanche - array/in_array, etc).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 14h32   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Au fait, karl3i, pourquoi ton programme crée une base de données ?
C'est plutôt rare en principe comme besoin.
Généralement, le programme utilise une BDD existante mais n'a pas à en créer, surtout qu'il faut des droits élevés sur le serveur pour ça.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h50.


 
 
 
 
Partenaires

Hébergement Web