ما هي الرموز المميزة التي يمكن تحديد معلماتها في البيانات المعدة من قبل شركة تنمية نفط عمان؟

StackOverflow https://stackoverflow.com/questions/1622521

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أتلاعب بالبيانات المعدة في PHP/PDO.تعمل الاستعلامات الأساسية بشكل جيد، حيث تمرر قيمة إلى جملة WHERE:

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id=:id' );
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );
$id = 5;
$stmt->execute();

ومع ذلك لدي موقف حيث أحتاج إلى تمرير المتغيرات لأسماء الحقول.يعمل هذا الاستعلام (مع الربط المناسب) بشكل جيد:

SELECT :field FROM episode WHERE id=:id

هذا واحد يعطي خطأ:

SELECT title FROM :field WHERE id=:id

هذا لا يعطي خطأ، لكنه لا يُرجع أي صفوف:

SELECT title FROM episode WHERE :field=:id

إذن، ما هي الأشياء التي يجب أن تعمل في البيانات المعدة؟هل يمكنني "تحديد معلمات" أسماء الحقول وأسماء الجداول وما إلى ذلك؟

هل كانت مفيدة؟

المحلول

وأنت لا يمكن بالحدود أسماء الجداول أسماء الأعمدة، أو أي شيء في شرط IN (بفضل c0r0ner ل <لأ href = "https://stackoverflow.com/questions/1622521/which-tokens-can-be-parameterized- / 1630288 # 1630288 "في شركة تنمية نفط عمان البيانات التي أعدت-> لافتا إلى تقييد بند IN ).

هذا السؤال ، و في وقت لاحق هذا التعليق في دليل PHP .

نصائح أخرى

@ جوش ليتزل

هذا التفكير مقيد للغاية (وهو في رأيي مجرد ذريعة لكونك كسولًا جدًا في تنفيذ حل قوي)، خاصة بالنسبة للهياكل الشجرية الديناميكية المعبر عنها في قاعدة البيانات.

خذ بعين الاعتبار المثال التالي:

يحتوي مشروعي على بنية منطقية:

يتم التعبير عن التسلسل الهرمي للشركة من حيث الكيانات.يمكن التعامل مع كل كيان في الحالة العامة لكونه عضوًا في التسلسل الهرمي أو كعضو في مستوى معين من التسلسل الهرمي.يتم تعريف التسلسل الهرمي نفسه في جدول على أنه فرع شجرة واحد على النحو التالي:

entity_structure (
   id
   name
   parent_entity_structure_id
);

ويتم التعبير عن الكيانات نفسها على النحو التالي:

entities (
   id
   name
   entity_structure_id
   parent_id
);

لسهولة الاستخدام، قمت ببناء خوارزمية تقوم بإنشاء منظر مسطح للشجرة.والمثال الملموس التالي يوضح ما أعنيه:

SELECT * FROM entity_structure;

id      | name               | entity_structure_parent_id
-----------------------------------------------------------
1       | Company            | null    (special one that always exists)
2       | Division           | 1
3       | Area               | 2
4       | Store              | 3

سيؤدي هذا إلى إنتاج التمثيل المسطح التالي:

entity_tree (
   entity_id
   division_id
   area_id
   store_id
)

الكيانات الموجودة على مستوى القسم سيكون لها Division_id، وarea_id، وstore_id كـ NULL، وArea_area_id، وstore_id كـ NULL، وما إلى ذلك.

والشيء الجميل في هذا هو أنه يتيح لك الاستعلام عن جميع أبناء القسمة باستخدام عبارة مشابهة لما يلي:

SELECT * FROM entity_tree WHERE division_id = :division_id;

ولكن هذا يفترض أنني أعرف مستوى هيكل الكيان الذي أستفسر عنه.سيكون من الجميل أن تفعل:

SELECT * FROM entity_tree WHERE :structure = :entity_id;

أعلم أنه ليس من الصعب معرفة مستوى بنية كيان واحد، ولكن افترض أنني أقوم بالمرور عبر مجموعة من الكيانات التي قد لا تكون جميعها على نفس المستوى.كما هو الحال الآن، يجب علي إنشاء استعلام منفصل لكل مستوى من مستويات التسلسل الهرمي، ولكن إذا كان بإمكاني تحديد معلمات الحقول، فيمكنني القيام بما يلي:

$children = array();
$stmt = $pdo->prepare('SELECT entity_id FROM entity_tree WHERE :structure = :entityId');
foreach ($entities AS $entity) {
   $stmt->execute(array(
      ':structure' = $entity->getEntityStructureId(),
      ':entityId'  = $entity->getId()
   ));

   $children[$entity->getId()] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}

مما أدى إلى كود أنظف وبيان واحد فقط مُجهز.

لا يستخدم المثال بأكمله أي إدخال من المستخدم على الإطلاق.

مجرد شيء للنظر فيه.

وأنت لا يمكن بالحدود أي شيء داخل العبارة IN كذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top