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

Bagaimana cara memasukkan variabel PHP di dalam pernyataan MySQL

Aturan untuk menambahkan variabel PHP di dalam pernyataan MySQL apa pun sederhana dan sederhana:

  1. Variabel apa pun yang mewakili literal data SQL , (atau, sederhananya - string SQL, atau angka) HARUS ditambahkan melalui pernyataan yang disiapkan. Tidak ada pengecualian.
  2. Bagian kueri lainnya, seperti kata kunci SQL, tabel atau nama bidang, atau operator - harus difilter melalui daftar putih .

Jadi karena contoh Anda hanya melibatkan literal data, maka semua variabel harus ditambahkan melalui placeholder (juga disebut parameter). Untuk melakukannya:

  • Dalam pernyataan SQL Anda, ganti semua variabel dengan placeholder
  • persiapan kueri yang dihasilkan
  • mengikat variabel ke placeholder
  • jalankan pertanyaan

Dan inilah cara melakukannya dengan semua driver database PHP populer:

Menambahkan literal data menggunakan mysql ext

Driver seperti itu tidak ada .

Menambahkan literal data menggunakan mysqli

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Kodenya agak rumit tetapi penjelasan rinci dari semua operator ini dapat ditemukan di artikel saya, Cara menjalankan MASUKKAN kueri menggunakan Mysqli , serta solusi yang memudahkan proses secara dramatis.

Untuk kueri SELECT, Anda hanya perlu menambahkan panggilan ke get_result() metode untuk mendapatkan mysqli_result yang familier dari mana Anda dapat mengambil data dengan cara biasa:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)

Menambahkan literal data menggunakan PDO

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

Di PDO, kita dapat menggabungkan bagian-bagian yang mengikat dan mengeksekusi, yang sangat nyaman. PDO juga mendukung placeholder bernama yang menurut beberapa orang sangat nyaman.

Menambahkan kata kunci atau pengenal

Terkadang kita harus menambahkan variabel yang mewakili bagian lain dari kueri, seperti kata kunci atau pengenal (database, tabel, atau nama bidang). Ini kasus yang jarang terjadi, tetapi lebih baik bersiap-siap.

Dalam hal ini, variabel Anda harus diperiksa terhadap daftar nilai secara eksplisit tertulis dalam naskah Anda. Ini dijelaskan di artikel saya yang lain, Menambahkan nama bidang dalam klausa ORDER BY berdasarkan pilihan pengguna :

Sayangnya, PDO tidak memiliki placeholder untuk pengidentifikasi (nama tabel dan bidang), oleh karena itu pengembang harus memfilternya secara manual. Filter semacam itu sering disebut "daftar putih" (di mana kami hanya mencantumkan nilai yang diizinkan) sebagai lawan dari "daftar hitam" tempat kami mencantumkan nilai yang tidak diizinkan.

Jadi kita harus secara eksplisit mencantumkan semua kemungkinan varian dalam kode PHP dan kemudian memilih dari mereka.

Ini contohnya:

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

Pendekatan yang sama persis harus digunakan untuk arah,

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

Setelah kode seperti itu, keduanya $direction dan $orderby variabel dapat dengan aman dimasukkan ke dalam kueri SQL, karena keduanya sama dengan salah satu varian yang diizinkan atau akan ada kesalahan yang dilemparkan.

Hal terakhir yang disebutkan tentang pengidentifikasi, mereka juga harus diformat sesuai dengan sintaks database tertentu. Untuk MySQL seharusnya backtick karakter di sekitar pengidentifikasi. Jadi string kueri terakhir untuk pesanan kami dengan contoh adalah

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skrip Bash untuk memasukkan nilai di MySQL

  2. Bagaimana cara mencari data JSON di MySQL?

  3. LINQ untuk alat Java

  4. Bagaimana cara menyimpan nilai NULL di bidang datetime di MySQL?

  5. Cara Mendapatkan Catatan Pertama di Setiap Grup di MySQL