سؤال

يرجى قراءة السؤال بعناية. ليس من المعتاد سخيف "رمزتي لا تعمل !!!" سؤال.

عندما أقوم بتشغيل هذا الرمز مع الخطأ المقصود

try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

أحصل على رسالة الخطأ هذه

لديك خطأ في بناء جملة SQL الخاص بك ... بالقرب من "Inn ('i ' m '،' d 'artagnan') 'في السطر 1

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

  1. من أين تحصل على مثل هذا التمثيل المألوف للسلسلة - مقتبس والهروب؟ هل يتم صنعه بشكل خاص للإبلاغ عن خطأ أم أنه جزء من الاستعلام الفعلي؟
  2. كيف تعمل بشكل حقيقي؟ هل يحل محل العنصر النائب بالبيانات أم لا؟
  3. هل هناك طريقة للحصول على استعلام كامل ، وليس القليل منه فقط ، لأغراض تصحيح الأخطاء؟

تحديث

mysqli هل هو كما هو متوقع: يلقي خطأ يقول near 'INN(?,?)'

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

المحلول

حاول إضافة

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

;)

نصائح أخرى

لست متأكدًا من كل التفاصيل ، لكنني سأحاول الإجابة.

  1. يحدث الاقتباس على جانب قاعدة البيانات. تهرب قاعدة البيانات وتعقيم جميع القيم (انظر الرصاصة 2) التي تستقبلها بحيث يتم تفسيرها بشكل صحيح. في اللحظة التي يتم فيها طرح الخطأ ، تقوم قاعدة البيانات (في هذه الحالة MySQL) بطباعة الاستعلام الذي حاول تشغيله. لن يكون هذا مفيدًا جدًا إذا أظهر الجزء المعد.

  2. لا ، لا. في وقت الإعداد يتم تجميع الاستعلام على جانب الخادم. عند تنفيذ استعلام بالقيم ، يتم إرسال القيم فقط. هذا هو نفسه إلى حد كبير مثل استدعاء إعداد وتنفيذ قاعدة البيانات مباشرة.

  3. هذا يعتمد على قاعدة البيانات التي تستخدمها. على سبيل المثال ، يمكن لـ MySQL تسجيل جميع الاستعلامات إلى ملف السجل (تحقق من إعدادات my.cnf لذلك). ولكن يمكنك أيضا استخدام debugdumpparams () على جانب PHP.

آمل أن يكون هذا مفيدًا بعض الشيء.

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