Что лучше: mysql или mysqli или pdo (а также mysqli_real_escape_string или mysqli_prepare)?
Здравствуйте!
Использоваться будет MySQL и вряд ли когда-либо будет переход на другую базу данных.
mysql - устарел и не поддерживается;
mysqli - как я понял, рекомендуется разработчиками php;
pdo - по различным данным, немного медленнее mysqli, но есть свои плюсы, именованные плейсхолдеры, смена типа БД и др.
Я остановился на mysqli, но тут другой вопрос, что лучше использовать, по старинке mysqli_query+mysqli_real_escape_string или mysqli_prepare+mysqli_stmt_bind_param+mysqli_stmt_execute и т.д.
С точки зрения безопасности, конечно второй вариант лучше, но и первый, если быть внимательным, тоже не уступает в безопасности, зато, как я понял, экономится один запрос в базу данных (PREPARE).
Я делал тесты производительности с повтором одних и тех же запросов 50 раз, в запросе с limit 20 получаются результаты ~0.026 и ~0.032 соответственно, выиграл 1 вариант.
А с limit 200 получилось ~0.110 и ~0.100 соответственно, выиграл 2 вариант.
Запросов с малым количеством строк для вывода будет меньше, то есть получается 1 вариант, предпочтительнее... Выслушаю различные мнения. Спасибо!
Исходя из обширного опыта использования PDO - 3 вариант лучше. Потому что:
1. PDO работает с разными базами данных. В случае необходимости легко будет переключиться с mysql, например, на postgres.
2. Используя PDO вы забываете о SQL-инъекциях (по крайней мере 1-уровня).
3. Поверх PDO можно использовать ActiveRecord или DAO, что значительно сокращает время разработки конечного продукта.
Есть и другие достоинства, но эти, как мне кажется, наиболее весомы.
Для меня предпочтительнее производительность, чем быстрая смена базы, тем более не всегда ее можно быстро сменить, даже с PDO, все равно некоторые правки, скорее всего потребуются.
2 пункт и в mysqli есть.
3 пункт, как я понимаю, также замедлит выполнение, хотя, конечно, эта каша из строк по подготовке переменных, выполнение и т.п. выглядела бы более опрятно...
Прелесть. Все суеверия в одном месте. "легко перейти с одного диалекта SQL на другой" никто в реальности не пробовал, но все друг другу рассказывают, как это просто. Используя PDO руками, которые растут из плеч, вы забываете об SQL-инъекциях (любых). Поверх mysqli, видимо, ActiveRecord или DAO использовать нельзя. Госдума законом запретила.
1. Из всего вышеперечисленного в сабже лучше PDO, т.к. он работает со многими БД, у него простой ОО-интерфейс, он довольно шустрый. MySQL (mysql_* команды) драйвер забудь как страшный сон, его давно уже не поддерживают, сделали вместо этого MySQLi. А MySQLi имеет 2 интерфейса - процедурный и ОО-шный, для меня он был некой переходной точкой от MySQL драйвера до PDO
2. Запросы напрямую через драйвер БД не делай! Для этого есть ORM и DB-врапперы, мне очень нравится у PHPixie - https://github.com/dracony/PHPixie-DB (его в принципе можно использовать и без фреймворка, просто как библиотеку, только немного переписать придется). После этого забудь про *_real_escape_string() и т.п.
Но ведь PHPixie, также снижает производительность, ради удобства.
Единственное, что мне не понравилось в mysqli, если есть заданные параметры (bind_param), то для получения строк ответа, нужно обязательно делать заданные результаты через bind_result и только потом цикл, то есть нельзя использовать fetch_assoc, если используются заданные параметры, если я все правильно понял...
MySQL - уже считается устаревшим, дальнейшее его использование сулит проблемы с поддержкой.
Mysqli побыстрее PDO, но у PDO есть одно весомое преимущество - в некоторых случаях можно делать несколько действий одним запросом. Это заявка на лидерство. Если скорость работы Mysqli и PDO отличаются на десятитысячные секунды, то 1 или 2 запроса отличаются на сотые секунды.
mysqlli так же умеет делать несколько запросов. Грубо говоря PDO это обертка над mysqli и как следствие все что может делать PDO с mysql - может делать и сам mysqlli