FitClass Fitness Class Scheduler
Lab 11

Database, SQL Queries, Transactions

هذا المعمل يوضح تصميم قاعدة البيانات، الاتصال باستخدام PDO، العلاقات بين الجداول، واستعمال Transaction لمنع الحجز فوق السعة.

قاعدة البيانات غير مثبتة حالياً. افتح install.php وثبت قاعدة البيانات أولاً.
0classes
0instructors
0members
0bookings

النتيجة من قاعدة البيانات

ID الحصة النوع المدرب الوقت المقاعد
لا توجد بيانات، أو لم يتم تثبيت قاعدة البيانات.

الكود المطلوب عرضه في الفيديو

1) اتصال PDO

// Lab 11: الاتصال بقاعدة البيانات باستخدام PDO
$dsn = 'mysql:host=127.0.0.1;dbname=fitness_scheduler;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', '', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

2) SQL JOIN

// استعلام JOIN لعرض الحصص مع المدربين
SELECT s.id, c.title, c.type, i.name AS instructor_name, s.starts_at, s.capacity
FROM class_sessions s
JOIN classes c ON c.id = s.class_id
JOIN instructors i ON i.id = s.instructor_id
ORDER BY s.starts_at ASC;

3) Transaction

// Transaction لمنع تجاوز السعة عند الحجز
$pdo->beginTransaction();
$stmt = $pdo->prepare('SELECT * FROM class_sessions WHERE id = ? FOR UPDATE');
$stmt->execute([$sessionId]);
$session = $stmt->fetch();

$count = $pdo->prepare("SELECT COUNT(*) FROM bookings WHERE session_id = ? AND status = 'booked'");
$count->execute([$sessionId]);

if ((int)$count->fetchColumn() < (int)$session['capacity']) {
    $insert = $pdo->prepare('INSERT INTO bookings (session_id, user_id, status) VALUES (?, ?, ?)');
    $insert->execute([$sessionId, $userId, 'booked']);
}
$pdo->commit();