Недостатки PDO (объекты данных PHP) - PullRequest
19 голосов
/ 08 июля 2011

Все, что я читал о PDO (объекты данных PHP), почти слишком хорошо, чтобы быть правдой.

Я имею в виду:

  • Это быстрее, чем MySQL или MySQL.
  • Имеет одинаковый синтаксис для нескольких драйверов баз данных.
  • с подготовленными инструкциями безопасен для внедрения SQL.
  • вы можете извлекать данные непосредственно в объект.

Но каковы недостатки PDO?

Ответы [ 5 ]

15 голосов
/ 08 июля 2011

Все, что я до сих пор читал о PDO (объектах данных PHP), слишком хорошо, чтобы быть правдой.

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

Это быстрее, чем mysql или mysqli.

Это так?Я не знаю, где вы это взяли, и это вполне может быть правдой, но я не слышал о том, чтобы PDO был быстрее, чем собственные библиотеки MySQL.

Он имеет одинаковый синтаксис для несколькихдрайверы базы данных.

Вроде.Я часто использую PostgreSQL, и код отличается от того, когда вы работаете с MySQL.Это имеет смысл, поскольку PostgreSQL работает с именованными последовательностями, в то время как MySQL работает с «автоматическим приращением», которое представляет собой последовательность для каждой таблицы.Между базами данных есть различия, которые PDO не может абстрагировать, даже если это только для базы данных access .

с подготовленными инструкциями, это безопасно для внедрения SQL.

Вы также можете подготовить операторы с помощью mysqli , поэтому я не вижу в этом определенного преимущества.Хотя я обычно использую подготовленные операторы, и мне нравится: синтаксис: field, который предоставляет PDO.

Но где недостатки PDO, то, что имеет столько плюсов, также должно иметь противоположность.

API менее интуитивен для меня, я думаю, что API mysqli имеет больше смысла.Тем не менее, если вы напишите обертку для нее самостоятельно, это очень приличная библиотека.Вот оболочка, которую я написал , чтобы сделать использование PDO немного более вменяемым, хотя есть еще много примеров, дрейфующих в Интернете.

EDIT : О, и ДжеймсАндерсон прав;у него плохая поддержка Oracle.Я не использую Oracle, поэтому не считаю это огромным недостатком.

5 голосов
/ 20 сентября 2011

Это быстрее, чем MySQL или MySQL.

неправильно. в реальной жизни это вообще медленнее.

Имеет одинаковый синтаксис для нескольких драйверов баз данных.

для функций API - да, конечно. но это не поможет вам с различными диалектами SQL.

с подготовленными утверждениями это безопасно для инъекции sql.

для защиты от инъекций sql, четыре вопросы должны быть должным образом экранированы:

  • строка
  • номер
  • идентификаторы
  • операторы

, в то время как PDO охватывает только первые два.

5 голосов
/ 20 сентября 2011

Механизм связывания не работает с именами столбцов или таблиц.

Простые примеры:

CREATE TABLE :bar (rowId int)

SELECT :foo FROM :bar

С другой стороны, это не то, что вам часто нужно или нужно делать.

Но когда ты это делаешь ... PDO оставляет тебя в покое. Решение состоит в том, чтобы вручную объединять строки запроса, одновременно выполняя экранирование:

$foo = some_escape_logic( $dirtyFoo );
$bar = some_escape_logic( $dirtyBar );

$db->query( "SELECT {$foo} FROM {$bar}" );

Результаты SQL всегда возвращаются в виде строк

fetch () возвращает массив строковых значений, даже если типы таблиц SQL являются числовыми. Например, таблица со столбцами bigint / string / bigint возвращает:

array( 'rowId' => '1', 'name' => 'Fred', 'age' => '12' );

вместо:

array( 'rowId' => 1, 'name' => 'Fred', 'age' => 12 );

Как положительный момент, вы никогда не потеряете точность из-за несоответствия между типами PHP и SQL. Жонглирование типов в PHP также гарантирует, что вы редко даже заметите, что данные изначально были закодированы как строки.

Как минус, это может быть неприятно, когда передача результатов DB что-то вроде json_encode (), так как вы получите числовые значения в кавычках:

{ "rowId": "1", "name": "Fred", "age": "12" }

вместо

{ "rowId": 1, "name": "Fred", "age": 12 }

В идеальном мире автоматическое приведение типов вывода из fetch () будет управляемым через необязательный аргумент.

3 голосов
/ 08 июля 2011

Два недостатка, о которых я знаю:

Нет или плохая поддержка Oracle!

Некоторые потери производительности на больших наборах результатов.«обратная сторона» - еще одна причина избегать Oracle.Второе редко имеет значение.

0 голосов
/ 08 июля 2011

Я помню, как где-то читал, что одним из недостатков PDO является то, что он требует немного больше времени для запросов. (Извините, у меня нет ссылки на эту статью), надеюсь, некоторые эксперты могут рассказать об этом.

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