SunshinePHP Developer Conference 2015

Choosing an API

PHP offers three different APIs to connect to MySQL. Below we show the APIs provided by the mysql, mysqli, and PDO extensions. Each code snippet creates a connection to a MySQL server running on "example.com" using the username "user" and the password "password". And a query is run to greet the user.

Przykład #1 Comparing the three MySQL APIs

<?php
// mysqli
$mysqli = new mysqli("example.com""user""password""database");
$result $mysqli->query("SELECT 'Hello, dear MySQL user!' 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 'Hello, dear MySQL user!' 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 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row mysql_fetch_assoc($result);
echo 
htmlentities($row['_message']);
?>

Recommended API

It is recommended to use either the mysqli or PDO_MySQL extensions. It is not recommended to use the old mysql extension for new development. A detailed feature comparison matrix is provided below. The overall performance of all three extensions is considered to be about the same. Although the performance of the extension contributes only a fraction of the total run time of a PHP web request. Often, the impact is as low as 0.1%.

Feature comparison

  ext/mysqli PDO_MySQL ext/mysql
PHP version introduced 5.0 5.1 2.0
Included with PHP 5.x Yes Yes Yes
Development status Active Active Maintenance only
Lifecycle Active Active Long term deprecation announced
Recommended for new projects Yes Yes No
OOP Interface Yes Yes No
Procedural Interface Yes No Yes
API supports non-blocking, asynchronous queries with mysqlnd Yes No No
Persistent Connections Yes Yes Yes
API supports Charsets Yes Yes Yes
API supports server-side Prepared Statements Yes Yes No
API supports client-side Prepared Statements No Yes No
API supports Stored Procedures Yes Yes No
API supports Multiple Statements Yes Most No
API supports Transactions Yes Yes No
Transactions can be controlled with SQL Yes Yes Yes
Supports all MySQL 5.1+ functionality Yes Most No
add a note add a note

User Contributed Notes 4 notes

up
15
azizsaleh at gmail dot com
6 months ago
mysql_* functions are deprecated and will be removed from future versions in PHP. If you have an existing codebase that you are moving to such PHP version and is having a hard time converting to PDO/MySQLI you can use a PDO wrapper for all mysql_* functions found on github: https://github.com/azizsaleh/mysql
up
12
alvaro at demogracia dot com
2 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
9
michaeln at associations plus dot see eh
1 year 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
4
roland at mxchange dot org
1 year ago
To solve PDO limitations as described by michaeln at associations plus dot see eh, you may try to overwrite PDO methods:

<?php
class MyPdo extends PDO {
// What ever parameters PDO wants + prepend some own:
public function query($caller, $line, $foo, $bar, $bazz) {
// Do your stuff here with $caller, $line (e.g. logging for debug purposes)
// Then call the extended method
return parent::QUERY($foo, $bar, $bazz) or $this->myErrorHandler($caller, $line, $someSqlToLog);
}
}
?>

This is only a very basic example. You may otherwise choose to "wrap" the PDO class and save an instance of the "underlaying" PDO class inside the wrapper class. This is maybe a little more complex approach but allows you to have on interfaces in class signature + way better flexibility.
To Top