Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Debug PDO mySql masukkan NULL ke dalam database alih-alih kosong

Bagi saya ini adalah bug (n tidak dilaporkan?) dalam emulasi pernyataan yang disiapkan PDO:

  1. implementasi dari PDOStatement::execute() akhirnya memanggil pdo_parse_params() ;

  2. bahwa, pada gilirannya, mencoba mengutip/melarikan diri dari nilai berdasarkan tipe data parameter yang relevan (seperti yang ditunjukkan oleh $data_type argumen ke PDOStatement::bindValue() dan PDOStatement::bindParam() —semua parameter disediakan sebagai $input_parameters ke PDOStatement::execute() diperlakukan sebagai PDO::PARAM_STR , sebagaimana dinyatakan dalam dokumentasi fungsi itu);

  3. nilai yang diketik string diloloskan/dikutip oleh memanggil driver database yang relevan quoter() terlepas dari apakah mereka null :dalam kasus PDO_MySQL, itu mysql_handle_quoter() , yang (akhirnya) meneruskan nilai ke mysqlnd_cset_escape_quotes() atau mysql_cset_escape_slashes() , tergantung pada NO_BACKSLASH_ESCAPES server Modus SQL;

  4. 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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan sisa hari, jam, dan menit menggunakan mySql

  2. MySQL Hitung Persentase

  3. Batasan kunci asing MySQL 5.5 gagal ketika kunci asing ada

  4. Memperbaiki kesalahan PHP PEAR

  5. Fungsi MySQL CRC32() – Contoh