The 5th Annual China PHP Conference

Выбор API

PHP предоставляет три различных API для доступа к MySQL. Ниже показаны API, предоставляемые расширениями mysql, mysqli и PDO. В каждом примере кода создается соединение с сервером MySQL запущенном на сервере "example.com" с использованием логина "user" и пароля "password" и выполняется запроса к нему.

Пример #1 Сравнение трех MySQL API

<?php
// mysqli
$mysqli = new mysqli("example.com""user""password""database");
$result $mysqli->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row $result->fetch_assoc();
echo 
htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database''user''password');
$statement $pdo->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row $statement->fetch(PDO::FETCH_ASSOC);
echo 
htmlentities($row['_message']);

// mysql
$c mysql_connect("example.com""user""password");
mysql_select_db("database");
$result mysql_query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row mysql_fetch_assoc($result);
echo 
htmlentities($row['_message']);
?>

Рекомендованные API

Рекомендуется использовать mysqli или PDO_MySQL. Не рекомендуется использовать старое расширение mysql ,так как оно объявлено устаревшим в PHP 5.5.0 и окончательно убрано в PHP 7. Детальная матрица сравнения представлена ниже. Общая производительность всех трех расширений примерно одинакова. Производительность расширения привносит крайне малую лепту в общую длительность выполнения веб-запроса, обычно не более 0.1%.

Сравнение возможностей

  ext/mysqli PDO_MySQL ext/mysql
Появилось в версии PHP 5.0 5.1 2.0
Работает в PHP 5.x Да Да Да
Работает в PHP 7.x Да Да Нет
Статус разработки Активный Активный Поддержка в 5.x; убрано в 7.x
Жизненный цикл Активный Активный Устаревшее в 5.x; убрано в 7.x
Рекомендовано для новых проектов Да Да Нет
ООП интерфейс Да Да Нет
Процедурный интерфейс Да Нет Да
API поддерживает асинхронные, неблокирующие запросы mysqlnd Да Нет Нет
Постоянные(persistent) соединения Да Да Да
API поддерживает кодировки(charset) Да Да Да
API поддерживает подготовленные запросы на стороне сервера Да Да Нет
API поддерживает подготовленные запросы на стороне клиента Нет Да Нет
API подерживает хранимые процедуры Да Да Нет
API поддерживает множественные запросы Да Большинство нет
API поддерживает транзакции Да Да нет
Можно контролировать транзакции посредством SQL Да Да Да
Поддерживает всю функциональность MySQL 5.1+ Да Большинство нет
add a note add a note

User Contributed Notes 4 notes

up
31
alvaro at demogracia dot com
4 years ago
Apart from the feature list, I suggest you try out both MySQLi and PDO and find out what API design you like most. MySQLi is more powerful and probably more complex to learn. PDO is more elegant and has the advantage that you only need to learn one PHP API if you need to work with different DBMS in the future.
up
1
Anonymous
4 months ago
These are quite possibly the most paradoxical lines in this table:

API supports non-blocking, asynchronous queries with mysqlnd
     ext/mysqli: Yes     PDO_MySQL: No
API supports client-side Prepared Statements
     ext/mysqli: No     PDO_MySQL: Yes

Apparently it's either asynchronous I/O or the security of bound parameters.
up
-4
michaeln at associations plus dot see eh
4 years ago
Another useful consideration to keep in mind when choosing your library is how extensible it is. Chances are, in any sufficiently advanced development scenario, you're going to be extending your database access class to add a method (or multiple methods) for how to handle database errors and alert the development team of errors and whether to have the code fail immediately or fail gracefully serving the user a user-friendly failure notice.

For example, I have a class where I have added extra parameters to the query() function (and a few others), which accept the __FILE__ and __LINE__ constants to facilitate tracking issues. If this were not reasonably possible with PDO-mysql for example (not sure, never used it), it may make one option or the other much less likely to be viable for your usage case.
up
-90
Anonymous
1 year ago
My suggestion will be to use a library that hides the internals of the specific extension.  For example, now that in php 5.5 mysql is deprecated, if you were using  PHP Adodb, all you had to do is

go from : $cn = NewADOConnection('mysql') to $cn = NewADOConnection('mysqli');

This is a huge benefit. Also if you are changing your database from mysql to sql or oracle, is just changing one parameter.  I wish someone told me this when I started.
To Top