شرح صفوف ومحتوى الفقرة
غالباً ما ينقر المستخدمون مرتين على زر الإرسال عند بطء الشبكة؛ لذا اجمع بين تعطيل الزر مؤقتاً في الواجهة وضوابط منع التكرار على الخادم.
- عطّل زر الإرسال (
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";
}