mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-15 16:38:54 +00:00

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@329924 c90b9560-bf6c-de11-be94-00142212c4b1
492 lines
15 KiB
XML
492 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<chapter xml:id="mysqli.overview" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
|
|
<title>Overview</title>
|
|
|
|
<para>
|
|
This section provides an introduction to the options available to
|
|
you when developing a PHP application that needs to interact with a
|
|
MySQL database.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is an API?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
An Application Programming Interface, or API, defines the classes,
|
|
methods, functions and variables that your application will need to
|
|
call in order to carry out its desired task. In the case of PHP
|
|
applications that need to communicate with databases the necessary
|
|
APIs are usually exposed via PHP extensions.
|
|
</para>
|
|
|
|
<para>
|
|
APIs can be procedural or object-oriented. With a procedural API you
|
|
call functions to carry out tasks, with the object-oriented API you
|
|
instantiate classes and then call methods on the resulting objects.
|
|
Of the two the latter is usually the preferred interface, as it is
|
|
more modern and leads to better organized code.
|
|
</para>
|
|
|
|
<para>
|
|
When writing PHP applications that need to connect to the MySQL
|
|
server there are several API options available. This document
|
|
discusses what is available and how to select the best solution for
|
|
your application.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is a Connector?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
In the MySQL documentation, the term <emphasis>connector</emphasis>
|
|
refers to a piece of software that allows your application to
|
|
connect to the MySQL database server. MySQL provides connectors for
|
|
a variety of languages, including PHP.
|
|
</para>
|
|
|
|
<para>
|
|
If your PHP application needs to communicate with a database server
|
|
you will need to write PHP code to perform such activities as
|
|
connecting to the database server, querying the database and other
|
|
database-related functions. Software is required to provide the API
|
|
that your PHP application will use, and also handle the
|
|
communication between your application and the database server,
|
|
possibly using other intermediate libraries where necessary. This
|
|
software is known generically as a connector, as it allows your
|
|
application to <emphasis>connect</emphasis> to a database server.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is a Driver?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
A driver is a piece of software designed to communicate with a
|
|
specific type of database server. The driver may also call a
|
|
library, such as the MySQL Client Library or the MySQL Native
|
|
Driver. These libraries implement the low-level protocol used to
|
|
communicate with the MySQL database server.
|
|
</para>
|
|
|
|
<para>
|
|
By way of an example, the <link linkend="mysqli.overview.pdo">PHP
|
|
Data Objects (PDO)</link> database abstraction layer may use one of
|
|
several database-specific drivers. One of the drivers it has
|
|
available is the PDO MYSQL driver, which allows it to interface with
|
|
the MySQL server.
|
|
</para>
|
|
|
|
<para>
|
|
Sometimes people use the terms connector and driver interchangeably,
|
|
this can be confusing. In the MySQL-related documentation the term
|
|
<quote>driver</quote> is reserved for software that provides
|
|
the database-specific part of a connector package.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is an Extension?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
In the PHP documentation you will come across another term -
|
|
<emphasis>extension</emphasis>. The PHP code consists of a core,
|
|
with optional extensions to the core functionality. PHP's
|
|
MySQL-related extensions, such as the <literal>mysqli</literal>
|
|
extension, and the <literal>mysql</literal> extension, are
|
|
implemented using the PHP extension framework.
|
|
</para>
|
|
|
|
<para>
|
|
An extension typically exposes an API to the PHP programmer, to
|
|
allow its facilities to be used programmatically. However, some
|
|
extensions which use the PHP extension framework do not expose an
|
|
API to the PHP programmer.
|
|
</para>
|
|
|
|
<para>
|
|
The PDO MySQL driver extension, for example, does not expose an API
|
|
to the PHP programmer, but provides an interface to the PDO layer
|
|
above it.
|
|
</para>
|
|
|
|
<para>
|
|
The terms API and extension should not be taken to mean the same
|
|
thing, as an extension may not necessarily expose an API to the
|
|
programmer.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What are the main PHP API offerings for using
|
|
MySQL?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
There are three main API options when considering connecting to a
|
|
MySQL database server:
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
|
|
<listitem>
|
|
<para>
|
|
PHP's MySQL Extension
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
PHP's mysqli Extension
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
PHP Data Objects (PDO)
|
|
</para>
|
|
</listitem>
|
|
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
Each has its own advantages and disadvantages. The following
|
|
discussion aims to give a brief introduction to the key aspects of
|
|
each API.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is PHP's MySQL Extension?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
This is the original extension designed to allow you to develop PHP
|
|
applications that interact with a MySQL database. The
|
|
<literal>mysql</literal> extension provides a procedural interface
|
|
and is intended for use only with MySQL versions older than 4.1.3.
|
|
This extension can be used with versions of MySQL 4.1.3 or newer,
|
|
but not all of the latest MySQL server features will be available.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
If you are using MySQL versions 4.1.3 or later it is
|
|
<emphasis>strongly</emphasis> recommended that you use the
|
|
<literal>mysqli</literal> extension instead.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
The <literal>mysql</literal> extension source code is located in the
|
|
PHP extension directory <filename>ext/mysql</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
For further information on the <literal>mysql</literal> extension,
|
|
see <xref linkend="book.mysql"/>.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is PHP's mysqli Extension?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
The <literal>mysqli</literal> extension, or as it is sometimes
|
|
known, the MySQL <emphasis>improved</emphasis> extension, was
|
|
developed to take advantage of new features found in MySQL systems
|
|
versions 4.1.3 and newer. The <literal>mysqli</literal> extension is
|
|
included with PHP versions 5 and later.
|
|
</para>
|
|
|
|
<para>
|
|
The <literal>mysqli</literal> extension has a number of benefits,
|
|
the key enhancements over the <literal>mysql</literal> extension
|
|
being:
|
|
|
|
<itemizedlist>
|
|
|
|
<listitem>
|
|
<para>
|
|
Object-oriented interface
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
Support for Prepared Statements
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
Support for Multiple Statements
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
Support for Transactions
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
Enhanced debugging capabilities
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
Embedded server support
|
|
</para>
|
|
</listitem>
|
|
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
If you are using MySQL versions 4.1.3 or later it is
|
|
<emphasis>strongly</emphasis> recommended that you use this
|
|
extension.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
As well as the object-oriented interface the extension also provides
|
|
a procedural interface.
|
|
</para>
|
|
|
|
<para>
|
|
The <literal>mysqli</literal> extension is built using the PHP
|
|
extension framework, its source code is located in the directory
|
|
<filename>ext/mysqli</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
For further information on the <literal>mysqli</literal> extension,
|
|
see <xref linkend="book.mysqli"/>.
|
|
</para>
|
|
|
|
<para xml:id="mysqli.overview.pdo">
|
|
<emphasis role="bold">What is PDO?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
PHP Data Objects, or PDO, is a database abstraction layer
|
|
specifically for PHP applications. PDO provides a consistent API for
|
|
your PHP application regardless of the type of database server your
|
|
application will connect to. In theory, if you are using the PDO
|
|
API, you could switch the database server you used, from say
|
|
Firebird to MySQL, and only need to make minor changes to your PHP
|
|
code.
|
|
</para>
|
|
|
|
<para>
|
|
Other examples of database abstraction layers include JDBC for Java
|
|
applications and DBI for Perl.
|
|
</para>
|
|
|
|
<para>
|
|
While PDO has its advantages, such as a clean, simple, portable API,
|
|
its main disadvantage is that it doesn't allow you to use all of the
|
|
advanced features that are available in the latest versions of MySQL
|
|
server. For example, PDO does not allow you to use MySQL's support
|
|
for Multiple Statements.
|
|
</para>
|
|
|
|
<para>
|
|
PDO is implemented using the PHP extension framework, its source
|
|
code is located in the directory <filename>ext/pdo</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
For further information on PDO, see the
|
|
<xref linkend="book.pdo"/>.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis role="bold">What is the PDO MYSQL driver?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
The PDO MYSQL driver is not an API as such, at least from the PHP
|
|
programmer's perspective. In fact the PDO MYSQL driver sits in the
|
|
layer below PDO itself and provides MySQL-specific functionality.
|
|
The programmer still calls the PDO API, but PDO uses the PDO MYSQL
|
|
driver to carry out communication with the MySQL server.
|
|
</para>
|
|
|
|
<para>
|
|
The PDO MYSQL driver is one of several available PDO drivers. Other
|
|
PDO drivers available include those for the Firebird and PostgreSQL
|
|
database servers.
|
|
</para>
|
|
|
|
<para>
|
|
The PDO MYSQL driver is implemented using the PHP extension
|
|
framework. Its source code is located in the directory
|
|
<filename>ext/pdo_mysql</filename>. It does not expose an API to the
|
|
PHP programmer.
|
|
</para>
|
|
|
|
<para>
|
|
For further information on the PDO MYSQL driver, see
|
|
<xref linkend="ref.pdo-mysql"/>.
|
|
</para>
|
|
|
|
<para xml:id="mysqli.overview.mysqlnd">
|
|
<emphasis role="bold">What is PHP's MySQL Native Driver?</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
In order to communicate with the MySQL database server the
|
|
<literal>mysql</literal> extension, <literal>mysqli</literal> and
|
|
the PDO MYSQL driver each use a low-level library that implements
|
|
the required protocol. In the past, the only available library was
|
|
the MySQL Client Library, otherwise known as
|
|
<literal>libmysqlclient</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
However, the interface presented by <literal>libmysqlclient</literal> was
|
|
not optimized for communication with PHP applications, as
|
|
<literal>libmysqlclient</literal> was originally designed with C
|
|
applications in mind. For this reason the MySQL Native Driver,
|
|
<literal>mysqlnd</literal>, was developed as an alternative to
|
|
<literal>libmysqlclient</literal> for PHP applications.
|
|
</para>
|
|
|
|
<para>
|
|
The <literal>mysql</literal> extension, the
|
|
<literal>mysqli</literal> extension and the PDO MySQL driver can
|
|
each be individually configured to use either
|
|
<literal>libmysqlclient</literal> or <literal>mysqlnd</literal>. As
|
|
<literal>mysqlnd</literal> is designed specifically to be utilised
|
|
in the PHP system it has numerous memory and speed enhancements over
|
|
<literal>libmysqlclient</literal>. You are strongly encouraged to take
|
|
advantage of these improvements.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
The MySQL Native Driver can only be used with MySQL server
|
|
versions 4.1.3 and later.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
The MySQL Native Driver is implemented using the PHP extension
|
|
framework. The source code is located in
|
|
<filename>ext/mysqlnd</filename>. It does not expose an API to the
|
|
PHP programmer.
|
|
</para>
|
|
|
|
<!-- TODO
|
|
<para>
|
|
For further information on the MySQL Native Driver, see
|
|
<xref linkend="book.mysqlnd"/>.
|
|
</para>
|
|
-->
|
|
|
|
<para>
|
|
<emphasis role="bold">Comparison of Features</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
The following table compares the functionality of the three main
|
|
methods of connecting to MySQL from PHP:
|
|
</para>
|
|
|
|
<table>
|
|
<title>Comparison of MySQL API options for PHP</title>
|
|
<tgroup cols="4">
|
|
<colspec colwidth="25*"/>
|
|
<colspec colwidth="25*"/>
|
|
<colspec colwidth="25*"/>
|
|
<colspec colwidth="25*"/>
|
|
<thead>
|
|
<row>
|
|
<entry></entry>
|
|
<entry>PHP's mysqli Extension</entry>
|
|
<entry>PDO (Using PDO MySQL Driver and MySQL Native Driver)</entry>
|
|
<entry>PHP's MySQL Extension</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>PHP version introduced</entry>
|
|
<entry>5.0</entry>
|
|
<entry>5.0</entry>
|
|
<entry>Prior to 3.0</entry>
|
|
</row>
|
|
<row>
|
|
<entry>Included with PHP 5.x</entry>
|
|
<entry>yes</entry>
|
|
<entry>yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>MySQL development status</entry>
|
|
<entry>Active development</entry>
|
|
<entry>Active development as of PHP 5.3</entry>
|
|
<entry>Maintenance only</entry>
|
|
</row>
|
|
<row>
|
|
<entry>Recommended by MySQL for new projects</entry>
|
|
<entry>Yes - preferred option</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>API supports Charsets</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>API supports server-side Prepared Statements</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>API supports client-side Prepared Statements</entry>
|
|
<entry>No</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>API supports Stored Procedures</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>API supports Multiple Statements</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Most</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>Supports all MySQL 4.1+ functionality</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Most</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
<!--
|
|
<para>
|
|
<emphasis role="bold">Further information</emphasis>
|
|
</para>
|
|
|
|
<para>
|
|
The PHP distribution and documentation are available from the
|
|
<link xlink:href="http://www.php.net/">PHP Web site</link>.
|
|
</para>
|
|
-->
|
|
</chapter>
|