طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 301 · من الفكرة إلى المنتج (١): تطبيق ويب متكامل
الدرس 5 · الوحدة 2: بناء المنتج

المحطّة ٥: إدارة المهامّ — CRUD لكل مستخدم

قلب المنتج: أضِف واعرض وعدّل مهامّك — ولا أحد يرى مهامّك سواك. ⏱ نحو 28 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تنفّذ أفعال CRUD الأربعة بـ PDO والمعاملات المُعدّة.
  • تقيّد كل استعلامٍ بصاحب البيانات عبر user_id من الجلسة.
  • تحمي كل صفحةٍ بحارس جلسةٍ في أعلاها.
  • تتحقّق من المدخلات وتمنع العبث بمهامّ مستخدمٍ آخر.

١CRUD: الأفعال الأربعة لأيّ تطبيق

جوهر أيّ تطبيقٍ يدير بياناتٍ أربعة أفعال، نختصرها CRUD:

الفعلبالعربيّةSQLفي مشروعنا
CreateإنشاءINSERTإضافة مهمّة
ReadقراءةSELECTعرض قائمة المهامّ
UpdateتعديلUPDATEتعليم مهمّةٍ منجَزة
DeleteحذفDELETEحذف مهمّة

شرطٌ واحدٌ يتكرّر في كل فعلٍ ويحمي خصوصيّة المستخدم: WHERE user_id = ? بقيمة $_SESSION['uid']. به «يرى كلٌّ مهامّه فقط» — وهو أهمّ متطلّبٍ في مشروعنا.

٢حارس الصفحة المحميّة

كل صفحةٍ تدير مهامًّا يجب أن تبدأ بالتأكّد من أنّ المستخدم داخلٌ فعلًا. نكرّر هذا «الحارس» في أعلى كل صفحة:

<?phpsession_start();require __DIR__ . '/db.php';if (!isset($_SESSION['uid'])) { http_response_code(401); echo 'سجّل الدخول أوّلًا'; exit; }$uid = $_SESSION['uid'];   // هويّة صاحب المهامّ في كل استعلام

٣اعرض وأضِف — مقيّدًا بصاحب المهامّ

نجرّب دورةً: ندخل باسم sarah، نعرض مهامّها (ثلاث)، نضيف واحدةً، ثم نعرض من جديد (أربع). لاحظ أنّ كل استعلامٍ يحمل $uid:

<?phpsession_start();require __DIR__ . '/db.php';if (!isset($_SESSION['uid'])) { echo 'سجّل الدخول أوّلًا'; exit; } $st = $pdo->prepare('SELECT id, title, done FROM tasks WHERE user_id = ? ORDER BY id');$st->execute([$_SESSION['uid']]);foreach ($st->fetchAll() as $t) {    $mark = $t['done'] ? '[✓]' : '[ ]';    echo "{$mark} {$t['title']}\n";}

توقّع وتحقّق

ما الشرط الذي يجعل «كلٌّ يرى مهامّه فقط»؟

أيّ أمر SQL لتعليم مهمّةٍ منجَزة؟

تعديل القيمة الموجودة.

لماذا نضيف AND user_id = ? في التعديل والحذف؟

ما أوّل ما تفعله الصفحة المحميّة؟

الخلاصة

تحدٍّ برمجي: إدارة المهامّ لكل مستخدم

برمجي

ابنِ قلب المشروع: صفحاتٌ تدير مهامّ المستخدم الحاليّ فقط — عرضٌ وإضافةٌ وتعليمٌ كمنجَز. كل استعلامٍ مقيّدٌ بصاحب المهامّ.

المطلوب:
  • list.php: يعرض مهامّ المستخدم الحاليّ فقط، كلٌّ بعلامة [✓] أو [ ] ثم العنوان.
  • add.php (POST title): يضيف مهمّةً للمستخدم الحاليّ (غير منجَزة)، ويطبع أُضيفت؛ ويرفض العنوان الفارغ.
  • toggle.php (POST id): يقلب حالة الإنجاز لمهمّةٍ يملكها المستخدم، ويطبع تمّ.
  • كل صفحةٍ تبدأ بحارس الجلسة، وكل استعلامٍ مُعدٌّ ومقيّدٌ بـ user_id.
👀 اعرض الاستجابة المطلوبة
✓ التحقق الآلي: يرسل المختبر هذه الطلبات إلى خادمك بالترتيب ثم يفحص الاستجابات
  1. POST /login.php (username=sarah&password=sarah123)
  2. GET /list.php
  3. POST /add.php (title=اجتماع الفريق)
  4. GET /list.php
  5. POST /toggle.php (id=1)
  6. GET /list.php
  • الكود يعمل بلا أخطاء أو تحذيرات
  • يعرض مهامّ sarah
  • لا يعرض مهامّ مستخدمٍ آخر
  • الإضافة تعمل وتظهر في القائمة
  • التعليم كمنجَز يقلب الحالة
  • العلامة تظهر للمهامّ غير المنجَزة

💡 تلميح 1
في كل استعلامٍ مرّر $_SESSION["uid"] كمعاملٍ مُعدّ.
💡 تلميح 2
التعليم: UPDATE tasks SET done = 1 - done WHERE id = ? AND user_id = ? — الشرط الثاني يمنع العبث بمهامّ الغير.
💡 تلميح 3
العلامة: $t["done"] ? "[✓]" : "[ ]".

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

<?phpsession_start();require __DIR__ . '/db.php';if (!isset($_SESSION['uid'])) { echo 'سجّل الدخول أوّلًا'; exit; } $st = $pdo->prepare('SELECT id, title, done FROM tasks WHERE user_id = ? ORDER BY id');$st->execute([$_SESSION['uid']]);foreach ($st->fetchAll() as $t) {    $mark = $t['done'] ? '[✓]' : '[ ]';    echo "{$mark} {$t['title']}\n";}

🐞 لاحظت خطأً في هذا الدرس؟ أبلغني بالبريد

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس