Mysql
 sql >> база данни >  >> RDS >> Mysql

Броят на обвързаните променливи на PHP Mysql PDO не съвпада с броя на токените

Изглежда, че Марк Бейкър вече отговори на въпроса ви, но исках да добавя няколко съвета, които ми помогнаха много.

PDO не се нуждае от mysql_escape_string
Докато всичко, което влиза във вашата заявка, което се занимава с въвеждането на потребителя, използва подготвен израз (както вие сте по-горе), не е необходимо да избягвате въвеждането с 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();

Но имайте предвид, че SQL инжектирането все още е възможно, ако не обвързвате въвеждането на потребителя:

// 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




Опитайте се да направите своя SQL възможно най-кратък
За прости SQL изрази, колкото по-кратък е, толкова по-лесно се поддържа и е по-малко вероятно да правите грешки. Можете да използвате алтернативен синтаксис INSERT[2]:

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

е еквивалентен на:

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

Това означава, че за големи изявления като вашето можете ефективно да наполовина неговия размер, защото не е нужно да повтаряте всички имена на колони:

$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




Направете своите SQL изявления многоредови и красиви

Започнах да форматирам моите SQL изрази да бъдат многоредови (като по-горе) и оттогава имах МНОГО по-малко грешки като тази. Това прави заемат много място, но мисля, че в крайна сметка си заслужава. Като прави всичко подредено, той кара грешките да стърчат като възпален палец.

Приятно кодиране!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP / PDO :SQL за намиране на ред, който съдържа стойност на низ

  2. Как да конвертирате IPv6 от двоичен файл за съхранение в MySQL

  3. Как да актуализирате колоната с идентификатор, започвайки отново от 1

  4. Дълбочина в MYSQL и дървета на таблици за затваряне

  5. Как да получа първичен ключ на таблицата?