Должен ли я действительно использовать PDO и подготовленные заявления? - PullRequest
6 голосов
/ 11 января 2010

ЗОП и подготовленные заявления все еще немного сбивают меня с толку, сколько бы я ни читал о них до сих пор. Я знаю, что они более «безопасны», но так ли это важно? Я имею в виду, что могу получить тот же конечный результат, используя базовый mysql с mysql_real_escape_string () и htmlspecialchars (), верно?

Ответы [ 6 ]

10 голосов
/ 11 января 2010

Вы могли бы, но PDO и подготовленные заявления абсолютно безопасны. Не могли бы вы сделать это вручную и использовать функцию mysql_real_escape_string()? Конечно. На самом деле ваш вывод может выглядеть идентично. Но, в конце концов, код, который потребуется PDO, будет намного короче, чем код, если вы сделали это вручную.

Кроме того, если вы не используете подготовленные операторы, вы рискуете получить человеческую ошибку: допустим, вы забыли экранировать значение или очистить ввод. Смешанная со всем вашим другим кодом, единственная строка, которая не будет должным образом очищена, может оказаться кошмаром в будущем.

Надеюсь, это поможет!

3 голосов
/ 11 января 2010

Мне очень нравится интерфейс PDO. Как только вы привыкните к нему, он станет намного чище, чем стиль функции mysql_ *. Мне тоже понадобилось время, чтобы понять это, но оно того стоит.

Часть, которую я нашел сбивающей с толку, - это запоминание того, какие методы принадлежат самому объекту соединения с БД PDO, а какие являются частью объектов операторов.

С определенными действиями вы получите выигрыш в производительности и от повторения подготовленных заявлений. Например, если вы выполняете несколько вставок в цикле, вы можете подготовить инструкцию, а затем каждый раз привязывать новые данные в цикле перед вставкой.

Безопасность намного лучше, так как вы полагаетесь на хорошо протестированную библиотеку, чтобы избежать данных при каждой вставке. Это как криптография - зачем делать это самому, когда это что-то важное? Нет причин давать себе шанс ошибиться (т. Е. Случайно пропустить что-то, вставленное в запрос).

Я рекомендую это руководство для PDO, от автора, который написал эту превосходную гигантскую книгу по Mysql .

Мне нравится использовать стиль позиционных параметров, а затем вы просто создаете массив данных и передаете его. Мои запросы выглядят как

$pdo_db=pdo_connect('cow_db');
$sql='select this,that,count(those) as snout from lovely_table where name=? and horses=?';
$data=array($username,$horse_count);

$query_stmt=$pdo_db->prepare($sql);
$result_handle=$query_stmt->execute($data);

//then I have a function to load data from the result handle
$info=load_array($result_handle);

Вы можете заставить подобные функции работать со стандартным интерфейсом php mysql, но почему бы просто не использовать PDO?

2 голосов
/ 11 января 2010

Я согласен с другими, которые говорят, что использование подготовленных запросов обычно лучше, чем использование экранирующих функций. Его проще использовать правильно, и значения параметров не могут создать проблемы с внедрением SQL, поскольку это значение отправляется на сервер RDBMS отдельно от запроса SQL.

Однако использование параметров полезно только тогда, когда динамические части вашего SQL-запроса являются параметром вместо литерального значения в выражении. Нельзя использовать параметр запроса вместо имени таблицы, имени столбца, выражения SQL или списка значений (например, аргументы предиката IN( )).

Подготовленные запросы также имеют лучшую производительность , чем не подготовленные запросы (по крайней мере, в MySQL). Большинство людей говорят об обратном, но уважаемый mysqlperformanceblog.com провел тестирование:

http://www.mysqlperformanceblog.com/2006/08/02/mysql-prepared-statements/

0 голосов
/ 11 января 2010

PHP позволяет вам делать все, что вы захотите, и так случилось, что PDO делает то, что «вы хотите», с гораздо меньшим количеством кода. :)

0 голосов
/ 11 января 2010

вы можете попробовать zend_db, который использует pdo под капотом. ( mdb2 - это еще один вариант, который вы можете использовать.)

0 голосов
/ 11 января 2010

Пока вы обрабатываете данные соответствующим образом для ваших запросов, у вас нет для использования PDO / подготовленных операторов. Хотя , я бы лично рекомендовал использовать операторы PDO / подготовленные просто потому, что они облегчают разработку / отладку, а подготовленные операторы предотвращают попадание некорректных типов данных в запрос.

Если вы хотите узнать больше о том, как создать простую подготовленную инструкцию, обратитесь к функции sprintf. Вы просто заменяете любые переменные строки, целые числа и т. Д. Спецификатором типа (в данном случае %s и %d соответственно).

Так, например, в следующем запросе я знаю, что id будет целым числом (оно будет числовым), а name будет строкой (буквенно-цифровым).

$username = 'Simon';
$id       = 3;
$query    = "SELECT FROM `users` WHERE `id` = {$id} AND `name` = '{$username}'";

Если я получаю любую из этих переменных из ненадежного источника (такого как POST / GET), тогда я могу убедиться, что они являются правильными типами данных, заменив последнюю строку (набор запросов $) на sprintf звоните так:

$username = 'Simon';
$id       = 3;
$query    = sprintf( "SELECT FROM `users` WHERE `id` = %d AND `name` = '%s'", $id, $username );

sprintf просто не позволит мне использовать строку для $ id или целое число для $ name при его вызове, что гарантирует получение правильных типов данных (это дает мне немного больше безопасности). Если даны неправильные типы данных, то Я полагаю, приведёт переменные к запрошенному типу.

Чтобы узнать больше о sprintf посетите здесь: http://php.net/sprintf

Надеюсь, это достаточно объяснит (это мой первый ответ):).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...