sql >> Databáze >  >> RDS >> Mysql

PHP Mysql PDO počet vázaných proměnných neodpovídá počtu tokenů

Vypadá to, že Mark Baker již na vaši otázku odpověděl, ale chtěl jsem přidat několik tipů, které mi hodně pomohly.

PDO nepotřebuje mysql_escape_string
Dokud vše, co se týká vašeho dotazu, který se zabývá uživatelským vstupem, používá připravený příkaz (jako vy výše), nemusíte vstup ukončit pomocí 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();

Ale uvědomte si, že vkládání SQL je stále možné, pokud nevážete uživatelský vstup:

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




Snažte se, aby byl váš SQL co nejkratší
U jednoduchých příkazů SQL platí, že čím kratší je, tím snáze se udržuje a je méně pravděpodobné, že uděláte chyby. Můžete použít alternativní syntaxi INSERT[2]:

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

je ekvivalentní:

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

To znamená, že u velkých prohlášení, jako je ten váš, můžete efektivně poloviční jeho velikost, protože nemusíte opakovat všechny názvy sloupců:

$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




Udělejte své příkazy SQL víceřádkové a pěkné

Začal jsem formátovat své příkazy SQL tak, aby byly víceřádkové (jako výše) a od té doby mám mnohem méně chyb, jako je tato. dělá zabírá hodně místa, ale myslím, že to nakonec stojí za to. Tím, že je vše zarovnané, chyby trčí jako bolavý palec.

Hodně štěstí při kódování!



  1. MySQL dotaz na seznam hodnot

  2. SQL Server IF vs IIF():Jaký je rozdíl?

  3. Výstup skriptu SQL Developer zkrátí šířku sys_refcursor

  4. Jak zobrazit soubory protokolu v MySQL?