طاولات تعداد المستخدمة في استعلام MySQL؟
سؤال
هل هناك أي طريقة لتعداد الطاولات المستخدمة في استعلام MySQL؟
دعنا نقول أن لدي استعلام:
SELECT * FROM db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC
وأريد في صفيف العودة:
$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);
المحلول
الحل الذي تم وضع علامة عليه جيدا سيعود فقط جداول النتيجة. ولكن إذا قمت بذلك الاستعلام التالي، فسوف تفشل:
SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id
إرادة عودة فقط المستخدمين وليس القطط والكلاب الجداول.
أفضل حل هو العثور على محلل جيد، وهو حل آخر يستخدم Regex وشرح الاستعلام (مزيد من المعلومات في الرابط التالي):
احصل على جداول MySQL في استعلام
لكنني أعتقد أن حل جيد آخر هو قائمة جميع الطاولات والبحث فيها داخل الاستعلام, ، يمكنك ذاكرة التخزين المؤقت قائمة الجداول.
تعديل: عند البحث عن الجداول، استخدم أفضل من Preg مثل:
// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
// found
إذا لم يكن الأمر كذلك، فيمكنه إرجاع الإيجابيات الخاطئة مع مثال "Table_name2"، "Table_name3" ... سيتم العثور على Table_name مرتين.
نصائح أخرى
نعم، يمكنك الحصول على معلومات حول الجداول والأعمدة التي هي جزء من نتيجة الاستعلام. هذا يسمي النتيجة مجموعة البيانات الوصفية.
حل PHP الوحيد ل MySQL Stuing Set Metadata هو استخدام ملحق MySQLI و mysqli_stmt::result_metadata()
وظيفة.
$stmt = $mysqli->prepare("SELECT * FROM db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC");
$meta = $stmt->result_metadata();
$field1 = $meta->fetch_field();
echo "Table for field " . $field1->name . " is " . $field1->table . "\n";
سيكون عليك بناء مجموعة من الجداول المميزة المستخدمة في الاستعلام بنفسك، عن طريق الحلقات عبر الحقول.
اعتمادا على ما تستخدمه له، يمكن لشرح MySQL أن يفعل الخدعة لك: