sql >> Databasteknik >  >> RDS >> Mysql

PHP Mysql PDO antal bundna variabler matchar inte antalet tokens

Det verkar som om Mark Baker redan har svarat på din fråga, men jag ville lägga till ett par tips som har hjälpt mig mycket.

PDO behöver inte mysql_escape_string
Så länge som allt som ingår i din fråga som handlar om användarinmatning använder en förberedd sats (som du är ovan) behöver du inte undkomma inmatningen med 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();

Men tänk på att SQL-injektion fortfarande är möjlig om du inte binder användarinmatning:

// 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/ sv/pdo.prepared-statements.php




Försök att göra din SQL så kort som möjligt
För enkla SQL-satser gäller att ju kortare det är, desto lättare är det att underhålla och du är mindre benägen att göra misstag. Du kan använda en alternativ INSERT-syntax[2]:

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

motsvarar:

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

Det betyder att för stora uttalanden som dina kan du i praktiken halva dess storlek eftersom du inte behöver upprepa alla kolumnnamn:

$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




Gör dina SQL-satser flerradiga och vackra

Jag började formatera mina SQL-satser för att vara flerradiga (som ovan) och ända sedan jag har haft MYCKET färre fel som detta. Det gör tar mycket plats, men jag tycker att det i slutändan är värt det. Genom att få allt att stämma får det fel att sticka ut som en öm tumme.

Lycka till med kodningen!



  1. räknar antalet gånger ett skript exekveras

  2. MySQL:Kolumn 'kolumnnamn' där klausulen är tvetydig

  3. Hur man genererar automatiskt inkrementfält i den valda frågan

  4. Hur man beräknar en kvadrat i SQL Server