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

Handling Duplicate Key Exceptions معالجة خطأ تكرار القيم الفريدة SQLSTATE 23000

أدرج السجلات المفردة والمتعددة في MySQL عبر الاستعلامات المحضرة، واسترجع المعرف التلقائي بـ lastInsertId وعالج القيم المكررة.
1 صفوف تعليمية
PHP
0 مشاهدة

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

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

عندما يخالف أمر INSERT قيد عدم التكرار UNIQUE (مثل بريد إلكتروني مسجل مسبقاً)، يطلق PDO استثناء PDOException برمز الحالة القياسي "23000".

  • على عكس معظم الاستثناءات في PHP، تُرجع PDOException::getCode() نصاً مكوناً من 5 محارف يمثل رمز SQLSTATE مثل "23000".
  • افحص الشرط $e->getCode() === "23000" لعرض رسالة تنبيه واضحة للمستخدم ("هذا البريد مسجل بالفعل").
  • إذا كان رمز الخطأ مختلفاً عن "23000"، أعد إطلاق الاستثناء (throw $e;) ليتم تسجيل أخطاء النظام غير المتوقعة.

محاولة إدراج البريد [email protected] للمرة الثانية تطلق PDOException بالرمز "23000"، فيتم التقاطه ومعالجته بأمان.

PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT UNIQUE)');
$stmt = $pdo->prepare('INSERT INTO users (email) VALUES (:email)');
$stmt->execute(['email' => '[email protected]']);
try {
    $stmt->execute(['email' => '[email protected]']);
} catch (PDOException $e) {
    $msg = ($e->getCode() === '23000') ? 'Duplicate email blocked' : 'Other error';
    echo "$msg (SQLSTATE " . $e->getCode() . ")\n";
}