تم استدعاء wpdb::prepare بشكل غير صحيح
-
28-09-2020 - |
سؤال
لدي هذا الرمز لإزالة المشاركات اليتيمة بعد حذف نوع المنشور المخصص.
إنه يعمل، لكن هذا الكود...
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
)
);
...يرمي هذا الخطأ:
إشعار PHP:تم استدعاء wpdb::prepare بشكل غير صحيح.يجب أن تحتوي وسيطة الاستعلام الخاصة بـ wpdb::prepare() على عنصر نائب.
إذن بعد القراءة التفسير على make.wordpress.org بواسطة أندرو ناسين، أنا (نوعًا ما) أجمع أن ... حسنًا..أفتقد الحجة الثانية.
ثم بعد القراءة هذا المنشور المكدس, ، أنا أتساءل عما إذا كنت بحاجة إلى prepare()
وظيفة. هناك أي متغيرات تحمل قيم غير معروفة؟أنا لست واضحا في هذا الشأن.
...ماذا ينقصني؟
تحديث:يعمل هذا الرمز أيضًا، ولكن بدون الإعداد () أتساءل عما إذا كان آمنًا.
global $wpdb;
$wpdb->query(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
);
يرجى تقديم النصيحة.
المحلول
ينصح دائما باستخدامه $wpdb->prepare
عندما تأخذ مدخلات من المستخدم.سيساعد هذا في حماية الاستعلامات من حقن SQL.لمزيد من التفاصيل، تحقق من الدستور الغذائي
عندما تستخدم $wpdb->prepare
, ، يجب عليك تمرير المتغيرات إلى الاستعلام.في حالتك، يمكنك تخطي استخدام $wpdb->prepare
لأنك تستخدم قيمة مشفرة بشكل ثابت.ولكن إذا كان لديك نفس القيمة من حيث المتغير، فأنت بحاجة إلى تعديلها على النحو التالي
$post_type = 'attorneys';
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type=%s",
$post_type
)
);