Bagi saya ini adalah bug (n tidak dilaporkan?) dalam emulasi pernyataan yang disiapkan PDO:
-
implementasi dari
PDOStatement::execute()akhirnya memanggilpdo_parse_params(); -
bahwa, pada gilirannya, mencoba mengutip/melarikan diri dari nilai berdasarkan tipe data parameter yang relevan (seperti yang ditunjukkan oleh
$data_typeargumen kePDOStatement::bindValue()danPDOStatement::bindParam()—semua parameter disediakan sebagai$input_parameterskePDOStatement::execute()diperlakukan sebagaiPDO::PARAM_STR, sebagaimana dinyatakan dalam dokumentasi fungsi itu); -
nilai yang diketik string diloloskan/dikutip oleh memanggil driver database yang relevan
quoter()terlepas dari apakah merekanull:dalam kasus PDO_MySQL, itumysql_handle_quoter(), yang (akhirnya) meneruskan nilai kemysqlnd_cset_escape_quotes()ataumysql_cset_escape_slashes(), tergantung padaNO_BACKSLASH_ESCAPESserver Modus SQL; -
diberi
nullargumen, kedua fungsi tersebut mengembalikan string kosong.
Pendapat saya adalah, sebelum mengaktifkan parameter ketik
(pada langkah 2 di atas), pdo_parse_params() harus mengatur jenisnya ke PDO::PARAM_NULL jika nilainya null . Namun, beberapa orang mungkin berpendapat bahwa ini akan mencegah penanganan khusus jenis null nilai jika sesuai, dalam hal ini huruf string (pada langkah 3 di atas) harus menangani null nilai sebelum melanjutkan dengan panggilan ke quoter() . driver metode.
Sebagai solusi sementara, menonaktifkan emulasi pernyataan yang disiapkan biasanya adalah yang terbaik:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);