# PDO vs MySQLi - دليل مرجعي سريع

## ⚠️ هذا المشروع يستخدم PDO فقط!

---

## 📊 مقارنة سريعة

| العملية | PDO ✅ | MySQLi ❌ |
|---------|-------|----------|
| **بدء معاملة** | `beginTransaction()` | `begin_transaction()` |
| **التنفيذ** | `execute([...])` | `bind_param()` + `execute()` |
| **آخر ID** | `lastInsertId()` | `insert_id` |
| **إتمام** | `commit()` | `commit()` |
| **تراجع** | `rollBack()` | `rollback()` |
| **فحص معاملة** | `inTransaction()` | لا يوجد |

---

## ✅ الطريقة الصحيحة (PDO)

### إدراج بيانات:

```php
try {
    // بدء معاملة
    $connect->beginTransaction();
    
    // تحضير الاستعلام
    $stmt = $connect->prepare("
        INSERT INTO table_name (col1, col2, col3) 
        VALUES (?, ?, ?)
    ");
    
    // تنفيذ مع المعاملات
    $stmt->execute([$value1, $value2, $value3]);
    
    // الحصول على آخر ID
    $inserted_id = $connect->lastInsertId();
    
    // إتمام المعاملة
    $connect->commit();
    
    echo "Success! ID: $inserted_id";
    
} catch (Exception $e) {
    // التراجع عن المعاملة
    if ($connect->inTransaction()) {
        $connect->rollBack();
    }
    
    error_log("Error: " . $e->getMessage());
}
```

### استعلام بيانات:

```php
// مع معاملات
$stmt = $connect->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$user_id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

// بدون معاملات (مباشر)
$stmt = $connect->query("SELECT * FROM settings");
$settings = $stmt->fetchAll(PDO::FETCH_ASSOC);
```

### تحديث بيانات:

```php
$stmt = $connect->prepare("
    UPDATE users 
    SET name = ?, email = ? 
    WHERE id = ?
");
$stmt->execute([$name, $email, $user_id]);

$affected_rows = $stmt->rowCount();
```

---

## ❌ الطريقة الخاطئة (MySQLi)

### لا تستخدم هذا:

```php
// ❌ خطأ
$connect->begin_transaction();

// ❌ خطأ
$stmt->bind_param("sss", $val1, $val2, $val3);

// ❌ خطأ
$id = $connect->insert_id;

// ❌ خطأ
$connect->rollback();
```

---

## 🔍 الأخطاء الشائعة وحلولها

### 1. `Call to undefined method PDO::begin_transaction()`

**الخطأ:**
```php
$connect->begin_transaction(); // ❌
```

**الحل:**
```php
$connect->beginTransaction(); // ✅
```

---

### 2. `Call to undefined method PDOStatement::bind_param()`

**الخطأ:**
```php
$stmt->bind_param("sss", $a, $b, $c); // ❌
```

**الحل:**
```php
$stmt->execute([$a, $b, $c]); // ✅
```

---

### 3. `Undefined property: PDO::$insert_id`

**الخطأ:**
```php
$id = $connect->insert_id; // ❌
```

**الحل:**
```php
$id = $connect->lastInsertId(); // ✅
```

---

### 4. `Call to undefined method PDO::rollback()`

**الخطأ:**
```php
$connect->rollback(); // ❌ (حرف صغير)
```

**الحل:**
```php
$connect->rollBack(); // ✅ (B كبيرة)
```

---

## 📝 قواعد مهمة

### 1. استخدم معاملات PDO دائماً

```php
✅ $stmt->execute([$val1, $val2]);
❌ $stmt->execute("$val1", "$val2");
```

### 2. تحقق من المعاملة قبل الرجوع

```php
✅ if ($connect->inTransaction()) {
    $connect->rollBack();
}

❌ $connect->rollBack(); // قد يسبب خطأ
```

### 3. استخدم try-catch دائماً

```php
✅ try {
    $connect->beginTransaction();
    // ... code
    $connect->commit();
} catch (Exception $e) {
    $connect->rollBack();
}

❌ $connect->beginTransaction();
   // ... code
   $connect->commit();
```

---

## 🎯 أمثلة من المشروع

### حفظ سند صرف:

```php
try {
    $connect->beginTransaction();
    
    $stmt = $connect->prepare("
        INSERT INTO receipts_voucher (...) VALUES (?, ?, ?)
    ");
    
    $stmt->execute([
        $bill_number,
        $amount,
        $user_code
    ]);
    
    $voucher_id = $connect->lastInsertId();
    
    $connect->commit();
    
    echo json_encode([
        'success' => true,
        'voucher_id' => $voucher_id
    ]);
    
} catch (Exception $e) {
    if ($connect->inTransaction()) {
        $connect->rollBack();
    }
    
    echo json_encode([
        'success' => false,
        'message' => $e->getMessage()
    ]);
}
```

---

## 🔗 ملفات المشروع التي تستخدم PDO

- ✅ `save_disbursement_voucher.php`
- ✅ `save_receipt_documents.php`
- ✅ `upload_receipt_document.php`
- ✅ `get_contract_details.php`
- ✅ `get_office_parties.php`
- ✅ `manage_entities.php`

---

## 📚 موارد إضافية

- [PHP PDO Documentation](https://www.php.net/manual/en/book.pdo.php)
- [PDO Transactions](https://www.php.net/manual/en/pdo.transactions.php)
- [Prepared Statements](https://www.php.net/manual/en/pdo.prepared-statements.php)

---

## ✅ قائمة مراجعة سريعة

عند كتابة كود PDO جديد، تحقق من:

- [ ] استخدمت `beginTransaction()` وليس `begin_transaction()`
- [ ] استخدمت `execute([...])` وليس `bind_param()`
- [ ] استخدمت `lastInsertId()` وليس `insert_id`
- [ ] استخدمت `rollBack()` بحرف B كبير
- [ ] استخدمت `try-catch` للتعامل مع الأخطاء
- [ ] تحققت من المعاملة قبل `rollBack()`

---

**تاريخ التحديث:** 2025-01-26
**الإصدار:** 1.0

