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

Golang ORDER BY masalah dengan MySql

Placeholder ('?' ) hanya dapat digunakan untuk menyisipkan nilai lolos dinamis untuk parameter filter (mis. di WHERE bagian), di mana nilai data akan muncul, bukan untuk kata kunci SQL, pengidentifikasi, dll. Anda tidak dapat menggunakannya untuk menentukan ORDER BY secara dinamis ATAU GROUP BY nilai.

Anda masih dapat melakukannya, misalnya Anda dapat menggunakan fmt.Sprintf() untuk merakit teks kueri dinamis seperti ini:

ordCol := "title"

qtext := fmt.Sprintf("SELECT * FROM Apps ORDER BY %s DESC", ordCol)
rows, err := db.Query(qtext)

Hal-hal yang perlu diingat:

Melakukannya, Anda harus mempertahankan secara manual vs injeksi SQL, mis. jika nilai nama kolom berasal dari pengguna, Anda tidak dapat menerima nilai apa pun dan hanya memasukkannya langsung ke kueri jika tidak, pengguna akan dapat melakukan segala macam hal buruk. Secara sepele, Anda hanya boleh menerima huruf alfabet Inggris + angka + garis bawah ('_' ).

Tanpa mencoba menyediakan fungsi checker atau escaping yang lengkap dan lengkap, Anda dapat menggunakan regexp sederhana ini yang hanya menerima huruf, angka, dan '_' dalam bahasa Inggris :

valid := regexp.MustCompile("^[A-Za-z0-9_]+$")
if !valid.MatchString(ordCol) {
    // invalid column name, do not proceed in order to prevent SQL injection
}

Contoh (coba di Go Playground ):

fmt.Println(valid.MatchString("title"))         // true
fmt.Println(valid.MatchString("another_col_2")) // true
fmt.Println(valid.MatchString("it's a trap!"))  // false
fmt.Println(valid.MatchString("(trap)"))        // false
fmt.Println(valid.MatchString("also*trap"))     // 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. Mysql mengembalikan hasil bigint yang salah satu per satu, kesalahan yang sangat aneh

  2. WooCommerce:Menemukan produk di database

  3. Bagaimana cara menghubungkan mySQL di proyek Android saya?

  4. Pola koneksi database tunggal PHP

  5. Fungsi MySQL CHAR() dan Output UTF8?