<?php
declare(strict_types=1);
require_once 'Database.php';
/**
* EXEMPLES D'UTILISATION
* Ancien code vs Nouveau code
*/
// =====================================================
// EXEMPLE 1 : Connexion
// =====================================================
echo "=== EXEMPLE 1 : Connexion ===\n\n";
// ? ANCIEN CODE
/*
$db = new database('localhost', 'user', 'pass', 'mabase');
if ($db->getErrorNum()) {
die("Erreur: " . $db->getErrorMsg());
}
*/
// ? NOUVEAU CODE (avec gestion d'erreurs)
try {
$db = new Database(
host: 'localhost',
user: 'web',
password: 'web',
database: 'test'
);
echo "? Connexion réussie\n";
echo "Version MySQL : " . $db->getVersion() . "\n\n";
} catch (Exception $e) {
die("Erreur de connexion : " . $e->getMessage() . "\n");
}
// =====================================================
// EXEMPLE 2 : Requête SELECT simple
// =====================================================
echo "=== EXEMPLE 2 : SELECT Simple ===\n\n";
// ? ANCIEN CODE (DANGEREUX - Injection SQL possible)
/*
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
$results = $db->query($sql);
if ($results) {
foreach ($results as $row) {
echo $row['name'] . "\n";
}
}
*/
// ? NOUVEAU CODE (SÉCURISÉ avec requête préparée)
$userId = 1; // Simule un ID
$sql = "SELECT * FROM users WHERE id = :id";
$results = $db->queryPrepared($sql, ['id' => $userId]);
if ($results !== false) {
echo "Nombre de résultats : " . $db->getNumRows() . "\n";
foreach ($results as $row) {
echo "- " . $row['name'] . "\n";
}
} else {
echo "Erreur : " . $db->getErrorMsg() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 3 : INSERT avec protection
// =====================================================
echo "=== EXEMPLE 3 : INSERT Sécurisé ===\n\n";
// ? ANCIEN CODE (VULNÉRABLE)
/*
$name = $_POST['name'];
$email = $_POST['email'];
$sql = "INSERT INTO users (name, email) VALUES ('" .
$db->getEscaped($name) . "', '" .
$db->getEscaped($email) . "')";
$db->query($sql);
$lastId = $db->getLastId();
*/
// ? NOUVEAU CODE (SÉCURISÉ)
$name = "Jean Dupont";
$email = "jean@example.com";
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$success = $db->execute($sql, [
'name' => $name,
'email' => $email
]);
if ($success) {
echo "? Insertion réussie\n";
echo "ID créé : " . $db->getLastId() . "\n";
echo "Lignes affectées : " . $db->getNumRows() . "\n";
} else {
echo "? Erreur : " . $db->getErrorMsg() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 4 : UPDATE
// =====================================================
echo "=== EXEMPLE 4 : UPDATE ===\n\n";
// ? ANCIEN CODE
/*
$id = $_GET['id'];
$name = $_POST['name'];
$sql = "UPDATE users SET name = '" . $db->getEscaped($name) . "' WHERE id = " .
(int)$id;
$db->query($sql);
*/
// ? NOUVEAU CODE
$sql = "UPDATE users SET name = :name WHERE id = :id";
$success = $db->execute($sql, [
'name' => 'Marie Martin',
'id' => 1
]);
if ($success) {
echo "? Mise à jour réussie\n";
echo "Lignes modifiées : " . $db->getNumRows() . "\n";
} else {
echo "? Erreur : " . $db->getErrorMsg() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 5 : DELETE
// =====================================================
echo "=== EXEMPLE 5 : DELETE ===\n\n";
// ? ANCIEN CODE
/*
$id = $_GET['id'];
$sql = "DELETE FROM users WHERE id = " . (int)$id;
$db->query($sql);
*/
// ? NOUVEAU CODE
$sql = "DELETE FROM users WHERE id = :id";
$success = $db->execute($sql, ['id' => 999]);
if ($success) {
echo "? Suppression réussie\n";
echo "Lignes supprimées : " . $db->getNumRows() . "\n";
} else {
echo "? Erreur : " . $db->getErrorMsg() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 6 : Requête complexe avec plusieurs paramètres
// =====================================================
echo "=== EXEMPLE 6 : Requête Complexe ===\n\n";
// ? NOUVEAU CODE
$sql = "SELECT * FROM users
WHERE age > :min_age
AND city = :city
AND status = :status
ORDER BY name
LIMIT :limit";
$results = $db->queryPrepared($sql, [
'min_age' => 18,
'city' => 'Paris',
'status' => 'active',
'limit' => 10
]);
if ($results !== false) {
echo "Trouvé " . $db->getNumRows() . " utilisateur(s)\n";
foreach ($results as $row) {
echo "- {$row['name']} ({$row['age']} ans)\n";
}
}
echo "\n";
// =====================================================
// EXEMPLE 7 : NOUVEAU - Transactions
// =====================================================
echo "=== EXEMPLE 7 : Transactions (NOUVEAU) ===\n\n";
try {
// Démarre une transaction
$db->beginTransaction();
// Plusieurs opérations
$db->execute("INSERT INTO orders (user_id, total) VALUES (:user_id, :total)"
, [
'user_id' => 1,
'total' => 99.99
]);
$orderId = $db->getLastId();
$db->execute(
"INSERT INTO order_items (order_id, product_id, quantity) VALUES (:order_id," .
" :product_id, :quantity)", [
'order_id' => $orderId,
'product_id' => 5,
'quantity' => 2
]);
// Valide toutes les opérations
$db->commit();
echo "? Transaction réussie\n";
echo "Commande créée : #$orderId\n";
} catch (Exception $e) {
// En cas d'erreur, annule tout
if ($db->inTransaction()) {
$db->rollback();
}
echo "? Transaction annulée : " . $e->getMessage() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 8 : Protection contre injection SQL
// =====================================================
echo "=== EXEMPLE 8 : Test d'Injection SQL ===\n\n";
// Tentative d'injection SQL
$maliciousInput = "1 OR 1=1--";
// ? ANCIEN CODE - VULNÉRABLE
/*
$sql = "SELECT * FROM users WHERE id = " . $maliciousInput;
// Résultat : Retourne TOUS les utilisateurs !
*/
// ? NOUVEAU CODE - PROTÉGÉ
$sql = "SELECT * FROM users WHERE id = :id";
$results = $db->queryPrepared($sql, ['id' => $maliciousInput]);
if ($results !== false) {
echo "Résultats trouvés : " . count($results) . "\n";
echo "? L'injection SQL a été bloquée automatiquement !\n";
} else {
echo "Aucun résultat (normal)\n";
}
echo "\n";
// =====================================================
// EXEMPLE 9 : Gestion d'erreurs moderne
// =====================================================
echo "=== EXEMPLE 9 : Gestion d'Erreurs ===\n\n";
// Requête avec erreur volontaire
$sql = "SELECT * FROM table_inexistante";
$results = $db->query($sql);
if ($results === false) {
echo "Une erreur s'est produite :\n";
echo "Code : " . $db->getErrorNum() . "\n";
echo "Message : " . $db->getErrorMsg() . "\n";
}
echo "\n";
// =====================================================
// EXEMPLE 10 : Fermeture de connexion
// =====================================================
echo "=== EXEMPLE 10 : Fermeture ===\n\n";
// ? ANCIEN CODE
/*
$db->close();
*/
// ? NOUVEAU CODE
$db->close();
// Ou laissez le destructeur le faire automatiquement
echo "? Connexion fermée\n";
Invité
11 Juin 2009 à 19:47Bonjour,
juste une erreur à signaler,
quand vous écrivez : "database::getEscaped($sql)", ligne 84, ce sont les attributs qu'il faut sécurisés, et pas la requête SQL.
un exemple :
$sql = INSERT INTO user (`login`, `pass`) VALUES ('j'ean marie', 'pass');
Si je fais : database::getEscaped($sql) :
$sql = INSERT INTO user (`login`, `pass`) VALUES (\'j\'ean marie\', \'pass\');
alors qu'il faudrait :
$sql = INSERT INTO user (`login`, `pass`) VALUES ('j\'ean marie', 'pass'); ....
Une solution :
ligne 84 : $this->cursor = mysql_query($sql, $this->resource);
Et de laisser le contrôle des attributs à l'utilisateur.
Brieuc.