67 lines
3.2 KiB
PHP
67 lines
3.2 KiB
PHP
<?php
|
||
/**
|
||
* db_primary.php — اتصال ثانٍ بالقاعدة الأساسية من خادم الدفع
|
||
* ─────────────────────────────────────────────────────────────
|
||
* خادم الدفع يتصل بقاعدته عبر `DB_PAYMENT_*` وحدها (connect.php)، لكن
|
||
* نقطتين فيه تحتاجان جدولَي `ride` و`driver_orders` وهما في القاعدة
|
||
* الأساسية. كانتا تشيران إليهما بلا تأهيل فسقطتا بـ
|
||
* `SQLSTATE[42S02]: Table 'payment.ride' doesn't exist` — وهو ما كان
|
||
* يُعطّل شاشة رصيد الكابتن بالكامل.
|
||
*
|
||
* ولماذا اتصال منفصل لا إشارة مؤهَّلة (`jorSiroDB.ride`)؟
|
||
*
|
||
* لأن التأهيل يشترط أن تكون القاعدتان على **نفس خادم MySQL**. وخريطة
|
||
* `backend/core/Database/Database.php` تُفرد لكل قاعدة host وuser وpass
|
||
* مستقلة — أي أن الفصل على خوادم مختلفة مفترضٌ في التصميم لا مستبعَد،
|
||
* وقاعدة الدفع أولى ما يُفصل. إشارة مؤهَّلة تعمل اليوم بالصدفة (حاوية
|
||
* mysql واحدة) وتسقط صامتةً يوم يُنقل الدفع. الاتصال المنفصل يقرأ
|
||
* `DB_PRIMARY_HOST_V2` فيتبع القاعدة أينما ذهبت.
|
||
*/
|
||
|
||
if (!function_exists('primaryDbConnection')) {
|
||
/**
|
||
* يعيد اتصالاً بالقاعدة الأساسية، أو null إن تعذّر — ولا يرمي أبداً.
|
||
* المستدعي يقرّر ماذا يفعل عند الغياب؛ في نقاط المحفظة القرار هو
|
||
* عرض الرصيد بأصفار في الإحصاء لا إسقاط الشاشة.
|
||
*/
|
||
function primaryDbConnection(): ?PDO
|
||
{
|
||
static $conn = null;
|
||
static $tried = false;
|
||
|
||
if ($tried) {
|
||
return $conn;
|
||
}
|
||
$tried = true;
|
||
|
||
$name = getenv('DB_PRIMARY_NAME_V2') ?: getenv('DB_PRIMARY_NAME');
|
||
$host = getenv('DB_PRIMARY_HOST_V2') ?: getenv('DB_PRIMARY_HOST') ?: 'mysql';
|
||
$user = getenv('DB_PRIMARY_USER_V2') ?: getenv('DB_PRIMARY_USER');
|
||
$pass = getenv('DB_PRIMARY_PASS_V2') ?: getenv('DB_PRIMARY_PASS');
|
||
|
||
if (empty($name) || empty($user)) {
|
||
error_log('[db_primary] إعداد القاعدة الأساسية ناقص — تعذّر الاتصال.');
|
||
return null;
|
||
}
|
||
|
||
try {
|
||
$conn = new PDO(
|
||
"mysql:host=$host;dbname=$name;charset=utf8mb4",
|
||
$user,
|
||
$pass,
|
||
[
|
||
PDO::ATTR_EMULATE_PREPARES => false,
|
||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||
PDO::ATTR_TIMEOUT => 5,
|
||
]
|
||
);
|
||
} catch (PDOException $e) {
|
||
error_log('[db_primary] تعذّر الاتصال بالقاعدة الأساسية: ' . $e->getMessage());
|
||
$conn = null;
|
||
}
|
||
|
||
return $conn;
|
||
}
|
||
}
|