Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
mysqli или PDO - каковы плюсы и минусы?
В нашем случае мы разделены между использованием mysqli и PDO для таких вещей, как подготовленные заявления и поддержка транзакций. Некоторые проекты используют одно, некоторые другое. Существует очень мало реальной вероятности того, что мы когда-нибудь переедем в другой RDBMS.
Я предпочитаю PDO только по той причине, что он допускает именованные параметры для подготовленных операторов, а насколько мне известно, mysqli этого не делает.
Есть ли еще какие-то плюсы и минусы в выборе одного из них в качестве стандарта, когда мы объединяем наши проекты, чтобы использовать только один подход?
Ну, вы можете поспорить с объектно-ориентированным аспектом, подготовленными утверждениями, тем, что он становится стандартом и т. д. Но я знаю, что в большинстве случаев убеждение кого-то лучше работает с убийственной функцией. Так вот оно что:
Действительно хорошая вещь с PDO - это то, что вы можете получить данные, автоматически вводя их в объект. Если вы не хотите использовать ORM (потому что это просто быстрый скрипт), но вам нравится отображение объектов, это REALLY круто :
class Student {
public $id;
public $first_name;
public $last_name
public function getFullName() {
return $this->first_name.' '.$this->last_name
}
}
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)
$stmt = $dbh->query("SELECT * FROM students");
/* MAGIC HAPPENS HERE */
$stmt->setFetchMode(PDO::FETCH_INTO, new Student);
foreach($stmt as $student)
{
echo $student->getFullName().'<br />';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
Перемещение приложения из одной базы данных в другую не очень распространено, но рано или поздно вы можете обнаружить, что работаете над другим проектом, используя другой RDBMS. Если вы находитесь дома с PDO, то, по крайней мере, одна вещь будет меньше, чтобы узнать в этот момент.
Кроме того, я нахожу PDO API немного более интуитивным, и он чувствует себя более по-настоящему объектно-ориентированным. mysqli кажется, что это просто процедурный API, который был объективирован, если вы понимаете, что я имею в виду. Короче говоря, я считаю, что с PDO легче работать, но это, конечно, субъективно.
Я начал использовать PDO, потому что поддержка операторов, на мой взгляд, лучше. Я использую уровень доступа к данным ActiveRecord-esque, и гораздо проще реализовать динамически генерируемые операторы. Привязка параметров MySQLi должна выполняться в одном вызове функции / метода, поэтому, если вы не знаете до времени выполнения, сколько параметров вы хотите привязать, вы вынуждены использовать call_user_func_array() (я считаю, что это правильное имя функции) для выбора. И забудьте о простой динамической привязке результата.
Больше всего мне нравится PDO, потому что это очень разумный уровень абстракции. Его легко использовать в полностью абстрагированных системах, где вы не хотите писать SQL,но он также позволяет легко использовать более оптимизированный, чистый тип запроса системы или mix-and-match два.
Вот еще что нужно иметь в виду: на данный момент (PHP 5.2) библиотека PDO глючит . Он полон странных насекомых. Например: прежде чем хранить PDOStatement в переменной, переменная должна быть unset() , чтобы избежать тонны ошибок. Большинство из них были исправлены в PHP 5.3, и они будут выпущены в начале 2009 года в PHP 5.3, который, вероятно, будет иметь много других ошибок. Вы должны сосредоточиться на использовании PDO для PHP 6.1, если вы хотите стабильного выпуска и использовать PDO для PHP 5.3, если вы хотите помочь сообществу.
Еще одно заметное (хорошее) отличие от PDO заключается в том, что метод PDO::quote() автоматически добавляет заключающие кавычки, в то время как mysqli::real_escape_string() (и подобные ему) этого не делают:
PDO::quote () помещает кавычки вокруг входной строки (если требуется) и экранирует специальные символы в строке ввода, используя кавычки стиль, соответствующий основному драйверу.
PDO значительно облегчит масштабирование, если ваш сайт / веб-приложение действительно станет таким, как вы можете ежедневно настраивать главные и ведомые соединения для распределения нагрузки по базе данных, плюс PHP движется к переходу на PDO в качестве стандарта.
Масштабирование веб-приложения
В смысле скорости выполнения MySQLi выигрывает, но если у вас нет хорошей оболочки, использующей MySQLi, его функции, связанные с подготовленными инструкциями, ужасны.
В моем все еще есть жучки, но если кто-то хочет этого, вот он .
Короче говоря, если вы ищете увеличение скорости, то MySQLi; если вы хотите простоту использования, то PDO.
Лично я использую PDO, но я думаю, что это в основном вопрос предпочтения.
PDO имеет некоторые особенности, которые помогают agains SQL инъекции (подготовленные заявления), но если вы будете осторожны с вашим SQL вы можете достичь этого с mysqli, тоже.
Перемещение в другую базу данных-это не столько причина для использования PDO. Пока вы не используете "специальные функции SQL", вы можете переключаться с одной функции DB на другую. Однако, как только вы используете, например, "SELECT ... LIMIT 1", вы не можете перейти к MS-SQL, где это "Выберите TOP 1 ...". Так что это все равно проблематично.
Отредактированный ответ.
После некоторого опыта работы с обоими этими APIs, я бы сказал, что есть 2 функции уровня блокировки, которые делают mysqli непригодным для использования с нативными подготовленными инструкциями.
Они уже упоминались в 2 отличных (но все же недооцененных) ответах:
(оба также упоминаются в этом ответе )
По какой-то причине mysqli потерпел неудачу с обоими.
В настоящее время он получил некоторое улучшение для второго ( get_result ), но он работает только на установках mysqlnd, а значит, вы не можете полагаться на эту функцию в своих скриптах.
Тем не менее, он не имеет bind-by-value даже по сей день.
Итак, есть только один выбор: PDO
Все остальные причины, такие как
- именованные заполнители (этот синтаксический сахар сильно переоценен)
- поддержка различных баз данных (никто на самом деле никогда не использовал его)
- fetch into object (просто бесполезный синтаксис))
- разница в скорости (отсутствует)
не имеют никакого существенного значения.
В то же время оба эти APIs не имеют некоторых действительно важных особенностей , таких как
- заполнитель идентификатора
- заполнитель для сложных типов данных, чтобы сделать динамическую привязку менее трудоемкой
- более короткий код приложения.
Итак,чтобы покрыть реальные жизненные потребности, нужно создать свою собственную библиотеку абстракций, основанную на одном из этих APIs, реализующем вручную разбираемые заполнители. В этом случае я бы предпочел mysqli, поскольку он имеет меньший уровень абстракции.
В моем тестовом сценарии каждый метод тестируется 10000 раз и выводится разница общего времени для каждого метода. Вы должны это сделать на своей собственной конфигурации, я уверен, что результаты будут отличаться!
Вот мои результаты:
- "
SELECT NULL" -> PGO()быстрее на ~ 0.35 секунды - "
SHOW TABLE STATUS" -> mysqli()быстрее на ~ 2.3 секунды - "
SELECT * FROM users" -> mysqli()быстрее на ~ 33 секунды
Примечание: при использовании ->fetch_row() для mysqli имена столбцов не добавляются в массив, я не нашел способа сделать это в PGO. Но даже если я использую ->fetch_array(), mysqli немного медленнее, но все же быстрее, чем PGO (за исключением SELECT NULL).
Есть одна вещь, которую нужно иметь в виду.
Mysqli не поддерживает функцию fetch_assoc(), которая возвращала бы столбцы с ключами, представляющими имена столбцов. Конечно, можно написать свою собственную функцию, чтобы сделать это, это даже не очень долго, но мне было очень трудно написать ее (для неверующих: если вам кажется, что это легко, попробуйте ее самостоятельно некоторое время и не обманывайте :) )