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í!