سؤال

ربما لدي مشكلة بسيطة جدًا والتي لا يمكنني العثور على إجابة مرضية (مشاهدة ذاتيًا) لها في دليل Zend Framework أو في أي مكان آخر...

هناك العديد من الطرق التي يمكنني من خلالها تسليم متغيرات php الخاصة بي إلى استعلامات SQL الخاصة بي لدرجة أنني فقدت النظرة العامة وربما أفتقر إلى بعض الفهم حول الاقتباس بشكل عام.

البيانات المعدة

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

أدرك أنه مع هذا الحل لا أحتاج إلى اقتباس أي شيء لأن قاعدة البيانات تتعامل مع هذا الأمر نيابةً عني.

الاستعلام عن كائنات Zend_Db_Table و_Row عبر واجهة برمجة التطبيقات

$users = مستخدمون جدد();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

أسئلة

أفهم أن أ) ليس جيدًا لأنه لم يتم اقتباسه على الإطلاق.ولكن ماذا عن الإصدارات الأخرى، ما هو الأفضل؟هل يتم التعامل مع ج) كبيان ويتم اقتباسه تلقائيًا أم هل أحتاج إلى استخدام د) عندما أستخدم ؟معرف؟

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

المحلول

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

إذا قمت بتمرير سلسلة إلى fetchRow() طريقة فئة فرعية من Zend_Db_Table_Abstract (الذي تفعله)، سيتم التعامل معه على أنه where جزء من أ Zend_Db_Table_Select مثال.

وبعبارة أخرى، داخليا، Zend_Db_Table يفعل هذا:

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

لذا...:

a) $users->fetchRow('userID = ' . $userID);  

لم يتم اقتباسه على الإطلاق.

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

يتم نقله يدويًا كعدد صحيح.

c) $users->fetchRow('userID = ?', $userID);  

يتم اقتباسه تلقائيًا بواسطة Zend_Db_Adapter_*::quoteInto()

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

يتم في الواقع اقتباس مزدوج، مرة بواسطتك، ومرة ​​عبر الاقتباس التلقائي.

وفيما يتعلق بكلمة "الأفضل"، فإنني أوصي بالخيار جيم.سيتم استدعاء الإطار تلقائيًا quoteInto على القيمة المعلمة.

تذكر: يمكنك دائمًا تمرير مثيل لـ Zend_Db_Table_Select أو Zend_Db_Select إلى fetchRow() طريقة بدلا من ذلك...

مرة أخرى، في فئة فرعية من Zend_Db_Table_Abstract, ، سيبدو الأمر كالتالي:

$this->fetchRow($this->select()->where('userID = ?', $userID));

الميزة الإضافية للقيام بذلك هي أنه يمكنك إنشاء استعلامات أكثر تعقيدًا، حيث يمكنك التحكم في أكثر بكثير من مجرد الاستعلامات WHERE جملة من استعلام SQL.من الناحية النظرية، يمكنك بسهولة القيام بما يلي:

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

ملحوظة: إذا مرت مثيل Zend_Db_Select, ، ال fetchRow() الطريقة تعمل تماما مثل fetchAll() يستثني فإنه يستدعي داخليا limit() طريقة تحديد الكائن، مع معلمة 1.

نصائح أخرى

اعتدت على

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top