- Подключения и управление подключениями
- User Contributed Notes
- PHP Connect to MySQL
- Should I Use MySQLi or PDO?
- MySQL Examples in Both MySQLi and PDO Syntax
- MySQLi Installation
- PDO Installation
- Open a Connection to MySQL
- Example (MySQLi Object-Oriented)
- Example (MySQLi Procedural)
- Example (PDO)
- Close the Connection
- PDO::__construct
- Parameters
- Errors/Exceptions
- Examples
- User Contributed Notes 16 notes
Подключения и управление подключениями
Соединения устанавливаются автоматически при создании объекта PDO от его базового класса. Не имеет значения, какой драйвер вы хотите использовать; вы всегда используете имя базового класса. Конструктор класса принимает аргументы для задания источника данных (DSN), а также необязательные имя пользователя и пароль (если есть).
Пример #1 Подключение к MySQL
В случае возникновения ошибки при подключении будет выброшено исключение PDOException . Его можно перехватить и обработать, либо оставить на откуп глобальному обработчику ошибок, который вы задали функцией set_exception_handler() .
Пример #2 Обработка ошибок подключения
try $dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass );
foreach( $dbh -> query ( ‘SELECT * from FOO’ ) as $row ) print_r ( $row );
>
$dbh = null ;
> catch ( PDOException $e ) print «Error!: » . $e -> getMessage () . «
» ;
die();
>
?>?php
Если ваше приложение не перехватывает исключение PDO конструктора, движок zend выполнит стандартные операции для завершения работы скрипта и вывода обратной трассировки. В этой трассировке будет содержаться детальная информация о соединении с базой данных, включая имя пользователя и пароль. Ответственность за перехват исключений лежит на вас. Перехватить исключение можно явно (с помощью выражения catch ), либо неявно, задав глобальный обработчик ошибок функцией set_exception_handler() .
При успешном подключении к базе данных в скрипт будет возвращён созданный объект PDO. Соединение остаётся активным на протяжении всего времени жизни объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления всех ссылок на него (этого можно добиться, присваивая null всем переменным, указывающим на объект). Если не сделать этого явно, PHP автоматически закроет соединение по окончании работы скрипта.
Замечание: Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement или другие переменные, ссылающиеся на него), они также должны быть удалены (например, присвоением null переменной, ссылающейся на PDOStatement).
Пример #3 Закрытие соединения
$dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass );
// здесь мы каким-то образом используем соединение
$sth = $dbh -> query ( ‘SELECT * FROM foo’ );
?php
// соединение больше не нужно, закрываем
$sth = null ;
$dbh = null ;
?>
Во многих приложениях может оказаться полезным использование постоянных соединений к базам данных. Постоянные соединения не закрываются при завершении работы скрипта, они кешируются и используются повторно, когда другой скрипт запрашивает соединение с теми же учётными данными. Постоянные соединения позволяют избежать создания новых подключений каждый раз, когда требуется обмен данными с базой, что в результате даёт прирост скорости работы таких приложений.
Пример #4 Постоянные соединения
$dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass , array(
PDO :: ATTR_PERSISTENT => true
));
?>?php
Значение параметра PDO::ATTR_PERSISTENT преобразуется в логическое значение ( bool ) (включить/отключить постоянные подключения), если это не числовая строка ( string ), которая в этом случае позволяет использовать несколько пулов постоянных подключений. Это полезно, если разные соединения используют несовместимые настройки, например, разные значения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY .
Замечание:
Чтобы использовать постоянные соединения, необходимо добавить константу PDO::ATTR_PERSISTENT в массив параметров драйвера, который передаётся конструктору PDO. Если просто задать этот атрибут функцией PDO::setAttribute() уже после создания объекта, драйвер не будет использовать постоянные соединения.
Замечание:
Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям текущего процесса; если PDO сам кеширует соединение, то это соединение будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль будет создавать дополнительные подключения для своих нужд.
User Contributed Notes
- PDO
- Введение
- Установка и настройка
- Предопределённые константы
- Подключения и управление подключениями
- Транзакции и автоматическая фиксация изменений
- Подготовленные запросы и хранимые процедуры
- Ошибки и их обработка
- Большие объекты (LOB)
- PDO
- PDOStatement
- PDOException
- Драйверы PDO
PHP Connect to MySQL
PHP 5 and later can work with a MySQL database using:
- MySQLi extension (the «i» stands for improved)
- PDO (PHP Data Objects)
Earlier versions of PHP used the MySQL extension. However, this extension was deprecated in 2012.
Should I Use MySQLi or PDO?
If you need a short answer, it would be «Whatever you like».
Both MySQLi and PDO have their advantages:
PDO will work on 12 different database systems, whereas MySQLi will only work with MySQL databases.
So, if you have to switch your project to use another database, PDO makes the process easy. You only have to change the connection string and a few queries. With MySQLi, you will need to rewrite the entire code — queries included.
Both are object-oriented, but MySQLi also offers a procedural API.
Both support Prepared Statements. Prepared Statements protect from SQL injection, and are very important for web application security.
MySQL Examples in Both MySQLi and PDO Syntax
In this, and in the following chapters we demonstrate three ways of working with PHP and MySQL:
MySQLi Installation
For Linux and Windows: The MySQLi extension is automatically installed in most cases, when php5 mysql package is installed.
PDO Installation
Open a Connection to MySQL
Before we can access data in the MySQL database, we need to be able to connect to the server:
Example (MySQLi Object-Oriented)
$servername = «localhost»;
$username = «username»;
$password = «password»;?php
// Create connection
$conn = new mysqli($servername, $username, $password);// Check connection
if ($conn->connect_error) die(«Connection failed: » . $conn->connect_error);
>
echo «Connected successfully»;
?>Note on the object-oriented example above:
$connect_error was broken until PHP 5.2.9 and 5.3.0. If you need to ensure compatibility with PHP versions prior to 5.2.9 and 5.3.0, use the following code instead:
// Check connection
if (mysqli_connect_error()) die(«Database connection failed: » . mysqli_connect_error());
>Example (MySQLi Procedural)
$servername = «localhost»;
$username = «username»;
$password = «password»;?php
// Create connection
$conn = mysqli_connect($servername, $username, $password);// Check connection
if (!$conn) die(«Connection failed: » . mysqli_connect_error());
>
echo «Connected successfully»;
?>Example (PDO)
$servername = «localhost»;
$username = «username»;
$password = «password»;?php
try $conn = new PDO(«mysql:host=$servername;dbname=myDB», $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo «Connected successfully»;
> catch(PDOException $e) echo «Connection failed: » . $e->getMessage();
>
?>Note: In the PDO example above we have also specified a database (myDB). PDO require a valid database to connect to. If no database is specified, an exception is thrown.
Tip: A great benefit of PDO is that it has an exception class to handle any problems that may occur in our database queries. If an exception is thrown within the try < >block, the script stops executing and flows directly to the first catch() < >block.
Close the Connection
The connection will be closed automatically when the script ends. To close the connection before, use the following:
PDO::__construct
Creates a PDO instance to represent a connection to the requested database.
Parameters
The Data Source Name, or DSN, contains the information required to connect to the database.
In general, a DSN consists of the PDO driver name, followed by a colon, followed by the PDO driver-specific connection syntax. Further information is available from the PDO driver-specific documentation.
The dsn parameter supports three different methods of specifying the arguments required to create a database connection:
dsn contains the full DSN.
dsn consists of uri: followed by a URI that defines the location of a file containing the DSN string. The URI can specify a local file or a remote URL.
uri:file:///path/to/dsnfile
dsn consists of a name name that maps to pdo.dsn. name in php.ini defining the DSN string.
Note:
The alias must be defined in php.ini , and not .htaccess or httpd.conf
The user name for the DSN string. This parameter is optional for some PDO drivers.
The password for the DSN string. This parameter is optional for some PDO drivers.
A key=>value array of driver-specific connection options.
Errors/Exceptions
PDO::__construct() throws a PDOException if the attempt to connect to the requested database fails, regardless of which PDO::ATTR_ERRMODE is currently set.
Examples
Example #1 Create a PDO instance via driver invocation
/* Connect to a MySQL database using driver invocation */
$dsn = ‘mysql:dbname=testdb;host=127.0.0.1’ ;
$user = ‘dbuser’ ;
$password = ‘dbpass’ ;?php
$dbh = new PDO ( $dsn , $user , $password );
Example #2 Create a PDO instance via URI invocation
The following example assumes that the file /usr/local/dbconnect exists with file permissions that enable PHP to read the file. The file contains the PDO DSN to connect to a DB2 database through the PDO_ODBC driver:
odbc:DSN=SAMPLE;UID=john;PWD=mypass
The PHP script can then create a database connection by simply passing the uri: parameter and pointing to the file URI:
/* Connect to an ODBC database using driver invocation */
$dsn = ‘uri:file:///usr/local/dbconnect’ ;
$user = » ;
$password = » ;?php
$dbh = new PDO ( $dsn , $user , $password );
Example #3 Create a PDO instance using an alias
The following example assumes that php.ini contains the following entry to enable a connection to a MySQL database using only the alias mydb :
[PDO] pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
/* Connect to an ODBC database using an alias */
$dsn = ‘mydb’ ;
$user = » ;
$password = » ;?php
$dbh = new PDO ( $dsn , $user , $password );
User Contributed Notes 16 notes
If you override PDO with own class and you want to implement alias from php.ini, you have to get it with `get_cfg_var` instead of `ini_get`.
class PDO extends \ PDO
public function __construct ( string $dsn , ? string $username = null , ? string $password = null , ?array $options = null )
//alias
if (! str_contains ( $dsn , ‘:’ )) $dsn = get_cfg_var ( ‘pdo.dsn.’ . $dsn );
if (! $dsn ) throw new PDOException ( ‘Argument #1 ($dsn) must be a valid data source name’ );
>
>parent :: __construct ( $dsn , $username , $password , $options );
>
>
?>To get UTF-8 charset you can specify that in the DSN.
$link = new PDO(«mysql:host=localhost;dbname=DB;charset=UTF8»);