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

ColdFusion Memparameterisasi Query

Mengabaikan pendekatan yang benar untuk sesaat, alasan yang terjadi adalah Anda menggunakan cfsqltype yang salah untuk parameter. Jadi Anda sebenarnya mengirim nilai yang berbeda ke database (dan akibatnya melakukan perbandingan yang berbeda) dari yang Anda pikirkan. Akibatnya, kueri gagal menemukan rekaman yang cocok. Itulah sebabnya bagan Anda kosong.

Dengan menggunakan cf_sql_timestamp anda mengubah "nilai" menjadi objek tanggal/waktu penuh. Namun, TAHUN() hanya mengembalikan nomor empat digit. Jadi Anda membandingkan apel dan jeruk. Secara konseptual, kueri Anda sebenarnya melakukan ini:

  WHERE  2014 = {ts '2009-02-13 23:31:30'}

Alasan mengapa itu tidak menimbulkan kesalahan adalah bahwa nilai tanggal/waktu disimpan sebagai angka secara internal. Jadi Anda sebenarnya membandingkan angka kecil (yaitu tahun) dengan angka yang sangat besar (yaitu tanggal/waktu). Jelas nilai tanggal akan jauh lebih besar, sehingga hampir tidak akan pernah cocok dengan angka tahun. Sekali lagi, secara konseptual kueri Anda melakukan ini:

 WHERE 2014 = 1234567890

Karena cfsqltype adalah opsional, banyak orang menganggapnya tidak terlalu penting - tetapi memang demikian.

  • Validasi: Selain manfaat lainnya, cfqueryparam memvalidasi "nilai" yang diberikan, berdasarkan cfsqltype (tanggal, tanggal dan waktu, nomor, dan sebagainya). Ini terjadi sebelum sql pernah dikirim ke database. Jadi jika inputnya tidak valid, Anda tidak menyia-nyiakan panggilan database. Jika Anda menghilangkan cfsqltype, atau hanya menggunakan string default, maka Anda kehilangan validasi ekstra itu.

  • Akurasi Memilih cfsqltype yang tepat memastikan Anda mengirim nilai yang benar ke database. Seperti yang ditunjukkan di atas, menggunakan tipe yang salah dapat menyebabkan CF mengirim nilai yang salah ke database.

    cfsqltype juga memastikan nilai dikirimkan ke database dalam format yang tidak ambigu, database akan menafsirkan seperti yang Anda harapkan. Secara teknis Anda bisa mengirim semuanya ke database sebuah string. Namun, hal itu memaksa database untuk melakukan konversi implisit (biasanya tidak diinginkan).

    Dengan konversi implisit, interpretasi string diserahkan sepenuhnya ke database - dan mungkin tidak selalu muncul dengan jawaban yang Anda harapkan. Mengirimkan tanggal sebagai string, bukan objek tanggal, adalah contoh utama dari itu. Bagaimana database saat ini menafsirkan string tanggal seperti "05/04/2014"? Seperti 5 April atau 4 Mei? Tergantung. Ubah database atau pengaturan database dan hasilnya mungkin sama sekali berbeda.

Satu-satunya cara untuk memastikan hasil yang konsisten adalah dengan menentukan cfsqltype yang sesuai. Itu harus cocok dengan tipe data dari kolom/fungsi perbandingan, atau setidaknya tipe yang setara. Dalam kasus YEAR() , ia mengembalikan angka empat digit. Jadi Anda harus menggunakan cf_sql_integer , seperti Adrian menyebutkan komentarnya . Hal yang sama berlaku untuk BULAN() perbandingan.

 WHERE Year(ColumnName) = <cfqueryparam value="2014" cfsqltye="CF_SQL_INTEGER">
 AND   Month(ColumnName) = <cfqueryparam value="11" cfsqltye="CF_SQL_INTEGER"> 

Sekarang setelah mengatakan semua itu, Saran Dan adalah cara yang lebih baik untuk melakukan perbandingan tanggal. Paradigma itu lebih ramah indeks dan berfungsi terlepas dari apakah kolom target Anda berisi tanggal (hanya) atau tanggal dan waktu. Perhatikan penggunaan cf_sql_date dalam teladannya.

  • cf_sql_timestamp - mengirimkan tanggal dan waktu
  • cf_sql_date - mengirim tanggal saja. nilai waktu terpotong


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Haruskah saya menggunakan pernyataan yang disiapkan untuk MySQL di PHP PERFORMANCE-WISE?

  2. Cara menonaktifkan opsi only_full_group_by di Laravel

  3. MySQL CONCAT (string, longtext) menghasilkan string hex

  4. mysql_real_escape_string dan array_map mengembalikan string kosong?

  5. Tidak dapat memasukkan array ke dalam database