شرح صفوف ومحتوى الفقرة
عندما يخالف أمر 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";
}