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

Preventing Duplicate Clicks and Races منع النقرات المتكررة وتعارض الطلبات المتزامنة

أرسل النماذج بدون تحديث الصفحة باستخدام FormData، وأرجع أخطاء التحقق لكل حقل من PHP، وابنِ نظام تصويت تفاعلي فوري.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

غالباً ما ينقر المستخدمون مرتين على زر الإرسال عند بطء الشبكة؛ لذا اجمع بين تعطيل الزر مؤقتاً في الواجهة وضوابط منع التكرار على الخادم.

  • عطّل زر الإرسال (submitBtn.disabled = true) فور بدء حدث submit، وأعد تفعيله داخل كتلة finally بعد اكتمال الطلب.
  • في PHP، حرر قفل ملف الجلسة مبكراً عبر session_write_close() إذا كان السكريبت ينفذ عمليات قراءة طويلة بعد التحقق من $_SESSION.
  • على مستوى قاعدة البيانات، اعتمد على التحديث الذري SET votes = votes + 1 وقيود UNIQUE بدلاً من القراءة ثم الجمع في PHP.

يؤدي حساب بصمة الإرسال ومقارنتها بآخر عملية مسجلة في الجلسة إلى منع النقرات المزدوجة الخاطئة وإرجاع الرمز 409 Conflict.

PHP
<?php
$_SESSION = ['last_submit_hash' => ''];
$payloadHash = hash('sha256', 'user_42:comment:Hello world');

if ($_SESSION['last_submit_hash'] === $payloadHash) {
    http_response_code(409);
    echo json_encode(['ok' => false, 'error' => 'Duplicate submission']) . "\n";
} else {
    $_SESSION['last_submit_hash'] = $payloadHash;
    echo json_encode(['ok' => true, 'hash' => substr($payloadHash, 0, 12)]) . "\n";
}