Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

PHP et mySQL avec PDO

Article posté le 08-11-2012 dans la catégorie PHP

Article mis à jour le : 05-05-2022

Toutes les bases de l'utilisation de PDO avec mySQL PHP5

L'utilisation de PDO avec PHP5 est fortement recommandée. En effet il ne s'agit plus ici de simple requête via une chaîne de caractère et une fonction mais de la manipulation d'un objet. Les avantages sont la gestion de la pupart des SGBD sans que le code soit à réécrire (uniquement les requêtes), la protection contre les injections, mais aussi la gestion des exceptions. Voyons donc les principales requêtes pour un accéder à votre base de données mySQL avec PDO.

1- Activer l'extension

A- Sous Windows

Allez simplement ouvrir votre fichier php.ini pour y activer la ligne suivante (elle doit être en commentaire, c'est à dire avec un ";" devant) ou simplement l'ajouter :

extension=php_pdo.dll

Ensuite vous devez activer le driver de votre SGBD, ici mySQL. Allez dans le répertoire "Ext" de PHP et vérifier que le fichier "php_pdo_mysql.dll" est bien présent. Retournez alors dans votre fichier php.ini pour y activer (si elle est en commenteire) ou ajouter la ligne suivante :

extension=php_pdo_mysql.dll

2- Se connecter

Soit les identifiants pour se connecter :

$Serveur='localhost'; // acces serveur
$Port='3306'; // port de connexion
$BDD='pes'; // le nom de votre base de données
$User='root'; // nom de l'utilisateur
$PSSWD=''; // mot de passe de l'utilisateur

Voici la création d'une connexion :

try
{
        $connexionBDD = new PDO('mysql:host='.$Serveur.';port='.$Port.';dbname='.$BDD, $User, $PSSWD);
}
catch(Exception $e)
{
        echo 'Une erreur est survenue !';    
}

Note : Pour le gestion des erreurs, vous pouvez aussi :

- Afficher le message plus proprement avec :

print_r($e)

- Choisir ou non de continuer le script : la fonction die() arrête le script, et on peut lui passer en paramètre print_r($e), afin d'arrêter le script tout en affichant l'erreur :

die(print_r($e));

3- Exécuter une requête

En gros, avec PDO, il existe deux méthodes :

- La méthode "query"

- La méthode "exec"

Si vous voulez par exemple modifier les infos de joueur ;

$connexionBDD->exec("UPDATE joueur SET NB_BUTS='20'");

Vu que l'on a rien spécifié, on aimerait peut être savoir combien d'enregistrements ont été effectués. La fonction exec retourne ce résultat

$nb_modifs = $connexionBDD->exec("UPDATE joueurs SET NB_BUTS='20'");

Et c'est tout...

Maintenant je veux lire le nom de famille de tous les joueurs

$nomJoueurs=$$connexionBDD->query("SELECT nom FROM joueurs");
$nomJoueurs->setFetchMode(PDO::FETCH_OBJ); // met les résultats sous forme d'objet
while( $unResultat= $nomJoueurs->fetch() ) // pour chaque résultat
{
        echo $unResultat->nom.'
'; // on affiche le nom du joueur
}

Et ENFIN pour ce cas de figure :

$nomJoueurs->closeCursor(); // on ferme le curseur de lecture des résultats

Il est important de fermer le curseur à la fin de la lecture des résultats.

Notez, que l'on peut l'afficher sous la forme de tableau par exemple :

$sql = "SELECT CategoryID, Category FROM category WHERE online = '1' ORDER BY RAND() LIMIT 10";  //requête
    $req = $conn->query($sql);
    while($row = $req->fetch())
    {
        $lesPagesAleatoires[$leCompteur]['Ancre'] = utf8_encode($row['Category']);
}

Si vous aviez juste voulu compter les résultats sans les afficher, vous pouvez utiliser la fonction row() avec fetAll();

$nomJoueurs=$connexionBDD->query("SELECT * FROM joueurs");
        $nomJoueurs->setFetchMode(PDO::FETCH_OBJ);
        $nomJoueurs = $nomJoueurs->fetchAll();
        $nombre = count($nomJoueurs);
        echo $nombre;

4- Sécuriser les requêtes

Pour faire simple, préparer des requêtes permer de se protéger contre les injections SQL. Exemple ci-dessous, je cherche tous les joueurs ayant pour prénom David.

Avant la sécurisation :

$Prenom = "David";
$connexionBDD = new PDO('mysql:host='.$Serveur.';port='.$Port.';dbname='.$BDD, $User, $PSSWD);
        $nomJoueurs=$connexionBDD->query("SELECT Nom FROM joueurs WHERE Prenom ='$Prenom'");
        $nomJoueurs->setFetchMode(PDO::FETCH_OBJ);
        while( $unResultat= $nomJoueurs->fetch() ) // pour chaque résultat
        {
            echo $unResultat->Nom.'
'; // on affiche le nom du joueur
        }

Maintenant, sécurisons-là avec QUOTE :

$connexionBDD = new PDO('mysql:host='.$Serveur.';port='.$Port.';dbname='.$BDD, $User, $PSSWD);
$nomJoueurs=$connexionBDD->query("SELECT Nom FROM joueurs WHERE Prenom =".$connexionBDD->quote($Prenom, PDO::PARAM_STR));

Il est aussi possible de sécuriser avec quote une requête utilisant la méthode exec() :

$pdo->exec('INSERT INTO joueurs(nom, prenom, date) VALUES('. $pdo->quote($_POST['nom']) .', '. $pdo->quote($_POST['prenom']) .', NOW())');

Ou sécurisation avec bindValue() :

$conn = new PDO("mysql:host=$adresse;dbname=$base", $login, $mdp); // connexion à la BDD
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = $conn->prepare("SELECT abo_id FROM newsletter_abonnes WHERE abo_email = :email");
        $sql->bindValue('email', $_GET['email'], PDO::PARAM_STR);
        $sql->execute();
        $row = $sql->fetchAll();
        $sql->closeCursor();

Et voila...

 

 


Cet article vous a plu? Découvrez d'autres articles :


comments powered by Disqus