Pernyataan Terlebih Dahulu
Jalankan kueri berparameter
Pernyataan Terlebih Dahulu adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Apa Itu Pernyataan yang Disiapkan
Pernyataan yang disiapkan mengirim teks SQL ke basis data satu kali untuk diurai dan direncanakan, lalu mengeksekusinya berkali-kali dengan parameter yang berbeda. Pernyataan ini lebih cepat untuk kueri berulang dan lebih aman dari injeksi.
Placeholder Parameter
Jangan pernah membuat SQL dengan menggabungkan input pengguna. Gunakan placeholder agar pengandar mengirim nilai secara terpisah. PostgreSQL menggunakan $1, $2; MySQL dan SQLite menggunakan ?.
SELECT * FROM users WHERE age > $1 AND city = $2Mengapa Ini Menghentikan Injeksi
Karena parameter dikirim terpisah dari teks SQL, basis data memperlakukannya secara ketat sebagai data, bukan sebagai kode. Nilai berbahaya seperti " OR 1=1 menjadi string literal, bukan SQL yang dapat dieksekusi.
db.Prepare
Prepare mengembalikan *sql.Stmt yang terikat pada kumpulan koneksi. Selanjutnya, Anda memanggil Exec atau Query pada pernyataan tersebut dengan argumen.
stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()Mengeksekusi Pernyataan
Panggil stmt.Exec dengan argumen untuk setiap placeholder. Untuk penyisipan dan pembaruan, Exec mengembalikan sql.Result yang berisi jumlah baris yang terpengaruh dan ID penyisipan terakhir.
res, err := stmt.Exec("Ada", 36)
if err != nil {
log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)Menggunakan Kembali dalam Perulangan
Keuntungannya berasal dari penggunaan ulang: siapkan sekali, lalu eksekusi berkali-kali di dalam perulangan. Basis data menggunakan kembali rencana yang telah diurai untuk setiap pemanggilan.
for _, u := range users {
if _, err := stmt.Exec(u.Name, u.Age); err != nil {
log.Fatal(err)
}
}Penyiapan Implisit
Memberikan argumen langsung ke db.Query atau db.Exec juga menggunakan placeholder dengan aman; pengandar mungkin melakukan penyiapan secara internal. Prepare eksplisit terutama penting untuk eksekusi berulang.
Simulasi Pengikatan Parameter yang Dapat Dijalankan
Pernyataan yang disiapkan sebelumnya secara nyata memerlukan basis data. Contoh yang dapat dijalankan ini menyimulasikan pengikatan parameter yang aman untuk menunjukkan bahwa nilai tetap terpisah dari teks kueri.
package main
import "fmt"
func execPrepared(query string, args ...interface{}) string {
return fmt.Sprintf("EXEC %q with args %v", query, args)
}
func main() {
q := "INSERT INTO users(name, age) VALUES($1, $2)"
people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
for _, p := range people {
fmt.Println(execPrepared(q, p[0], p[1]))
}
}Variasi Konteks
Gunakan PrepareContext dan stmt.ExecContext agar pemanggilan yang disiapkan mematuhi batas waktu dan pembatalan, sama seperti bagian lain dari database/sql.
Selalu Tutup Stmt
*sql.Stmt menyimpan sumber daya pada basis data. Tunda stmt.Close() setelah Anda selesai menggunakannya. Kebocoran pernyataan dapat menghabiskan batas pernyataan yang disiapkan di sisi server.
Pernyataan dan Pengumpulan Koneksi
Pernyataan yang disiapkan pada *sql.DB berfungsi di seluruh koneksi dalam kumpulan; pustaka menyiapkannya kembali pada koneksi mana pun yang digunakannya. Biasanya Anda tidak perlu mengelolanya sendiri.
Pemeriksaan Singkat
Uji pengetahuan Anda tentang pernyataan yang disiapkan sebelumnya.
Ringkasan
Anda telah mempelajari pernyataan yang disiapkan sebelumnya:
- Prepare mengurai sekali, lalu mengeksekusi berkali-kali
- Penanda tempat ($1 atau ?) menjaga nilai tetap sebagai data sehingga mencegah injeksi
- stmt.Exec mengembalikan jumlah baris yang terpengaruh; tunda stmt.Close()
- Gunakan kembali dalam perulangan; gunakan variasi Context untuk batas waktu
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pernyataan Terlebih Dahulu” gratis?
Ya — teks lengkap “Pernyataan Terlebih Dahulu” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pernyataan Terlebih Dahulu”?
Jalankan kueri berparameter Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pernyataan Terlebih Dahulu” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuka Koneksi
- Mengeksekusi Kueri Baris
- Pernyataan Terlebih Dahulu
- Transaksi