Structure des fichiers
/bank_transfer/
├── css/
│ └── [Link]
├── includes/
│ ├── [Link]
│ ├── [Link]
│ ├── [Link]
│ └── [Link]
├── [Link]
├── [Link]
├── [Link]
├── [Link]
├── [Link]
└── [Link]
[Link]
<?php
// Configuration de la base de données
define('DB_HOST', 'localhost');
define('DB_USER', 'votre_utilisateur');
define('DB_PASS', 'votre_mot_de_passe');
define('DB_NAME', 'bank_transfer');
// Clé secrète pour les tokens CSRF
define('CSRF_SECRET', 'votre_clé_secrète');
// Configuration de l'envoi d'emails
define('SMTP_HOST', '[Link]');
define('SMTP_PORT', 587);
define('SMTP_USER', 'votre_email@[Link]');
define('SMTP_PASS', 'votre_mot_de_passe_smtp');
[Link]
<?php
require_once '[Link]';
function getDbConnection() {
static $conn;
if ($conn === null) {
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error) {
die("Erreur de connexion à la base de données : " . $conn->connect_error);
return $conn;
[Link]
<?php
require_once '[Link]';
require_once '[Link]';
function effectuerVirement($expediteurId, $destinataireId, $montant) {
$conn = getDbConnection();
// Vérifier les soldes
$stmt = $conn->prepare("SELECT solde FROM comptes WHERE id = ?");
$stmt->bind_param("i", $expediteurId);
$stmt->execute();
$result = $stmt->get_result();
$soldeExpediteur = $result->fetch_assoc()['solde'];
if ($soldeExpediteur < $montant) {
throw new Exception("Solde insuffisant");
// Commencer la transaction
$conn->begin_transaction();
try {
// Débiter l'expéditeur
$stmt = $conn->prepare("UPDATE comptes SET solde = solde - ? WHERE id = ?");
$stmt->bind_param("di", $montant, $expediteurId);
$stmt->execute();
// Créditer le destinataire
$stmt = $conn->prepare("UPDATE comptes SET solde = solde + ? WHERE id = ?");
$stmt->bind_param("di", $montant, $destinataireId);
$stmt->execute();
// Enregistrer la transaction
$stmt = $conn->prepare("INSERT INTO transactions (expediteur_id, destinataire_id, montant, date)
VALUES (?, ?, ?, NOW())");
$stmt->bind_param("iid", $expediteurId, $destinataireId, $montant);
$stmt->execute();
$conn->commit();
// Envoyer une notification
envoyerNotification($expediteurId, "Virement effectué", "Vous avez effectué un virement de
$montant €");
envoyerNotification($destinataireId, "Virement reçu", "Vous avez reçu un virement de $montant
€");
return true;
} catch (Exception $e) {
$conn->rollback();
throw $e;
function envoyerNotification($userId, $sujet, $message) {
// Implémentation de l'envoi d'email (utiliser une bibliothèque comme PHPMailer)
// ...
function verifierToken($token) {
if (!isset($_SESSION['csrf_token']) || $token !== $_SESSION['csrf_token']) {
die("Token CSRF invalide");
function genererToken() {
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
return $_SESSION['csrf_token'];
[Link]
<?php
session_start();
function estConnecte() {
return isset($_SESSION['user_id']);
function connecterUtilisateur($id, $nom) {
$_SESSION['user_id'] = $id;
$_SESSION['user_name'] = $nom;
function deconnecterUtilisateur() {
session_unset();
session_destroy();
function obtenirUtilisateurId() {
return $_SESSION['user_id'] ?? null;
[Link]
<?php
require_once 'includes/[Link]';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'];
$password = $_POST['password'];
$conn = getDbConnection();
$stmt = $conn->prepare("SELECT id, nom, mot_de_passe FROM utilisateurs WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
if ($user = $result->fetch_assoc()) {
if (password_verify($password, $user['mot_de_passe'])) {
connecterUtilisateur($user['id'], $user['nom']);
header("Location: [Link]");
exit;
$erreur = "Email ou mot de passe incorrect";
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Connexion</title>
<link rel="stylesheet" href="css/[Link]">
</head>
<body>
<div class="container">
<h1>Connexion</h1>
<?php if (isset($erreur)): ?>
<div class="erreur"><?= htmlspecialchars($erreur) ?></div>
<?php endif; ?>
<form method="post">
<div>
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="password">Mot de passe :</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Se connecter</button>
</form>
<p>Pas encore de compte ? <a href="[Link]">S'inscrire</a></p>
</div>
</body>
</html>
tableau de [Link]
<?php
require_once 'includes/[Link]';
if (!estConnecte()) {
header("Location: [Link]");
exit;
}
$userId = obtenirUtilisateurId();
$conn = getDbConnection();
// Récupérer le solde du compte
$stmt = $conn->prepare("SELECT solde FROM comptes WHERE utilisateur_id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
$solde = $result->fetch_assoc()['solde'];
// Récupérer les dernières transactions
$stmt = $conn->prepare("SELECT * FROM transactions WHERE expediteur_id = ? OR destinataire_id = ?
ORDER BY date DESC LIMIT 10");
$stmt->bind_param("ii", $userId, $userId);
$stmt->execute();
$transactions = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tableau de bord</title>
<link rel="stylesheet" href="css/[Link]">
</head>
<body>
<div class="container">
<h1>Bienvenue, <?= htmlspecialchars($_SESSION['user_name']) ?></h1>
<p>Votre solde : <?= number_format($solde, 2) ?> €</p>
<h2>Dernières transactions</h2>
<table>
<thead>
<tr>
<th>Date</th>
<th>Type</th>
<th>Montant</th>
</tr>
</thead>
<tbody>
<?php foreach ($transactions as $transaction): ?>
<tr>
<td><?= htmlspecialchars($transaction['date']) ?></td>
<td><?= $transaction['expediteur_id'] == $userId ? 'Envoyé' : 'Reçu' ?></td>
<td><?= number_format($transaction['montant'], 2) ?> €</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<a href="[Link]" class="button">Effectuer un virement</a>
<a href="[Link]" class="button">Se déconnecter</a>
</div>
</body>
</html>
[Link]
<?php
require_once 'includes/[Link]';
if (!estConnecte()) {
header("Location: [Link]");
exit;
$userId = obtenirUtilisateurId();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verifierToken($_POST['csrf_token']);
$destinataireId = $_POST['destinataire'];
$montant = floatval($_POST['montant']);
try {
effectuerVirement($userId, $destinataireId, $montant);
$succes = "Virement effectué avec succès";
} catch (Exception $e) {
$erreur = $e->getMessage();
$conn = getDbConnection();
$stmt = $conn->prepare("SELECT id, nom FROM utilisateurs WHERE id != ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$destinataires = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Effectuer un virement</title>
<link rel="stylesheet" href="css/[Link]">
</head>
<body>
<div class="container">
<h1>Effectuer un virement</h1>
<?php if (isset($succes)): ?>
<div class="succes"><?= htmlspecialchars($succes) ?></div>
<?php endif; ?>
<?php if (isset($erreur)): ?>
<div class="erreur"><?= htmlspecialchars($erreur) ?></div>
<?php endif; ?>
<form method="post">
<input type="hidden" name="csrf_token" value="<?= genererToken() ?>">
<div>
<label for="destinataire">Destinataire :</label>
<select id="destinataire" name="destinataire" required>
<?php foreach ($destinataires as $destinataire): ?>
<option value="<?= $destinataire['id'] ?>"><?= htmlspecialchars($destinataire['nom']) ?
></option>
<?php endforeach; ?>
</select>
</div>
<div>
<label for="montant">Montant (€) :</label>
<input type="number" id="montant" name="montant" step="0.01" min="0.01" required>
</div>
<button type="submit">Effectuer le virement</button>
</form>
<a href="[Link]">Retour au tableau de bord</a>
</div>
</body>
</html>
dé[Link]
<?php
require_once 'includes/[Link]';
deconnecterUtilisateur();
header("Location: [Link]");
exit;
[Link]
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
background-color: #f4f4f4;
.container {
width: 80%;
margin: auto;
overflow: hidden;
padding: 20px;
h1, h2 {
color: #333;
}
form {
background: #fff;
padding: 20px;
margin-bottom: 20px;
border-radius: 5px;
input[type="email"],
input[type="password"],
input[type="number"],
select {
width: 100%;
padding: 10px;
margin-bottom: 10px;
button {
display: inline-block;
background: #333;
color: #fff;
padding: 10px 20px;
border: none;
cursor: pointer;
}
button:hover {
background: #555;
.erreur {
background: #ffecec;
color: #721c24;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #f5c6cb;
border-radius: 5px;
.succes {
background: #d4edda;
color: #155724;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #c3e6cb;
border-radius: 5px;
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
table, th, td {
border: 1px solid #ddd;
th, td {
text-align: left;
padding: 10px;
th {
background-color: #f2f2f2;
.button {
display: inline-block;
background: #333;
color: #fff;
padding: 10px 20px;
text-decoration: none;
margin-right: 10px;
}
.button:hover {
background: #555;