سؤال
هذا هو قليلا من واحد غريب وأنا يمكن أن يكون جيدا الترميز هذا خاطئ تماما - وبالتالي لماذا ضربت نفس الخطأ مرتين في يومين ، في أنحاء مختلفة تماما من برنامج نصي.مدونة أنا باستخدام أدناه:
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 )
, هذا يعمل بشكل جيد تماما.يبدو أنه كلما متعددة القيود مر أنه توقف عن العمل.
نصائح أخرى
كما ذكر باستخدام 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
يتم تعيين ولكنها لم تستخدم.