Недостатки PDO (объекты данных PHP)
Все, что я читал до сих пор о PDO (объектах данных PHP), почти слишком хорошо, чтобы быть правдой.
Я имею в виду:
- Быстрее, чем mysql или mysqli.
- Он имеет тот же синтаксис для нескольких драйверов базы данных.
- с подготовленными инструкциями он безопасен для SQL-инъекций.
- вы можете получать данные непосредственно в объект.
Но каковы недостатки PDO?
Ответы
Ответ 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 является то, что он требует немного больше времени для запросов. (Извините, я не имею ссылку на эту статью), надеюсь, некоторые эксперты могут рассказать об этом.