sql >> Database >  >> RDS >> Mysql

PHP Mysql PDO aantal gebonden variabelen komt niet overeen met aantal tokens

Het lijkt erop dat Mark Baker je vraag al heeft beantwoord, maar ik wilde een paar tips toevoegen die me enorm hebben geholpen.

BOB heeft mysql_escape_string niet nodig
Zolang alles wat in uw zoekopdracht komt en die te maken heeft met gebruikersinvoer een voorbereide verklaring gebruikt (zoals u hierboven doet), hoeft u de invoer niet te escapen met 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();

Maar houd er rekening mee dat SQL-injectie nog steeds mogelijk is als u gebruikersinvoer niet verplicht:

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




Probeer uw SQL zo kort mogelijk te maken
Voor eenvoudige SQL-instructies geldt:hoe korter het is, hoe gemakkelijker het is om te onderhouden en hoe kleiner de kans dat u fouten maakt. Je zou een alternatieve INSERT-syntaxis [2] kunnen gebruiken:

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

is gelijk aan:

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

Dat betekent dat je voor grote uitspraken zoals de jouwe effectief de helft . kunt de grootte omdat u niet alle kolomnamen hoeft te herhalen:

$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




Maak uw SQL-statements meerregelig en mooi

Ik begon mijn SQL-instructies op te maken met meerdere regels (zoals hierboven) en sindsdien heb ik VEEL minder fouten zoals deze. Het doet neemt veel ruimte in beslag, maar ik denk dat het uiteindelijk de moeite waard is. Door alles op één lijn te brengen, vallen fouten op als een pijnlijke duim.

Veel plezier met coderen!



  1. Converteer datumnotatie naar DD/MMM/YYYY-formaat in SQL Server

  2. SQLite Python

  3. Dichtstbijzijnde locatie zoeken op postcode?

  4. TOON TABELLEN in MySQL