انتقل إلى محتوى الدرس
الدرس 84
دورة PHP

تحديث وحذف السجلات وإدارة المعاملات البنكية في PDOPHP PDO Updating Deleting and Database Transactions

تعلّم تحديث وحذف السجلات وإدارة المعاملات البنكية في PDO بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
1
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

لتعديل بيانات سجل موجود في قاعدة البيانات بأمان، نستخدم استعلام UPDATE محضراً مع ربط المعاملات في كل من جملة التعيين SET وجملة الشرط WHERE:

  • حتمية وجود شرط WHERE: تأكد دائماً من كتابة شرط التحديد الدقيق (مثل WHERE id = :id)؛ لأن نسيان جملة WHERE يؤدي إلى تعديل كافة صفوف الجدول بالكامل!
  • استخدام المعاملات المسماة: تمنح المعاملات المسماة وضوحاً عالياً عند تحديث عدة حقول في نفس السجل.
مخطط يوضح تحديث وحذف السجلات ودالة rowCount وإدارة المعاملات الذرية عبر beginTransaction و commit و rollBack في PHP 8.4
PHP
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE products (id INT, price REAL)");
$pdo->exec("INSERT INTO products VALUES (1, 50.0)");

$stmt = $pdo->prepare(
    "UPDATE products SET price = :price WHERE id = :id"
);
$stmt->execute(["price" => 45.0, "id" => 1]);
echo "Product #1 price updated.";

لحذف سجل محدد من الجدول بأمان، ننفذ استعلام DELETE FROM ... WHERE محضراً:

  • تحديد السجل المستهدف بدقة: اربط دائماً قيمة المفتاح الأساسي كمعامل محضر (WHERE id = :id) لضمان حذف السجل المطلوب فقط.
  • الحذف المنطقي (Soft Delete) في الأنظمة المالية: في جداول الفواتير والسجلات المحاسبية، تفضل الأنظمة الاحترافية تحديث عمود تاريخ الحذف deleted_at بدلاً من مسح السجل نهائياً.
PHP
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE sessions (id TEXT, user_id INT)");
$pdo->exec("INSERT INTO sessions VALUES ('sess_1', 7)");

$stmt = $pdo->prepare("DELETE FROM sessions WHERE id = :id");
$stmt->execute(["id" => "sess_1"]);
echo "Expired session deleted.";

بعد تنفيذ استعلام INSERT أو UPDATE أو DELETE، نستدعي الدالة $stmt->rowCount() من كائن الاستعلام $stmt لمعرفة العدد الفعلي للصفوف التي تأثرت بالعملية:

  • اكتشاف المعرفات غير الموجودة: إذا نفذت استعلام حذف أو تحديث لمعرف معين وكانت نتيجة $stmt->rowCount() === 0، فهذا يعني أن المعرف غير موجود أصلاً في الجدول.
  • تجنب استخدامها مع SELECT: صُممت rowCount() لعمليات التعديل والكتابة، أما لحساب عدد نتائج البحث فاستخدم SELECT COUNT(*) مع fetchColumn().
PHP
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE coupons (code TEXT, active INT)");
$pdo->exec("INSERT INTO coupons VALUES ('SAVE20', 1)");

$stmt = $pdo->prepare("DELETE FROM coupons WHERE code = :code");
$stmt->execute(["code" => "SAVE20"]);
echo "Deleted rows: " . $stmt->rowCount();

تتطلب العديد من العمليات الحساسة تنفيذ عدة استعلامات SQL مترابطة لا يصح نجاح بعضها وفشل البعض الآخر — مثل تحويل مبلغ مالي بين حسابين، أو إنشاء فاتورة طلب وخصم الكمية من المخزون. هنا تضمن المعاملة الذرية (Database Transaction) قاعدة الكل أو لا شيء (All-or-Nothing):

  • خطر غياب المعاملة: إذا خُصم المبلغ من حساب المرسل في الاستعلام الأول، ثم وقع خطأ قبل إضافته لحساب المستلم في الاستعلام الثاني، ستتلف البيانات المالية!
  • حماية المعاملة الذرية: إما أن تنجح جميع الاستعلامات معاً ويتم اعتمادها، أو يتم التراجع عنها جميعاً بالكامل عند وقوع أي عطل.
مخطط تدفق التنفيذ العملي لقسم أهمية المعاملات الذرية Transactions في لغة PHP
PHP
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE accounts (id INT, balance INT)");
$pdo->exec("INSERT INTO accounts VALUES (1, 500), (2, 200)");

// Check whether a transaction is currently active:
echo $pdo->inTransaction() ? "Active" : "Auto-commit mode";

تُدار المعاملات في PDO بهيكل قياسي محكم داخل كتلة try / catch عبر ثلاث دوال في الكائن $pdo:

  • $pdo->beginTransaction(): توقف الاعتماد التلقائي وتبدأ معاملة جديدة معزولة.
  • $pdo->commit(): توضع في نهاية كتلة try لاعتماد وحفظ كافة التعديلات بشكل دائم بعد نجاح جميع الخطوات.
  • $pdo->rollBack(): توضع داخل كتلة catch (Throwable $e) (مع فحص if ($pdo->inTransaction())) لإلغاء جميع التغييرات وإعادة البيانات لحالتها الأصلية فور وقوع أي خطأ.
