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.
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.
Et voila tout est prêt ! Donc faire des requêtes à votre base de donnée c'est assez simple:
Cette fonction va préparer la requête (argument 1) et va l'exécuter (argument 2) 
Voici quelques exemples:
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
2. Maintenant, vous pouvez utiliser query($sql, $params) au lieu de $db->query($sql, $params), c'est à dire:
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
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:
Vous devez être inscrit pour voir les liens ! Inscrivez-vous ou connectez-vous ici.
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);
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