Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP Mysql PDO nombre de variables liées ne correspond pas au nombre de jetons

On dirait que Mark Baker a déjà répondu à votre question, mais je voulais ajouter quelques conseils qui m'ont beaucoup aidé.

PDO n'a pas besoin de mysql_escape_string
Tant que tout ce qui entre dans votre requête et qui traite de l'entrée de l'utilisateur utilise une instruction préparée (comme ci-dessus), vous n'avez pas besoin d'échapper l'entrée avec 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();

Mais sachez que l'injection SQL est toujours possible si vous ne liez pas l'entrée utilisateur :

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




Essayez de rendre votre SQL aussi court que possible
Pour les instructions SQL simples, plus elles sont courtes, plus elles sont faciles à maintenir et vous avez moins de risques de faire des erreurs. Vous pouvez utiliser une autre syntaxe INSERT[2] :

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

est équivalent à :

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

Cela signifie que pour les grandes déclarations comme la vôtre, vous pouvez effectivement moitié sa taille car vous n'avez pas besoin de répéter tous les noms de colonnes :

$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




Faites en sorte que vos instructions SQL soient multilignes et jolies

J'ai commencé à formater mes instructions SQL pour qu'elles soient multilignes (comme ci-dessus) et depuis, j'ai eu BEAUCOUP moins d'erreurs comme celle-ci. Ça fait prend beaucoup de place, mais je pense qu'au final ça vaut le coup. En alignant tout, les erreurs ressortent comme un pouce endolori.

Bon codage !