sql >> Base de Datos >  >> RDS >> Mysql

El número PHP Mysql PDO de variables vinculadas no coincide con el número de tokens

Parece que Mark Baker ya respondió tu pregunta, pero quería agregar un par de consejos que me han ayudado mucho.

PDO no necesita mysql_escape_string
Siempre y cuando todo lo que ingrese en su consulta que se ocupa de la entrada del usuario use una declaración preparada (como está arriba), no necesita escapar de la entrada 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();

Pero TENGA en cuenta que la inyección de SQL aún es posible si no está vinculando la entrada del usuario:

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




Intente que su SQL sea lo más corto posible
Para sentencias SQL simples, cuanto más breve sea, más fácil será de mantener y es menos probable que cometa errores. Podría usar una sintaxis INSERT alternativa[2]:

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

es equivalente a:

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

Eso significa que para grandes declaraciones como la suya, puede efectivamente la mitad su tamaño porque no necesita repetir todos los nombres de las columnas:

$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/insertar.html




Haga que sus sentencias SQL sean bonitas y de varias líneas

Empecé a formatear mis declaraciones SQL para que tuvieran varias líneas (como arriba) y desde entonces he tenido MUCHO menos errores como este. lo hace ocupan mucho espacio, pero creo que al final vale la pena. Al hacer que todo esté alineado, los errores sobresalen como un pulgar dolorido.

¡Feliz codificación!