Подключение к базе данных в PHP через mysql, pdo и mysqli

Подключение к базе данных в PHP через mysql, pdo и mysqli
Комментарии: 4

Прежде чем подключиться к 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 запроса.

Темы:
SQLPHP
Ещё интересное — 6
Комментарии —
  1. Валентин
    Валентин01 марта 2019, 17:34#
    Чуть не обосрался, когда пролетело привидение)
    1. Andy Si02 марта 2019, 11:48#
      Ничего, оно доброе :)
    2. Валентин
      Валентин01 марта 2019, 17:57#
      Да, и спасибо за статью. Направила меня куда надо)
      1. Сергей
        Сергей20 марта 2020, 00:56#
        Автор жжёт :-)
        © REALADMIN.RU   2024 г.
        Страница сгенерирована: 0,1907 s | 4 mb.
        На каком уровне Вы играете в шахматы?
        OPROS