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

PHP Mysql PDO jumlah variabel terikat tidak sesuai dengan jumlah token

Sepertinya Mark Baker sudah menjawab pertanyaan Anda, tetapi saya ingin menambahkan beberapa tips yang telah banyak membantu saya.

PDO Tidak Membutuhkan mysql_escape_string
Selama semua yang masuk ke kueri Anda yang berhubungan dengan input pengguna menggunakan pernyataan yang disiapkan (seperti Anda di atas), Anda tidak perlu keluar dari input dengan mysql_real_escape_string [1].

// Don't worry about SQL injection since all of the user 
// defined inputs are being escaped by the PDO package
$sql = "INSERT INTO "
     .   "`users` "
     . "SET "
     .   "`name` = :name";

$query = $pdo->prepare($sql);
$query->bindParam(':name', $name);
$query->execute();

Namun perlu diketahui bahwa injeksi SQL masih dimungkinkan jika Anda tidak mengikat input pengguna:

// SQL injection can totally happen here
$sql = "INSERT INTO "
     .   "`users` "
     . "SET "
     .   "`name` = $name";

$query = $pdo->prepare($sql);
$query->execute();

[1] http://www.php.net/manual/ en/pdo.prepared-statements.php




Cobalah Membuat SQL Anda Sependek Mungkin
Untuk pernyataan SQL sederhana, semakin pendek, semakin mudah untuk mempertahankan dan Anda cenderung membuat kesalahan. Anda dapat menggunakan sintaks INSERT alternatif [2]:

INSERT INTO 
  `users`
SET
  `name` = 'Steve';

setara dengan:

INSERT INTO 
  `users`
  (
    `name`
  )
  VALUES
  (
    'Steve'
  );

Itu berarti untuk pernyataan besar seperti milik Anda, Anda dapat secara efektif setengah ukurannya karena Anda tidak perlu mengulang semua nama kolom:

$sql  = "INSERT INTO "
      .   "`records_rec` "
      . "SET "
      .   "`oldid_rec`       = :oldid_rec, "
      .   "`firstname_rec`   = :firstname_rec, " 
      .   "`artist_rec`      = :artist_rec, " 
      .   "`aside_rec`       = :aside_rec, "
      .   "`bside_rec`       = :bside_rec, "
      .   "`label_rec`       = :label_rec, "
      .   "`condition_rec`   = :condition_rec, " 
      .   "`genere_rec`      = :genere_rec, "
      .   "`price_rec`       = :price_rec, "
      .   "`collection_rec`  = :collection_rec, "
      .   "`active_rec`      = :active_rec, "
      .   "`info_rec`        = :info_rec, "
      .   "`notes_rec`       = :notes_rec, "
      .   "`order_rec`       = :order_rec, "
      .   "`alabelimage_rec` = :alabelimage_rec, "
      .   "`blabelimage_rec` = :blabelimage_rec, "
      .   "`asound_rec`      = :asound_rec, "
      .   "`bsound_rec`      = :bsound_rec, "
      .   "`featured_rec`    = :featured_rec, "
      .   "`format_rec`      = :format_rec";

$dbh = new PDO(<info goes here>);
$stmt = $dbh->prepare($sql); 

// Bind your params here...

[2] http://dev.mysql.com/doc/ refman/5.5/en/insert.html




Buat Pernyataan SQL Anda Multi-baris dan Cantik

Saya mulai memformat pernyataan SQL saya menjadi multi-baris (seperti di atas) dan sejak itu saya memiliki JAUH lebih sedikit kesalahan seperti ini. Itu memang memakan banyak ruang, tetapi saya pikir pada akhirnya itu sepadan. Dengan membuat semuanya berbaris, itu membuat kesalahan menonjol seperti jempol yang sakit.

Selamat membuat kode!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menggabungkan String di MySQL dengan CONCAT()

  2. Bagaimana cara menyalin baris dan menyisipkan di tabel yang sama dengan bidang peningkatan otomatis di MySQL?

  3. fungsi rekursif untuk mendapatkan semua kategori anak

  4. Gunakan LIKE %..% dengan nilai bidang di MySQL

  5. Tabel [nama tabel] tidak terkunci