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_type
argumen kePDOStatement::bindValue()
danPDOStatement::bindParam()
—semua parameter disediakan sebagai$input_parameters
kePDOStatement::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_ESCAPES
server Modus SQL; -
diberi
null
argumen, 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);