Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O número do PHP Mysql PDO de variáveis ​​vinculadas não corresponde ao número de tokens


Parece que Mark Baker já respondeu sua pergunta, mas eu queria adicionar algumas dicas que me ajudaram muito.

PDO não precisa de mysql_escape_string
Contanto que tudo na sua consulta que lida com a entrada do usuário esteja usando uma instrução preparada (como você está acima), você não precisa escapar da entrada com 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();

Mas esteja ciente de que a injeção de SQL ainda é possível se você não estiver vinculando a entrada do usuário:
// 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/ pt/pdo.prepared-statements.php






Tente tornar seu SQL o mais curto possível
Para instruções SQL simples, quanto mais curta ela for, mais fácil será a manutenção e é menos provável que você cometa erros. Você pode usar uma sintaxe INSERT alternativa[2]:
INSERT INTO 
  `users`
SET
  `name` = 'Steve';

é equivalente a:
INSERT INTO 
  `users`
  (
    `name`
  )
  VALUES
  (
    'Steve'
  );

Isso significa que para grandes declarações como a sua, você pode efetivamente metade seu tamanho porque você não precisa repetir todos os nomes das colunas:
$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/inserir.html




Faça com que suas instruções SQL sejam multilinhas e bonitas


Comecei a formatar minhas instruções SQL para serem multi-linhas (como acima) e desde então tive muito menos erros como esse. Ele faz ocupam muito espaço, mas acho que no final vale a pena. Ao fazer tudo se alinhar, faz com que os erros se destaquem como um polegar dolorido.

Boa codificação!