Files
intaleq_v3_pure_php/ride/places_syria/get.php
2026-04-28 13:04:27 +03:00

100 lines
3.5 KiB
PHP
Executable File

<?php
/**
* Get Places - Optimized with FULLTEXT and SPATIAL indexes.
* يستخدم الفهارس الذكية للبحث السريع جداً.
* * يتطلب:
* - connect.php: $con (PDO object) + filterRequest() + jsonSuccess() / jsonError()
* - جدول 'places11' مهيأ بالفهارس (FULLTEXT & SPATIAL)
*/
require_once __DIR__ . '/../../connect.php';
// اسم الجدول المستهدف
$tableName = 'palces11';
// تأكد من أن PDO يرمي استثناءات عند حدوث أخطاء
try {
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
// تجاهل الخطأ إذا كان قد تم تعيينه بالفعل
}
// 1. استقبال المدخلات باستخدام دالة filterRequest الخاصة بك
$query = trim((string) filterRequest("query"));
$latMin = filterRequest("lat_min");
$latMax = filterRequest("lat_max");
$lngMin = filterRequest("lng_min");
$lngMax = filterRequest("lng_max");
// 2. التحقق من المدخلات
if ($query === "" || $latMin === null || $latMax === null || $lngMin === null || $lngMax === null) {
jsonError("Missing required parameters: query, lat_min, lat_max, lng_min, lng_max");
exit;
}
// تحويل الإحداثيات إلى أرقام عشرية
$latMin = (float) $latMin;
$latMax = (float) $latMax;
$lngMin = (float) $lngMin;
$lngMax = (float) $lngMax;
// 3. بناء الاستعلام الذكي (الجزء المحدّث)
// تحضير كلمة البحث لوضعها في MATCH() AGAINST()
// نضيف '*' لكل كلمة للبحث عن الكلمات التي تبدأ بهذا الجزء
$search_terms = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY);
$search_boolean = '';
foreach ($search_terms as $term) {
$search_boolean .= '+' . $term . '* '; // '+' تعني أن الكلمة يجب أن تكون موجودة
}
$search_boolean = trim($search_boolean);
// بناء المضلع الجغرافي (Bounding Box Polygon) للفهرس المكاني
$bbox_wkt = sprintf(
'POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',
$lngMin, $latMin,
$lngMax, $latMin,
$lngMax, $latMax,
$lngMin, $latMax,
$lngMin, $latMin
);
// الاستعلام النهائي الذي يجمع بين البحث النصي والجغرافي
$sql = "
SELECT
id, latitude, longitude, name, name_ar, name_en, address, category, created_at
FROM
`{$tableName}`
WHERE
-- الشرط الأول: البحث بالنص الكامل (سريع جداً)
MATCH(name, name_ar, name_en, address, category) AGAINST(? IN BOOLEAN MODE)
-- الشرط الثاني: البحث الجغرافي (سريع جداً)
AND ST_CONTAINS(ST_GEOMFROMTEXT(?), location)
LIMIT 50; -- حد أعلى للنتائج الأولية
";
// 4. تنفيذ الاستعلام وإرجاع النتيجة
try {
$stmt = $con->prepare($sql);
// ربط المتغيرات بالاستعلام بالترتيب
$stmt->execute([$search_boolean, $bbox_wkt]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
jsonSuccess($rows);
} catch (PDOException $e) {
// يمكنك استخدام هذا السطر أثناء التطوير لعرض الخطأ الفعلي
// jsonError('DB Error: ' . $e->getMessage()); exit;
// تسجيل الخطأ في سجلات الخادم للرجوع إليه لاحقاً
error_log("search_places_optimized.php error: " . $e->getMessage());
jsonError("Database query error occurred");
}
?>