Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP Mysql PDO Anzahl der gebundenen Variablen stimmt nicht mit der Anzahl der Token überein

Sieht so aus, als hätte Mark Baker Ihre Frage bereits beantwortet, aber ich wollte ein paar Tipps hinzufügen, die mir sehr geholfen haben.

PDO benötigt mysql_escape_string nicht
Solange alles, was in Ihre Abfrage geht, die sich mit Benutzereingaben befasst, eine vorbereitete Anweisung verwendet (wie oben), müssen Sie die Eingabe nicht mit mysql_real_escape_string maskieren [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();

Beachten Sie jedoch, dass SQL-Injection immer noch möglich ist, wenn Sie keine Benutzereingaben binden:

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




Versuchen Sie, Ihr SQL so kurz wie möglich zu halten
Für einfache SQL-Anweisungen gilt:Je kürzer sie sind, desto einfacher ist sie zu warten und es ist weniger wahrscheinlich, dass Sie Fehler machen. Sie könnten eine alternative INSERT-Syntax[2] verwenden:

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

entspricht:

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

Das bedeutet, dass Sie bei großen Aussagen wie Ihrer effektiv halbieren können seine Größe, da Sie nicht alle Spaltennamen wiederholen müssen:

$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




Machen Sie Ihre SQL-Anweisungen mehrzeilig und hübsch

Ich fing an, meine SQL-Anweisungen so zu formatieren, dass sie mehrzeilig sind (wie oben), und seitdem habe ich viel weniger Fehler wie diese. Das tut es viel Platz einnehmen, aber ich denke am Ende lohnt es sich. Indem alles aufeinander abgestimmt wird, fallen Fehler wie ein Daumen auf.

Viel Spaß beim Programmieren!