|
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.