Update: 2026-08-08 14:57:58

This commit is contained in:
Hamza-Ayed
2026-08-08 14:57:59 +03:00
parent c659af67dc
commit 875ce763bd
3 changed files with 155 additions and 66 deletions
+66
View File
@@ -0,0 +1,66 @@
<?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;
}
}