Подключение к базе данных в PHP через mysql, pdo и mysqli
Прежде чем подключиться к MySQL серверу необходимо определиться с PHP расширением, которое будет использоваться для работы с базой данных. Под расширением понимается драйвер — посредник между сервером базы и программистом. Он содержит набор функций или объектов, которые упрощают работу программиста. На данный момент выделяют 3 основных расширения.
- MySQL;
- MySQLi;
- PDO.
Все 3 расширения являются стандартным набором для любой хорошей хостинг-площадки. Однако, по умолчанию некоторые могут быть отключены в настройках PHP модулей. Информацию о включенных модулях возвращает функция «phpinfo» с параметром «8».
phpinfo(8);
Доступность модуля можно определить с помощью простой конструкции в коде.
if (extension_loaded('mysql')) echo ' mysql доступен '; if (extension_loaded('mysqli')) echo ' mysqli доступен '; if (extension_loaded('PDO')) echo ' pdo доступен ';
Подключение к MySQL через одноименное расширение
Расширение MySQL появилось первым и долгое время не имело конкурентов. Сейчас считается устаревшим и в серьезных проектах не используется. На это есть ряд причин, основными из которых являются плохая оптимизация и безопасность, отсутствие многопоточности. Несмотря на это, оно ещё долго будет поддерживаться большинством хостингов.
Начиная с PHP версии 5.5 многие функции расширения стали устаревшими, а в PHP 7 и вовсе не поддерживаются.
Рассмотрим пример подключения к базе данных с комментариями.
// Подключаемся к серверу БД $mysql = mysql_connect($db_server, $db_user, $db_password); if (!$mysql) { die ('Connection error: ' . mysql_error()); } // Выбираем БД $db = mysql_select_db($db_name, $mysql); if (!$db) { die ('Error select db : ' . mysql_error()); } // Устанавливаем кодировку подключения mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET 'utf8'"); // Запросы ... // Отключаемся от базы mysql_close($mysql);
В качестве запросов используется стандартный SQL. Рассмотрим простые примеры выборки и добавления записей.
// Составляем запрос $sql = 'SELECT * FROM `books` WHERE `BAuthor`="Пушкин"'; $result = mysql_query($sql); // Перебор результата while($row = mysql_fetch_array($result)) { print $row['BName'] . '<br>'; }
В примере производим простую выборку записей из таблицы «books». Результат представлен в качестве ассоциативного массива, поэтому его содержимое можно получить в обычном цикле. Если запрос не возвращает набор данных, то в качестве результата возвращается «false» или «true».
$sql = 'SELECT * FROM `books` WHERE `BAuthor`="Пушкин"'; $result = mysql_query($sql); if ($result) { echo 'Выполнено!'; } else { echo 'Ошибка: ' . mysql_error(); }
Отличие MySQLi от MySQL
MySQLi пришло на смену MySQL. Буква «i» обозначает улучшенный (Improved). Имеет частичную совместимость со старой версией. Поддерживается всеми версиями PHP. Имеет чуть большую скорость работы и лучшую безопасность. Установлено на 99% хостинговых площадках.
Одной из важных особенностей является наличие объектно-ориентированного интерфейса. Если раньше работы с базой данных осуществлялись при помощи интерфейса функций, то теперь можно использовать оба подхода. Рассмотрим пример подключения к базе данных через MySQLi средствами «ООП».
// Пытаемся соединиться $mysqli = new mysqli($db_server, $db_user, $db_password, $db_name); // Проверяем, удалось ли соединение if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } // Устанавливаем кодировку подключения $mysqli->set_charset('utf8'); // Формируем запрос $sql = 'SELECT * FROM `books` WHERE `BAuthor`="Пушкин"'; $result = $mysqli->query($sql); // Перебор результата while($row = $result->fetch_object()) { print $row->BName .'<br>'; } // Освобождаем память $result->free(); // Закрываем соединение $mysqli->close();
Так осуществляется простая выборка названий книг из поля «BName» таблицы «books». Вставка и обновление существующих записей так же не отличается сложностью.
$sql = 'UPDATE `books` SET `BPrice` = "99" WHERE `BId`=1'; $result = $mysqli->query($sql); print ($result)?'Success!':'Error : ('. $mysqli->errno .') '. $mysqli->error;
В конце запроса осуществляем проверку, удалось ли обновить запись.
Подключение к базе через PDO
PDO — расширение для PHP, которое расшифровывается как PHP Data Objects. Его особенностью является повышенная безопасность и универсальный интерфейс работы с различными базами данных. Другими словами, если с помощью MySQLi можно создавать запросы только для MySQL сервера, то PDO позволяет работать с различными серверами используя один и тот же синтаксис запросов. Это удобно если разработчик заранее не знает под управлением какого сервера будет работать конечный продукт.
У PDO есть свой механизм соединения с базой данных — «DSN» (Data Source Name). Кроме адреса сервера, логина и пароля, он должен принять тип базы данных. Посмотрим пример подключения.
$dsn = "mysql:host=$db_server;dbname=$db_name;charset=utf8"; // Параметры задают что в качестве ответа получаем ассоциативный массив $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); // Проверка корректности подключения try { $pdo = new PDO($dsn, $db_user, $db_password, $opt); } catch (PDOException $e) { die('Подключение не удалось: ' . $e->getMessage()); } // Формируем запрос $sql = 'SELECT * FROM `Real_Polls`'; $result = $pdo->query($sql); // Перебор и вывод результатов while ($row = $result->fetch()) { echo $row['p_poll'] . "\n"; } // Закрываем соединение $pdo = NULL;
Точно так же осуществляются и другие действия с записями и таблицами. Только меняем SQL запрос и вызываем выполнение методом «exec».
$sql = 'UPDATE `books` SET `BPrice` = "99" WHERE `BId`=1'; $result = $pdo->exec($sql);
Метод «exec» в отличии от «query» не может получать данные из базы данных. Он возвращает количество записей, которые были затронуты в результате работы SQL запроса.