Classe PHP pour simplifier PDO

  • Auteur de la discussion Auteur de la discussion MSLift
  • Créé le Créé le
Statut
N'est pas ouverte pour d'autres réponses.

MSLift

Premium
Inscription
5 Août 2013
Messages
833
Réactions
330
Points
20 046
RGCoins
55
1. Introduction

C'est quelque chose qui revient assez souvent dans les topics d'aide, je parle ici de la connexion à la base de données (la plupart du temps MySQL).
En effet c'est pas facile de s'y retrouver entre les différentes méthodes:
- mysql_: simple à utiliser mais peu sécurisé
- PDO: sécurisé, mais pas super simple
- mysqli_: peu utilisé et qui supporte qu'un type de base de donnée

En bref, je viens ici pour vous apporter une solution facile d'utilisation, sécurisée, et qui supporte tous les types de base de données.



2. Le code à utiliser

Le code que je vais vous donner se compose d'une classe et d'une fonction.
- La classe permet d'utiliser PDO de manière plus simple, et de construire des requêtes préparées en une seule ligne.
- La fonction, facultative, permet d'utiliser cette classe encore plus simplement, et depuis n'importe où sans utiliser global.


Donc voici le code à enregistrer dans un fichier à part de préférence, nommez le database.class.php par exemple.
Pastebin:
PHP:
<?php

  /*|
    |----------------------------------------------------------------
    | > Classe: Database
    |----------------------------------------------------------------
    |
    | La méthode query permet de construire des requêtes préparées
    | de manière totalement sécurisée en une seule ligne.
    |
    |*/
class Database extends PDO {
  
    public function __construct($dsn, $username = '', $password = '', $options = array()) {
        $default = array(
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
        );
        $options = $options + $default;
        return parent::__construct($dsn, $username, $password, $options);
    }

    public function query($sql, $params = null) {
        if (empty($params))
            return parent::query($sql);
        if (!is_array($params))
            $params = array($params);
        $stmt = parent::prepare($sql);
        if ($params === array_values($params)) {
            $stmt->execute($params);
        } else {
            foreach ($params as $key => $value) {
                if (is_bool($value))
                    $type = PDO::PARAM_BOOL;
                else if (is_null($value))
                    $type = PDO::PARAM_NULL;
                else if (is_int($value))
                    $type = PDO::PARAM_INT;
                else
                    $type = PDO::PARAM_STR;
                $stmt->bindValue(!strpos($key, ':') ? $key : ":$key", $value, $type);
            }
            $stmt->execute();
        }
        return $stmt;
    }

}



  /*|
    |----------------------------------------------------------------
    | > Fonction: Query
    |----------------------------------------------------------------
    |
    | Permet de garder une instance de la classe Database en mémoire
    | et de l'appeler directement depuis cette fonction.
    |
    |*/
function query($sql, $params = null){
    static $db;
    if ($sql instanceof Database)
        return $db = $sql;
    return $db->query($sql, $params);
}



3. Exemple d'utilisation

Après avoir inclus le fichier, créez une instance de la classe comme vous feriez avec PDO, sauf que vous le faites avec la classe Database.
PHP:
require_once 'database.class.php';
$db = new Database('mysql:dbname=test;host=127.0.0.1', 'user', 'password');


Et voila tout est prêt ! Donc faire des requêtes à votre base de donnée c'est assez simple:
PHP:
$db->query($requete_sql, $parametres);
Cette fonction va préparer la requête (argument 1) et va l'exécuter (argument 2) :)


Voici quelques exemples:
PHP:
// Sélectionner la table users et tout récupérer
$db->query('SELECT * FROM users WHERE 1')->fetchAll();

// Insérer dans la table users
$db->query('INSERT INTO users VALUES (?, ?)', array($username, $password));

// Insérer dans la table users
$db->query('INSERT INTO users VALUES (:username, :password)', array(
    'username' => $username,
    'password' => $password
));

// Modifier la table users et compter le nombre de lignes modifiées
$db->query('UPDATE users SET password = ? WHERE id = ?', array($password, $user_id))->rowCount();



4. Utilisation de la fonction query (facultatif)

Si vous voulez, vous pouvez utiliser la fonction query pour un code encore plus court et qui fonctionne depuis n'importe où (même dans une autre fonction, dans une autre classe, etc..).

1. Insérez dans la fonction votre variable avec la base de données
PHP:
query($db);


2. Maintenant, vous pouvez utiliser query($sql, $params) au lieu de $db->query($sql, $params), c'est à dire:
PHP:
query('SELECT * FROM users WHERE id = ?', 3)->fetchAll();


Et voila, c'est la fin de ce tutoriel j'espère que ça aidera les débutants comme confirmés à mieux sécuriser leurs sites :)
 
Salut,

Bon tutoriel, par contre c'est beaucoup mieux d'utiliser PDO::prepare, au lieu de PDO::query, niveau faille et performance. ;)

Bonne fin de soirée,
Wayz SEC
 
Salut,

Bon tutoriel, par contre c'est beaucoup mieux d'utiliser PDO::prepare, au lieu de PDO::query, niveau faille et performance. ;)

Bonne fin de soirée,
Wayz SEC

Je pense que tu as pas vraiment compris l'utilité de ma classe (d)
Car en l'utilisant, quand tu fais $db->query($sql, $params) ça créé une requête préparée et ça l’exécute, comme tu fais d'habitude ;)

Donc, toi tu dois faire comme ça:
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute(array($id));
$stmt->fetch();

Avec la classe, ça donne ça:
PHP:
$db->query('SELECT * FROM users WHERE id = ?', $id)->fetch();
 
Je pense que tu as pas vraiment compris l'utilité de ma classe (d)
Car en l'utilisant, quand tu fais $db->query($sql, $params) ça créé une requête préparée et ça l’exécute, comme tu fais d'habitude ;)

Donc, toi tu dois faire comme ça:
PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute(array($id));
$stmt->fetch();

Avec la classe, ça donne ça:
PHP:
$db->query('SELECT * FROM users WHERE id = ?', $id)->fetch();
Ah d'accord, je t'avoue que j'ai pas lu la Class Database entièrement (seulement la co), effectivement gros gain de temps alors :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Retour
Haut