Разница между PDO/подготовленным оператором - PHP/MySQL

Я пробовал Google, чтобы найти какой-либо недостаток, но не нашел!
Буду рад, если кто-нибудь поделится чем-нибудь по этой теме!
Преимущество/недостаток PDO и Prepared Statement

Редактировать 2:

Я думаю, все хотят сказать, что Prepared Statement лучше, чем PDO?
Я прав?


person Sourav    schedule 06.05.2011    source источник
comment
Преимущество: безопасность, недостаток: много кода. Решение: напишите небольшую оболочку, которая обеспечит безопасность без большого количества кода;)   -  person NikiC    schedule 06.05.2011
comment
@nikic, это было просто неправильно.   -  person tereško    schedule 06.05.2011
comment
@teresko: Люди обижаются, если вы просто говорите им, что они не правы ;) Всегда лучше сказать, почему они ошибаются ;) Потому что я, честно говоря, не могу придумать причину.   -  person NikiC    schedule 06.05.2011
comment
@nikic, вы должны убедиться, что для PDO::ATTR_EMULATE_PREPARES установлено значение false, если вы хотите быть уверены, что защита от SQL-инъекций полностью функциональна, и если вы правильно выполняете привязку переменных/значений, то код i гораздо более компактный и простой в управлении, чем стиль mysql/mysqli.   -  person tereško    schedule 06.05.2011
comment
@teresko: В этом случае нам просто нужно согласиться или не согласиться. На мой взгляд, код с использованием подготовленного оператора всегда очень раздут (потому что вам нужна одна строка для каждого параметра).   -  person NikiC    schedule 06.05.2011
comment
@nikic: это зависит. Вы заботитесь о безопасности? Потому что если это так, то ваше утверждение наивно... И много кода? Сколько дополнительного кода вы пишете для подготовленных операторов? Потому что я обнаружил, что на самом деле пишу то же самое, если не меньше...   -  person ircmaxell    schedule 06.05.2011
comment
Частичный дубликат: stackoverflow.com/q/5887113/338665   -  person ircmaxell    schedule 06.05.2011
comment
@ircmaxell: Извините? Просто убедитесь, что я вас правильно понимаю: если я использую небольшую оболочку (похожую на то, что Брэд показал в своем ответе), которая использует метод PDO->quote, вы называете это небезопасным? Вы действительно говорите мне, что метод PDO->quote уязвим? Если да, не могли бы вы дать мне ссылку? Это означало бы, что весь мой код открыт для sqli!   -  person NikiC    schedule 06.05.2011
comment
@ircmaxell: О, и ссылка на вашу карьеру в вашем тексте обо мне дает мне 404 ;)   -  person NikiC    schedule 06.05.2011
comment
@nikic: Да. Вскоре он будет обнародован, но да, вы все еще можете быть уязвимы, даже если используете PDO::quote() (в зависимости от других вещей)...   -  person ircmaxell    schedule 06.05.2011
comment
@ircmaxell: Самое интересное. Я с нетерпением жду публикации, чтобы узнать, относится ли это к моему делу.   -  person NikiC    schedule 07.05.2011


Ответы (2)


Основным недостатком PDO будет то, что запрос займет немного больше времени (я не могу «доказать» это, поэтому не принимайте это как факт, только то, что я заметил/прочитал), что намного меньше секунды. Но если вам это нужно меньше, то второй mysqli предлагает готовые операторы, такие как PDO, и я считаю, что он работает немного быстрее, учитывая, что он установлен для одной базы данных, а не для многих.

Это больше кода, но, как сказал nikic, используйте класс-оболочку для настройки ваших операторов, чтобы ваш код мог выглядеть примерно так:

$db->fetchAll('SELECT * FROM table WHERE name = ?', $name);

Где fetchAll — это пользовательская функция, которую вы пишете для обработки привязки параметров и т. д.

Что бы я использовал? mysqli или PDO (PDO лично из-за его универсальности). MySQL (не mysqli) немного устарел, и, в конце концов, вы могли бы написать гораздо больше кода, используя MySQL, поскольку вам всегда нужно фильтровать ввод (как в escape для предотвращения SQL-инъекций, он не будет проверять, что должно быть помещено там) перед помещением его в базу данных. Используя подготовленные операторы, фильтрация выполняется за вас, и вероятность инъекции очень мала, если она используется правильно.

person Jimithus    schedule 06.05.2011

Реальное большое преимущество подготовленных операторов заключается в том, что параметры передаются в ? проверяются на достоверность. Таким образом, атаки SQL-инъекций сложнее, чем если вы создадите свой sql что-то вроде этого

$SQL = "INSERT INTO table VALUES('" & $stringfromForm & "');";

как если бы кто-то мог настроить введите следующее в форму

x'); INSERT INTO someothertable VALUES ('rubbish

тогда у тебя могут быть проблемы

person akc42    schedule 06.05.2011