2013-12-03 6 views
0

Я пытаюсь избежать SQL-инъекции на моей странице.PDO не вставляет после цитаты

// Connect to database server and select database 
$connection = new PDO("mysql:dbname=tt8888;host=mysql.tt8888.com", "tt8888", "ttnopassword"); 
// Quote data to prevent SQL injection 
$name = $connection->quote($name); 
// Insert now   
$connection->query("INSERT INTO Contact (name, eeeee, llll, mmmmm, iiiii) VALUES ('$name','$eeeee','$llll','$mmmmm','$iiiii');"); 

Без quote(), он вставляет только штраф. И используя print $name;, quote() часть кажется работа хорошо. Почему в базу данных ничего не добавлено после использования quote()?

+3

Вы используете PDO неправильно. Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com). –

+1

Вы должны использовать заполнители, а не строить SQL с ненадежными данными. –

ответ

2

PDO::quote будет размещать одинарные кавычки вокруг ваших значений. Поэтому вам не нужно делать это самостоятельно в своем SQL.

Хотя я настоятельно рекомендую вам перейти на использование prepare() с именованными параметрами.

+0

Спасибо, теперь он отлично работает! Btw, если все, что у меня есть строки, использует quote() OK для предотвращения инъекций? Я попытался использовать prepare(), и страница сломалась. – zaolian

+1

_ "Я попытался использовать prepare(), и страница сломалась" _, тогда вы, вероятно, использовали его неправильно. Рефакторинг с использованием именованных параметров и отправьте новый вопрос, если у вас есть конкретная проблема, чтобы заставить их работать (или, еще лучше, просто искать, есть много ответов, уже всплывающих вокруг). – jszobody

2

Не использовать PDO::quote. Гораздо лучше использовать параметризованные запросы.

$stmt = $connection->prepare("INSERT INTO Contact (name, e, l, m, i) VALUES (?, 
    ?, ?, ?, ?)"); 
// This will quote all of the values for you 
$stmt->execute(array($name, $eeeee, $llll, $mmmm, $iiiii)); 

Вы также можете использовать bind методы (bindParam или bindValue) вместо передачи аргументов непосредственно execute. Это позволит вам указать типы данных, если это необходимо, но похоже, что все они должны быть строками.

+0

Похоже, что prepare() не работает. PHP выполняется до тех пор, пока не будет подготовлен() один ... – zaolian

+1

@LearningClojure turn error report on; какая ошибка вы получаете от этой линии? –

+0

Теперь я понимаю, что происходит. Это была небольшая проблема. Спасибо! – zaolian

Смежные вопросы