IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Création base de données


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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.

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE DATABASE 'test' DEFAULT CHARACTER SET utf8
    Mais avec des apostrophes malheureusement, MySQL aime pas...
    Par contre, avec des antiquote, cela marcherait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Merci pour ta réponse.

    Je peux faire ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ceci évitera déjà pas mal de risques je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_escpae_string($this->sNomBaseDeDonnees)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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).

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. [MCD]création base de données access
    Par hugue dans le forum Modélisation
    Réponses: 2
    Dernier message: 05/04/2007, 19h02
  2. Réponses: 2
    Dernier message: 08/06/2006, 20h49
  3. Création base de données Oracle sous Winwows
    Par madina dans le forum Oracle
    Réponses: 2
    Dernier message: 19/05/2006, 09h13
  4. création base de données avec easyphp
    Par Battosaiii dans le forum Débuter
    Réponses: 5
    Dernier message: 29/06/2004, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo