PHP MySQL disiapkan laporan

pernyataan siap untuk mencegah MySQL injeksi sangat berguna.


pernyataan siap dan parameter terikat

pernyataan siap untuk melaksanakan sejumlah pernyataan SQL yang sama, dan melaksanakan lebih efisien.

Karya pernyataan siap sebagai berikut:

  1. Pretreatment: Buat pernyataan Template SQL dikirim ke database. Nilai parameter milik "?" Mark. Sebagai contoh:

    INSERT 
    	INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. analisis database, mengkompilasi, mengeksekusi SQL laporan Template optimasi query, dan menyimpan hasilnya tidak output.

  3. Eksekusi: Akhirnya, nilai-nilai parameter yang dikirimkan ke aplikasi yang mengikat ( "?" Mark), database mengeksekusi pernyataan. Aplikasi dapat dijalankan berkali-kali, jika nilai parameter tidak sama.

Dibandingkan dengan eksekusi langsung dari pernyataan SQL, pernyataan siap memiliki dua keunggulan utama:

  • pernyataan siap secara dramatis mengurangi waktu analisis, hanya query (meskipun laporan dijalankan).

  • parameter terikat untuk mengurangi bandwidth server, Anda hanya perlu mengirim parameter query bukan seluruh pernyataan.

  • pernyataan siap melawan SQL injection sangat berguna, karena setelah menggunakan protokol yang berbeda untuk mengirim nilai parameter untuk memastikan keabsahan data.


MySQLi disiapkan laporan

Contoh berikut menggunakan MySQLi dalam sebuah pernyataan, dan mengikat parameter yang sesuai:

Contoh (MySQLi menggunakan pernyataan siap)

<? Php
$ Servername = "localhost";
$ Username = "username";
$ Password = "password";
$ Dbname = "myDB";

// Buat koneksi
$ Conn = baru mysqli ($ servername, $ username, $ password, $ dbname);

// Koneksi Uji
if ($ conn-> connect_error) {
die ( "Koneksi gagal:" $ conn-> connect_error.);
}

// Pretreatment dan mengikat
$ Stmt = $ conn-> mempersiapkan ( "INSERT INTO MyGuests (nama depan, nama belakang, email) VALUES (,,) ???");
$ Stmt-> bind_param ( "sss", $ firstname, lastname $, $ email);

// Set parameter dan melakukan
$ Nama depan = "John";
$ Namabelakang = "Doe";
$ Email = "john@example.com";
$ Stmt-> mengeksekusi ();

$ Nama depan = "Mary";
$ Namabelakang = "Moe";
$ Email = "mary@example.com";
$ Stmt-> mengeksekusi ();

$ Nama depan = "Julie";
$ Namabelakang = "Dooley";
$ Email = "julie@example.com";
$ Stmt-> mengeksekusi ();

echo "Rekor baru dimasukkan berhasil";

$ Stmt-> close ();
$ Conn-> close ();
?>

Parsing setiap baris kode dalam contoh berikut:

"INSERT INTO MyGuests (nama depan, nama belakang, email) VALUES (?,?,?)"

Dalam pernyataan SQL, kita menggunakan tanda tanya (?), Di sini kita bisa mengganti tanda tanya integer, string, double-presisi floating-point, dan nilai-nilai Boolean.

Selanjutnya, mari kita lihat bind_param () fungsi:

$ Stmt-> bind_param ( "sss", $ firstname, lastname $, $ email);

Parameter SQL fungsi mengikat, dan memberitahu nilai parameter basis data. "Sss" jenis pengolahan data kolom parameter untuk parameter yang tersisa. s karakter memberitahu database bahwa parameter string.

Ada empat jenis parameter:

  • i - bilangan bulat (integer)
  • d - ganda (double presisi floating point)
  • s - String (string)
  • b - BLOB (binary objek besar: biner benda-benda besar)

Setiap parameter diperlukan untuk menentukan jenis.

Tipe data parameter memberitahu database, Anda dapat mengurangi risiko SQL injection.

catatan Catatan: Jika Anda ingin memasukkan data tambahan (input pengguna), verifikasi data sangat penting.


PDO disiapkan pernyataan dalam

Contoh-contoh berikut kita menggunakan pernyataan siap di PDO dan parameter mengikat:

Contoh (PDO menggunakan pernyataan siap)

<? Php
$ Servername = "localhost";
$ Username = "username";
$ Password = "password";
$ Dbname = "myDBPDO";

try {
$ Conn = baru PDO ( "mysql: host = $ servername; dbname = $ dbname", $ username, $ password);
// Mengatur mode error PDO pengecualian
$ Conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);

// Pretreatment dan SQL parameter mengikat
$ Stmt = $ conn-> mempersiapkan ( "INSERT INTO MyGuests (nama depan, nama belakang, email)
NILAI (: Nama depan ,: lastname ,: email) ");
$ Stmt-> bindParam ( ': firstname', $ firstname);
$ Stmt-> bindParam ( ': nama belakang', $ nama belakang);
$ Stmt-> bindParam ( ': email', $ email);

// Baris Insert
$ Nama depan = "John";
$ Namabelakang = "Doe";
$ Email = "john@example.com";
$ Stmt-> mengeksekusi ();

// Sisipkan baris lain
$ Nama depan = "Mary";
$ Namabelakang = "Moe";
$ Email = "mary@example.com";
$ Stmt-> mengeksekusi ();

// Sisipkan baris lain
$ Nama depan = "Julie";
$ Namabelakang = "Dooley";
$ Email = "julie@example.com";
$ Stmt-> mengeksekusi ();

echo "Rekor baru dimasukkan berhasil";
}
catch (PDOException $ e)
{
id Echo $ sql "Situs" $ e> getMessage ();
}
$ Conn = null;
?>