Exécuter un fichier sql via PHP PDO

Avatar de l’utilisateur
Petit nouveau ! | 2 Messages

15 févr. 2016, 21:05

Bonjour a tous, voila j'ai une faveur a demander en ce qui concerne cette fonction. Etant nouveau en PDO je souhaiterais une réécriture du code solution avec plus de commentaires a chaque lignes pourquoi pas pour le rendre plus compréhensible pour mon niveau. Merci
NB: j'ai recuperé ce code sur un forum et c'etait cette fonction la solution.
//Pré-requis 0: tout viens d'un formulaire, à toi d'adapter
if (!empty($_POST)) {
    //Pré-requis 1: une connexion à la BDD, j'utilise PDO ;-)
    //Pré-requis 2: Connaître la base qu'on attaque
    $bdd = new PDO('mysql:dbname='.$_POST['nombase'].';host=127.0.0.1', $_POST['userbase'], $_POST['passwordbase']);
    $bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $bdd->query("SET NAMES 'utf8', lc_time_names = 'fr_FR'");
  
    //Pré-requis 3: le fichier SQL est dans le répertoire SQL/
    $req = "";
    $finRequete = false;
    $tables = file("sql/fichier.sql"); //Là ton fichier
    foreach ($tables AS $ligne) {
        if ($ligne[0] != "-" && $ligne[0] != "") {
            $req .= $ligne;
            //Permet de repérer quand il faut envoyer l'ordre SQL...
            $test = explode(";", $ligne);
            if (sizeof($test) > 1) {
                $finRequete = true;
            }
        }
        if ($finRequete) {
            $stmt = $bdd -> prepare($req);
            if (!$stmt -> execute()) {
                throw new PDOException("Impossible d'ins&eacute;rer la ligne:<br>".$req."<hr>", 100);
            }
            $req = "";
            $finRequete = false;
        }
    }
  
}

Petit nouveau ! | 3 Messages

26 févr. 2016, 12:25

//SI $_POST n'est pas vide faire ce qui suit
if (!empty($_POST)) {
//Initiailisation de l'objet PDO pour se connecter à la database
    $bdd = new PDO('mysql:dbname='.$_POST['nombase'].';host=127.0.0.1', $_POST['userbase'], $_POST['passwordbase']);
    $bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $bdd->query("SET NAMES 'utf8', lc_time_names = 'fr_FR'");
  
    //initialisation de la variable req
    $req = "";
   //on met la variable finRinquete a false
    $finRequete = false;
    //on met le fichier dans une variable
    $tables = file("sql/fichier.sql"); //Là ton fichier
    //pour chaque ligne du ficher ...
    foreach ($tables AS $ligne) {
         //si ligne[0] n'est pas égal à - et si ligne[0] n'est pas égale a rien
        if ($ligne[0] != "-" && $ligne[0] != "") {
            //on concate $ligne dans $req
            $req .= $ligne;
            // on divise $ligne en plusieurs sous-chaines de caracteres divisé par ;
            $test = explode(";", $ligne);
             //Si la taille de $test est suppérieure à 1 (donc s'il y a quelque chose dedans) faire
            if (sizeof($test) > 1) {
                 //mettre finRequete à vrai
                $finRequete = true;
            }
        }
        //Si finRequete est vrai
        if ($finRequete) {
             // on prépare la requete sql dans stmt
            $stmt = $bdd -> prepare($req);
            //si l'exécution se passe bien
            if (!$stmt -> execute()) {
                //lancer l'exception suivante
throw new PDOException("Impossible d'ins&eacute;rer la ligne:<br>".$req."<hr>", 100);
            }
             //on vide req
            $req = "";
             //on remet finRequete à faux
            $finRequete = false;
        }
    }
  
}

Avatar de l’utilisateur
Petit nouveau ! | 2 Messages

27 févr. 2016, 12:57

Merci beaucoup !

Avatar de l’utilisateur
Eléphanteau du PHP | 20 Messages

14 janv. 2017, 13:17

Bonjour,

Soumettre le login et le mot de passe d'une base de données via un formulaire, même si cela devrait OBLIGATOIREMENT se faire via une connection HTTPS, reste une très mauvaise pratique qui est à bannir. Il vous faut passer par un fichier de configuration interne à votre application pour déclarer le login et le mot de passe de votre base de données.
Ensuite pour ce qui est des bonnes pratiques soit
1) vous utilisez un fichier php qui représente une classe modèle qui contient votre requête
2) si vous souhaitez passer par un fichier traitez le directement dans la base de données. Mais dans votre cas vu qu'il s'agit d'un fichier requête et non d'un fichier données, évitez cette pratique car cela ouvre de nombreux problèmes de sécurité pour votre application, car dans ce contexte vous ne saurez jamais dans l'absolu ce que vous requêtez réellement dans votre base de données.

++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?