سؤال

هذا هو قليلا من واحد غريب وأنا يمكن أن يكون جيدا الترميز هذا خاطئ تماما - وبالتالي لماذا ضربت نفس الخطأ مرتين في يومين ، في أنحاء مختلفة تماما من برنامج نصي.مدونة أنا باستخدام أدناه:


    public function findAll( $constraints = array() ) {

        // Select all records
        $SQL = 'SELECT * FROM ' . $this->tableName;

        // See if there's any constraints
        if( count( $constraints ) > 0 ) {
            $SQL .= ' WHERE ';

            foreach( $constraints as $field => $value ) {
                $SQL .= $field . ' = :' . $field . ' AND ';
            }

        }

        // Remove the final AND and prepare the statement
        $SQL = substr( $SQL, 0, -5 );       
        $PDOStatement = $this->PDO->prepare( $SQL );

        // Loop through constraints and bind parameters
        foreach( $constraints as $field => $value ) {
            print 'Binding ' . $field . ' to ' . $value . ' 
'; $PDOStatement->bindParam( $field, $value ); } $PDOStatement->execute(); var_dump($PDOStatement); while ( $results = $PDOStatement->fetch( PDO::FETCH_ASSOC ) ) { var_dump($results); } }

انا جديد على استخدام شركة تنمية نفط عمان ، ولكن أساسا أنا محاولة تمرير مجموعة من القيود على سبيل المثال

array( 'active' => 1, 'name' => 'James' )
و إرجاع كافة الصفوف من الجدول
WHERE active = 1 AND name = 'James'

إذا كنت تستخدم هذه المجموعة SQL تنفيذها من أول

var_dump( )
هو
SELECT * FROM {table} WHERE active = :active AND name = 'James'
- تماما كما كنت تتوقع.ملزمة المعلمات يطبع 'ملزمة النشطة إلى 1' و 'ملزمة اسم" جيمس " - بالضبط كما هو متوقع.الصفوف موجودة في قاعدة البيانات, و بعد الثاني
var_dump()
الدعوة إلى نتائج $النواتج شيء - أيلا الصفوف التي يتم إرجاعها.

إذا كنت تمرير صفيف واحد القيد ، على سبيل المثال

array( 'active' => 1 )
, هذا يعمل بشكل جيد تماما.يبدو أنه كلما متعددة القيود مر أنه توقف عن العمل.

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

المحلول

ذلك لأن bindParam يعمل عن طريق الربط إلى متغير ، ويتم إعادة استخدام متغير ($value) قيم متعددة.حاول مع bindValue بدلا من ذلك.

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

نصائح أخرى

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

استبدال السطر التالي من الموقع الأصلي:

$PDOStatement->bindParam( $field, $value );

...مع هذا:

$PDOStatement->bindParam( $field, $constraints[$field] );

بدلا من الملزمة $value, استخدام $array_name[$array_key].يعمل هذا هو لأن أنت الآن ملزمة فريدة من نوعها متغير بدلا من واحد أن يحصل على استخدامها على تمرير كل حلقة.

المتغير $field تستخدم العنصر النائب على ما يبدو لا تحتاج إلى أن تكون فريدة من نوعها متغير, ومع ذلك.ليس لدي بحث شامل هذا بعد لكن متغير استخدام عنصر نائب يظهر تحليل فورا (بدلا من تعيين مرجع متغير) حتى عندما bindParam يستخدم.

كما أنك لن تحتاج إلى الوصول إلى $value مباشرة, يمكنك أيضا استبدال هذا:

foreach( $constraints as $field => $value ) {

...مع هذا:

foreach (array_keys($constraints) as $field) {

هذا هو اختياري ، كما أنها سوف تعمل بشكل جيد من دون هذا التغيير.يبدو نظافة في رأيي على الرغم لأنه قد تحصل على الخلط في وقت لاحق لماذا $value يتم تعيين ولكنها لم تستخدم.

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