Mysql
 sql >> Database >  >> RDS >> Mysql

Il numero di variabili associate PHP Mysql PDO non corrisponde al numero di token

Sembra che Mark Baker abbia già risposto alla tua domanda, ma volevo aggiungere un paio di suggerimenti che mi hanno aiutato molto.

PDO non ha bisogno di mysql_escape_string
Finché tutto ciò che entra nella tua query che riguarda l'input dell'utente utilizza un'istruzione preparata (come quella sopra) non è necessario eseguire l'escape dell'input con 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();

Ma tieni presente che l'iniezione SQL è ancora possibile se non stai vincolando l'input dell'utente:

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




Cerca di rendere il tuo SQL il più breve possibile
Per semplici istruzioni SQL, più è breve, più facile è da mantenere e meno probabilità di commettere errori. Potresti usare una sintassi INSERT alternativa[2]:

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

equivale a:

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

Ciò significa che per dichiarazioni importanti come la tua, puoi effettivamente metà la sua dimensione perché non è necessario ripetere tutti i nomi delle colonne:

$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




Rendi le tue istruzioni SQL multiriga e graziose

Ho iniziato a formattare le mie istruzioni SQL in modo che fossero a più righe (come sopra) e da allora ho avuto MOLTO meno errori come questo. lo fa occupano molto spazio, ma penso che alla fine ne valga la pena. Mettendo tutto in fila, gli errori sporgono come un pollice dolorante.

Buona codifica!