PHP
<?php
$pdo->beginTransaction();
try {
    $stmt = $pdo->prepare("UPDATE wallets SET bal = bal + :amt WHERE id = :id");
    $stmt->execute(["amt" => -100, "id" => 1]);
    $stmt->execute(["amt" => 100, "id" => 2]);
    $pdo->commit();
    echo "Transfer committed.";
} catch (Throwable $e) {
    if ($pdo->inTransaction()) { $pdo->rollBack(); }
}

يلخص الجدول المرجعي الشامل التالي عمليات CRUD الأربعة وإدارة المعاملات في PDO بلغة PHP 8.4:

العملية / المرحلةالكائنالنمط البرمجي القياسيالسلوك والقيمة المُرجعة
الإضافة (INSERT)$pdo / $stmtprepare() + execute() + lastInsertId()إدراج آمن للسجل وإرجاع المعرف التلقائي المولد
القراءة (SELECT)$stmtfetch() / fetchAll() / fetchColumn()جلب سجل مفرد أو قائمة سجلات أو قيمة عمود
التحديث والحذف$stmtprepare() + execute() + rowCount()تعديل أو حذف السجلات وإرجاع عدد الصفوف المتأثرة
بدء المعاملة الذرية$pdo$pdo->beginTransaction()بدء وضع المعاملة الذرية المعزولة (الكل أو لا شيء)
إنهاء المعاملة$pdo$pdo->commit() أو $pdo->rollBack()اعتماد كافة التغييرات نهائياً أو التراجع عنها بالكامل
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس الختامي تحديث وحذف السجلات بأمان عبر الاستعلامات المحضرة، والتحقق من عدد الصفوف المتأثرة عبر $stmt->rowCount()، وحماية العمليات المترابطة بالمعاملات الذرية عبر beginTransaction() وcommit() وrollBack(). الخطوة التالية: تهانينا بإتمام جميع دروس دورة PHP 8.4 الشاملة الستة والخمسين على منصة CloseTag! أصبحت الآن جاهزاً لبناء تطبيقات ويب احترافية وآمنة متكاملة مع قواعد البيانات.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Update & Transactions التحديث والمعاملات
تعلّم تحديث وحذف السجلات وإدارة المعاملات البنكية في PDO بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
للمراجعة
02 Updating Records Safely with PDO تحديث السجلات بأمان عبر UPDATE
المفهوم الأساسي لقسم تحديث السجلات بأمان عبر UPDATE في لغة PHP الحديثة.
للمراجعة
03 Deleting Records Safely with PDO حذف السجلات بأمان عبر DELETE
الصياغة البرمجية والتطبيق العملي المباشر لقسم حذف السجلات بأمان عبر DELETE.
للمراجعة
04 Checking Affected Rows rowCount فحص الصفوف المتأثرة بـ rowCount
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم فحص الصفوف المتأثرة بـ rowCount.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم تحديث السجلات بأمان عبر UPDATE للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم حذف السجلات بأمان عبر DELETE وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ماذا يحدث إذا قمت بتنفيذ استعلام UPDATE أو DELETE بدون كتابة جملة الشرط WHERE؟

يؤدي إغفال جملة الشرط WHERE إلى تحديث أو حذف جميع السجلات الموجودة في الجدول بالكامل.

02

أي دالة في كائن PDOStatement تُرجع عدد الصفوف التي تم تعديلها أو حذفها بواسطة آخر استعلام UPDATE أو DELETE؟

تُرجع الدالة $stmt->rowCount() العدد الصحيح للصفوف المتأثرة بعملية التحديث أو الحذف.

03

تماماً مثل استعلامات الإدراج والجلب، يجب استخدام المعاملات المحضرة (:id أو ?) مع أوامر UPDATE و DELETE عند التعامل مع أي مدخلات من المستخدم.

صواب؛ يجب استخدام الاستعلامات المحضرة في جميع أوامر SQL التي تستقبل متغيرات لحمايتها من حقن SQL.

04

لماذا تُعد المعاملات الذرية (Database Transactions) ضرورية عند تحويل رصيد مالي بين حسابين؟

لأنها تضمن الذرية (الكل أو لا شيء): فإما أن تنجح عمليتا الخصم والإيداع معاً أو يتم إلغاؤهما معاً عند حدوث أي خطأ.

05

أي دالة في كائن PDO تبدأ معاملة قاعدة بيانات جديدة وتوقف وضع الاعتماد التلقائي؟

تبدأ الدالة $pdo->beginTransaction() معاملة جديدة.

06

داخل كتلة catch عند فشل المعاملة، أي دالة في كائن PDO تلغي جميع الاستعلامات التي نُفذت منذ بدء المعاملة؟

تقوم الدالة $pdo->rollBack() بالتراجع عن جميع التعديلات غير المعتمدة وإعادة البيانات لحالتها السابقة.

07

استدعاء الدالة $pdo->commit() يحفظ جميع استعلامات المعاملة الحالية بشكل دائم ويعيد الاتصال إلى وضع الاعتماد التلقائي.

صواب؛ تعتمد الدالة commit() كافة عمليات المعاملة بشكل نهائي.

08

أي عبارتين مما يلي صحيحتان حول الدالة rowCount() والمعاملات في واجهة PDO؟

تُرجع $stmt->rowCount() القيمة 0 إذا لم يطابق شرط التحديث أو الحذف أي سجل، وتفحص $pdo->inTransaction() ما إذا كانت هناك معاملة نشطة قبل استدعاء rollBack().