Подтвердить что ты не робот

Недостатки PDO (объекты данных PHP)

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

Я имею в виду:

  • Быстрее, чем mysql или mysqli.
  • Он имеет тот же синтаксис для нескольких драйверов базы данных.
  • с подготовленными инструкциями он безопасен для SQL-инъекций.
  • вы можете получать данные непосредственно в объект.

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

4b9b3361

Ответ 1

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

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

Быстрее, чем mysql или mysqli.

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Быстрее, чем mysql или mysqli.

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

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

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

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

для защиты от SQL-инъекций, важно четыре:

  • строки
  • числа
  • идентификаторы
  • Операторы

тогда как PDO охватывает только первые два.

Ответ 4

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

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

Некоторые достижения производительности на больших наборах результатов.

Насколько мне известно, первый "недостаток" - еще одна причина избежать Oracle. Второй вопрос редко.

Ответ 5

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