Изглежда, че Марк Бейкър вече отговори на въпроса ви, но исках да добавя няколко съвета, които ми помогнаха много.
PDO не се нуждае от mysql_escape_string
Докато всичко, което влиза във вашата заявка, което се занимава с въвеждането на потребителя, използва подготвен израз (както вие сте по-горе), не е необходимо да избягвате въвеждането с 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();
Но имайте предвид, че SQL инжектирането все още е възможно, ако не обвързвате въвеждането на потребителя:
// 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/ en/pdo.prepared-statements.php
Опитайте се да направите своя SQL възможно най-кратък
За прости SQL изрази, колкото по-кратък е, толкова по-лесно се поддържа и е по-малко вероятно да правите грешки. Можете да използвате алтернативен синтаксис INSERT[2]:
INSERT INTO
`users`
SET
`name` = 'Steve';
е еквивалентен на:
INSERT INTO
`users`
(
`name`
)
VALUES
(
'Steve'
);
Това означава, че за големи изявления като вашето можете ефективно да наполовина неговия размер, защото не е нужно да повтаряте всички имена на колони:
$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
Направете своите SQL изявления многоредови и красиви
Започнах да форматирам моите SQL изрази да бъдат многоредови (като по-горе) и оттогава имах МНОГО по-малко грешки като тази. Това прави заемат много място, но мисля, че в крайна сметка си заслужава. Като прави всичко подредено, той кара грешките да стърчат като възпален палец.
Приятно кодиране!