Saya mencoba mempelajari cara terbaik untuk menulis pertanyaan. Saya juga mengerti pentingnya konsisten. Sampai sekarang, saya secara acak menggunakan tanda kutip tunggal, tanda kutip ganda, dan backticks tanpa pemikiran nyata.
Contoh:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Juga, dalam contoh di atas, pertimbangkan bahwa table
, col1
, val1
, dll mungkin variabel.
Apa standar untuk ini? Apa yang kamu kerjakan?
Saya sudah membaca jawaban untuk pertanyaan serupa di sini selama sekitar 20 menit, tetapi sepertinya tidak ada jawaban pasti untuk pertanyaan ini.
"tablename"
, dan tanda kutip tunggal untuk literal, misalnya'this is a some text'
. Back-ticks tidak pernah digunakan dalam SQL standar. (Jika Anda perlu menyertakan tanda kutip ganda dalam pengenal, ketikkan dua kali sebagai"odd""tablename"
. Demikian pula, tanda kutip tunggal tunggal dalam literal, misalnya'Conan O''Brien'
.)Jawaban:
Backticks harus digunakan untuk pengidentifikasi tabel dan kolom, tetapi hanya diperlukan ketika pengidentifikasi adalah kata kunci yang disediakan oleh MySQL , atau ketika pengidentifikasi berisi karakter spasi putih atau karakter di luar rangkaian terbatas (lihat di bawah) Sering disarankan untuk menghindari menggunakan kata kunci yang dipesan. sebagai pengidentifikasi kolom atau tabel bila memungkinkan, hindari masalah penawaran.
Kutipan tunggal harus digunakan untuk nilai string seperti dalam
VALUES()
daftar. Kutipan ganda didukung oleh MySQL untuk nilai string juga, tetapi tanda kutip tunggal lebih banyak diterima oleh RDBMS lain, jadi itu kebiasaan yang baik untuk menggunakan tanda kutip tunggal, bukan ganda.MySQL juga mengharapkan
DATE
danDATETIME
nilai-nilai literal dikutip secara tunggal sebagai string seperti'2001-01-01 00:00:00'
. Lihat dokumentasi Literal Tanggal dan Waktu untuk detail lebih lanjut, khususnya alternatif untuk menggunakan tanda hubung-
sebagai pembatas segmen dalam string tanggal.Jadi, dengan menggunakan contoh Anda, saya akan mengutip dua kali string PHP dan menggunakan tanda kutip tunggal pada nilai-nilai
'val1', 'val2'
.NULL
adalah kata kunci MySQL, dan nilai khusus (bukan), dan karenanya tidak dikutip.Tak satu pun dari pengidentifikasi tabel atau kolom ini adalah kata-kata yang dicadangkan atau menggunakan karakter yang memerlukan penawaran, tetapi saya tetap mengutipnya dengan backticks (lebih lanjut tentang ini nanti ...).
Fungsi asli RDBMS (misalnya,
NOW()
dalam MySQL) tidak boleh dikutip, meskipun argumen mereka tunduk pada string yang sama atau aturan mengutip pengidentifikasi yang telah disebutkan.Interpolasi variabel
Pola kutip untuk variabel tidak berubah, meskipun jika Anda bermaksud untuk menginterpolasi variabel secara langsung dalam string, itu harus dikutip dua kali dalam PHP. Pastikan Anda telah benar-benar lolos dari variabel untuk digunakan dalam SQL. ( Disarankan menggunakan API yang mendukung pernyataan yang disiapkan, sebagai perlindungan terhadap injeksi SQL ).
Pernyataan yang disiapkan
Saat bekerja dengan pernyataan yang disiapkan, bacalah dokumentasi untuk menentukan apakah placeholder pernyataan harus dikutip atau tidak. API paling populer yang tersedia di PHP, PDO dan MySQLi, mengharapkan placeholder yang tidak dikutip, seperti halnya API pernyataan paling siap dalam bahasa lain:
Karakter yang memerlukan backtick mengutip dalam pengidentifikasi:
Menurut dokumentasi MySQL , Anda tidak perlu mengutip (backtick) pengidentifikasi menggunakan set karakter berikut:
Anda dapat menggunakan karakter di luar yang ditetapkan sebagai pengidentifikasi tabel atau kolom, termasuk spasi putih misalnya, tetapi kemudian Anda harus mengutip (backtick) mereka.
sumber
Ada dua jenis kutipan di MySQL:
'
untuk melampirkan string string`
untuk melampirkan pengidentifikasi seperti nama tabel dan kolomDan kemudian ada
"
kasus khusus. Ini dapat digunakan untuk salah satu tujuan yang disebutkan di atas pada suatu waktu tergantung pada server MySQLsql_mode
:"
karakter dapat digunakan untuk menyertakan string literal seperti'
ANSI_QUOTES
mode"
karakter dapat digunakan untuk menyertakan pengidentifikasi seperti`
Kueri berikut akan menghasilkan hasil yang berbeda (atau kesalahan) tergantung pada mode SQL:
ANSI_QUOTES dinonaktifkan
Kueri akan memilih string literal di
"column"
mana kolomfoo
sama dengan string"bar"
ANSI_QUOTES diaktifkan
Kueri akan memilih kolom di
column
mana kolomfoo
sama dengan kolombar
Kapan harus menggunakan apa
"
sehingga kode Anda menjadi independen dari mode SQLsumber
(Ada jawaban yang bagus di atas mengenai sifat SQL dari pertanyaan Anda, tetapi ini mungkin juga relevan jika Anda baru mengenal PHP.)
Mungkin penting untuk menyebutkan bahwa PHP menangani string kutipan tunggal dan ganda secara berbeda ...
String yang dikutip tunggal adalah 'literal' dan cukup banyak string WYSIWYG. String yang dikutip ganda diinterpretasikan oleh PHP untuk kemungkinan penggantian-variabel (backtick dalam PHP bukan string yang tepat; mereka mengeksekusi sebuah perintah di shell dan mengembalikan hasilnya).
Contoh:
sumber
Backticks umumnya digunakan untuk menunjukkan
identifier
dan juga aman dari kecelakaan menggunakan Kata Kunci Cadangan .Sebagai contoh:
Di sini backticks akan membantu server untuk memahami bahwa
database
sebenarnya nama database, bukan pengenal database.Hal yang sama dapat dilakukan untuk nama tabel dan nama bidang. Ini adalah kebiasaan yang sangat baik jika Anda membungkus pengenal basis data Anda dengan backticks.
Sekarang tentang Kutipan Ganda & Kutipan Tunggal (Michael sudah menyebutkan itu).
Tapi, untuk menentukan nilai, Anda harus menggunakan tanda kutip tunggal atau ganda. Mari kita lihat contoh lain.
Di sini saya sengaja lupa membungkusnya
title1
dengan tanda kutip. Sekarang server akan mengambiltitle1
sebagai nama kolom (yaitu pengidentifikasi). Jadi, untuk menunjukkan bahwa itu adalah nilai, Anda harus menggunakan tanda kutip ganda atau tunggal.Sekarang, dalam kombinasi dengan PHP, tanda kutip ganda dan tanda kutip tunggal membuat waktu penulisan kueri Anda jauh lebih mudah. Mari kita lihat versi kueri yang dimodifikasi dalam pertanyaan Anda.
Sekarang, menggunakan tanda kutip ganda dalam PHP, Anda akan membuat variabel
$val1
, dan$val2
menggunakan nilainya sehingga menciptakan kueri yang benar-benar valid. Sukaakan membuat
sumber
Dalam MySQL, simbol ini digunakan untuk membatasi query
`
,"
,'
dan()
."
atau'
digunakan untuk melampirkan nilai-nilai seperti string"26-01-2014 00:00:00"
atau'26-01-2014 00:00:00'
. Simbol-simbol ini hanya untuk string, fungsi tidak agregat sukanow
,sum
ataumax
.`
digunakan untuk melampirkan nama tabel atau kolom, misalnyaselect `column_name` from `table_name` where id='2'
(
dan)
cukup lampirkan bagian dari permintaan misalnyaselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.sumber
Literal string dalam MySQL dan PHP adalah sama.
Jadi jika string Anda berisi tanda kutip tunggal, maka Anda bisa menggunakan tanda kutip ganda untuk mengutip string, atau jika itu berisi tanda kutip ganda, maka Anda bisa menggunakan tanda kutip tunggal untuk mengutip string. Tetapi jika string Anda berisi tanda kutip tunggal dan ganda, Anda harus menghindari tanda kutip yang digunakan untuk mengutip string.
Sebagian besar, kami menggunakan tanda kutip tunggal untuk nilai string SQL, jadi kami perlu menggunakan tanda kutip ganda untuk string PHP.
Dan Anda bisa menggunakan variabel dalam string PHP yang dikutip ganda:
Tetapi jika
$val1
atau$val2
mengandung tanda kutip tunggal, itu akan membuat SQL Anda salah. Jadi, Anda perlu menghindarinya sebelum digunakan dalam sql; itu untuk apamysql_real_escape_string
. (Meskipun pernyataan yang disiapkan lebih baik.)sumber
Dalam kombinasi PHP dan MySQL, tanda kutip ganda dan tanda kutip tunggal membuat waktu penulisan kueri Anda jauh lebih mudah.
Sekarang, anggap Anda menggunakan variabel pos langsung ke dalam kueri MySQL, gunakan cara ini:
Ini adalah praktik terbaik untuk menggunakan variabel PHP ke dalam MySQL.
sumber
Ada banyak jawaban yang bermanfaat di sini, umumnya memuncak menjadi dua poin.
DAN seperti kata @MichaelBerkowski
Meskipun demikian, ada kasus di mana pengidentifikasi tidak dapat menjadi kata kunci yang dicadangkan atau berisi spasi atau karakter di luar batas yang ditentukan, tetapi harus mengharuskan backtick di sekitarnya.
CONTOH
123E10
adalah nama pengidentifikasi yang valid tetapi jugaINTEGER
literal yang valid .[Tanpa merinci bagaimana Anda akan mendapatkan nama pengenal seperti itu], Misalkan saya ingin membuat tabel sementara bernama
123456e6
.Tidak ada KESALAHAN pada backticks.
GALAT saat tidak menggunakan backticks.
Namun,
123451a6
adalah nama pengenal yang sangat baik (tanpa kutu belakang).Ini sepenuhnya karena
1234156e6
juga merupakan angka eksponensial.sumber
Jika tabel cols dan nilai adalah variabel maka ada dua cara:
Dengan tanda kutip ganda
""
kueri lengkap:Atau
Dengan kutipan tunggal
''
:Gunakan tanda centang kembali
``
ketika nama kolom / nilai mirip dengan kata kunci yang dipesan MySQL.Catatan: Jika Anda menunjukkan nama kolom dengan nama tabel maka gunakan kembali tanda centang seperti ini:
`table_name`
.`column_name`
<- Catatan: kecualikan.
dari kutu belakang.sumber
Kutipan tunggal harus digunakan untuk nilai string seperti dalam daftar VALUES ().
Backticks umumnya digunakan untuk menunjukkan pengidentifikasi dan juga aman dari kecelakaan menggunakan kata kunci yang dipesan.
Dalam kombinasi PHP dan MySQL, tanda kutip ganda dan tanda kutip tunggal membuat waktu penulisan kueri Anda jauh lebih mudah.
sumber
Di samping semua jawaban (yang dijelaskan dengan baik), belum ada yang disebutkan berikut ini dan saya sering mengunjungi T&J ini.
Pendeknya; MySQL berpikir Anda ingin melakukan matematika pada tabel / kolomnya sendiri dan menafsirkan tanda hubung seperti "e-mail" sebagai
e
minusmail
.Penafian: Jadi saya pikir saya akan menambahkan ini sebagai jenis jawaban "FYI" bagi mereka yang benar-benar baru bekerja dengan database dan yang mungkin belum memahami istilah teknis yang sudah dijelaskan.
sumber
SQL server dan MySQL, PostgreySQL, Oracle tidak memahami tanda kutip ganda ("). Dengan demikian permintaan Anda harus bebas dari tanda kutip ganda (") dan hanya menggunakan tanda kutip tunggal (').
Back-trip (`) adalah opsional untuk digunakan dalam SQL dan digunakan untuk nama tabel, nama db dan nama kolom.
Jika Anda mencoba untuk menulis kueri di back-end Anda untuk memanggil MySQL maka Anda dapat menggunakan penawaran ganda (") atau kutipan tunggal (') untuk menetapkan permintaan ke variabel seperti:
Jika ada
where
pernyataan dalam kueri Anda dan / atau mencobainsert
nilai dan / atauupdate
nilai yang menggunakan string kutip tunggal (') untuk nilai-nilai ini seperti:Jika Anda ingin tetap keluar dari kebingungan ini ketika menggunakan tanda kutip ganda (") dan tanda kutip tunggal ('), akan merekomendasikan untuk tetap dengan tanda kutip tunggal (') ini akan mencakup backslash () seperti:
Masalah dengan tanda kutip ganda (") atau tunggal (') muncul ketika kami harus menetapkan beberapa nilai dinamis dan melakukan beberapa rangkaian string seperti:
Jika perlu izin lebih lanjut ikuti kutipan dalam JavaScript
sumber