Соединение с SQL сервером через PHP: подробное руководство

Раздел: Базы данных -> Работа с базами данных SQL в PHP

Работа с базами данных — неотъемлемая часть веб-приложений. Для выполнения запросов к SQL серверу из PHP существует несколько подходов. В этой статье рассмотрены основные варианты подключения, их преимущества и типичные ошибки.

Основные способы подключения

Как организовать универсальное и безопасное подключение к MySQL, PostgreSQL и другим СУБД?

Наиболее эффективное решение — использование расширения PDO (PHP Data Objects). Оно предоставляет единый интерфейс для работы с разными базами данных, поддерживает подготовленные запросы, транзакции и удобную обработку ошибок через исключения.

try {
    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
    $user = 'dbuser';
    $password = 'dbpass';
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new PDO($dsn, $user, $password, $options);
    echo "Подключение установлено успешно.";
} catch (PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}

Php sql insert (insert в php)

В этом примере создаётся объект PDO с DSN-строкой, содержащей тип СУБД, хост, имя базы данных и кодировку. Параметры задают режим ошибок (исключения), способ выборки по умолчанию и отключают эмуляцию подготовленных запросов для повышения безопасности.

Частая проблема:

Если драйвер PDO для нужной СУБД не установлен, возникнет исключение "could not find driver". Решение — проверить список установленных драйверов через phpinfo() и при необходимости установить недостающий (например, php-mysql или php-pgsql).

Как подключиться к MySQL через расширение MySQLi?

Расширение MySQLi (MySQL Improved) предназначено исключительно для MySQL. Доступны процедурный и объектно-ориентированный стили. Оно поддерживает подготовленные запросы и транзакции.

Объектно-ориентированный вариант:

$mysqli = new mysqli('localhost', 'dbuser', 'dbpass', 'testdb');
if ($mysqli->connect_error) {
    die("Ошибка подключения: " . $mysqli->connect_error);
}
echo "Подключение выполнено. Версия сервера: " . $mysqli->server_info;
$mysqli->close();

Sql where php (условие where в sql-запросах php)

Процедурный вариант:

$link = mysqli_connect('localhost', 'dbuser', 'dbpass', 'testdb');
if (!$link) {
    die("Ошибка соединения: " . mysqli_connect_error());
}
echo "Соединение установлено.";
mysqli_close($link);

Sql инъекция php (sql-инъекции в php)

Типичные ошибки:

  • Игнорирование проверки connect_error — код продолжает выполняться, что может привести к неожиданным ошибкам.
  • Отсутствие вызова set_charset() для установки корректной кодировки — данные могут отображаться некорректно. Рекомендуется сразу после подключения выполнять: $mysqli->set_charset('utf8mb4');

Как подключиться к MySQL с помощью устаревшего расширения mysql_*?

Расширение mysql_* (начиная с PHP 5.5 помечено устаревшим, удалено в PHP 7.0) использовать не рекомендуется из-за отсутствия поддержки подготовленных запросов и низкой безопасности. Однако в старых проектах может встречаться такой код:

$link = mysql_connect('localhost', 'dbuser', 'dbpass');
if (!$link) {
    die('Не удалось подключиться: ' . mysql_error());
}
mysql_select_db('testdb', $link);
echo 'Подключение успешно.';
mysql_close($link);

Sql php id (использование id в sql-запросах php)

Проблема:

Это расширение не поддерживает подготовленные запросы, что делает приложение уязвимым для SQL-инъекций. В современных проектах его следует заменить на PDO или MySQLi.

Как подключиться к другим СУБД (PostgreSQL, SQLite) через PDO?

PDO позволяет менять только DSN-строку. Например, для PostgreSQL:

$dsn = 'pgsql:host=localhost;port=5432;dbname=testdb;user=dbuser;password=dbpass';
$pdo = new PDO($dsn);

переменную sql php (использование переменных в sql-запросах php)

Для SQLite (файл базы данных):

$dsn = 'sqlite:/path/to/database.db';
$pdo = new PDO($dsn);

При этом все остальные методы работы (подготовленные запросы, транзакции) остаются одинаковыми.

- Php ms sql (работа с ms sql в php)
- Php database sql (работа с базами данных sql в php)
- Php sql table (работа с таблицами sql в php)

Дополнительные примеры помогут глубже разобраться в особенностях подключения.

1. Подключение с использованием конфигурационного файла

Параметры подключения удобно хранить в отдельном файле config.php:

Пример
// config.php
return [
    'host' => 'localhost',
    'dbname' => 'testdb',
    'user' => 'dbuser',
    'password' => 'dbpass',
    'charset' => 'utf8mb4'
];
Пример
// connect.php
$config = require 'config.php';
try {
    $dsn = "mysql:host={$config['host']};dbname={$config['dbname']};charset={$config['charset']}";
    $pdo = new PDO($dsn, $config['user'], $config['password']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Подключение через конфиг выполнено.";
} catch (PDOException $e) {
    echo "Ошибка конфигурации: " . $e->getMessage();
}

2. Обработка ошибок подключения при помощи исключений

В PDO можно задать разный режим сообщения об ошибках. Режим исключений (ERRMODE_EXCEPTION) позволяет перехватывать все ошибки через try-catch:

Пример
try {
    $pdo = new PDO('mysql:host=invalid_host', 'user', 'pass');
} catch (PDOException $e) {
    echo "Не удалось подключиться: " . $e->getMessage();
    // запись в лог
    error_log($e->getMessage());
}

Результат выполнения (пример вывода):

Не удалось подключиться: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

3. Подключение с помощью PDO и установка кодировки

Кодировка важна при работе с кириллицей. Задавать её можно в DSN или через метод exec:

Пример
$dsn = 'mysql:host=localhost;dbname=testdb';
$pdo = new PDO($dsn, 'user', 'pass', [
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
]);
// или отдельно:
$pdo->exec("SET NAMES utf8mb4");

Этот подход гарантирует, что все данные будут передаваться в правильной кодировке.

4. Подключение через MySQLi с установкой кодировки и выбором режима ошибок

Пример
$mysqli = new mysqli('localhost', 'user', 'pass', 'testdb');
if ($mysqli->connect_error) {
    die("Connect Error: " . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); // возвращать числа как числа, а не строки
echo "Подключение установлено.";
// Использование ...
$mysqli->close();

5. Использование пула соединений (persistent connections)

Постоянные соединения могут повысить производительность в высоконагруженных системах. Для PDO используется флаг PDO::ATTR_PERSISTENT:

Пример
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass', [
    PDO::ATTR_PERSISTENT => true
]);

Для MySQLi объектно-ориентированный стиль не поддерживает постоянные соединения; используется процедурный вариант с префиксом p::

Пример
$link = mysqli_connect('p:localhost', 'user', 'pass', 'testdb');

Следует помнить, что постоянные соединения могут привести к исчерпанию лимитов на стороне сервера баз данных при неправильной настройке.

6. Подключение к нескольким базам данных в одном скрипте

Пример
$dsn1 = 'mysql:host=localhost;dbname=db1;charset=utf8mb4';
$dsn2 = 'mysql:host=localhost;dbname=db2;charset=utf8mb4';
$pdo1 = new PDO($dsn1, 'user', 'pass');
$pdo2 = new PDO($dsn2, 'user', 'pass');
// Использование $pdo1 и $pdo2 отдельно

7. Подключение с использованием SSL/TLS для MySQL

Для безопасного соединения с сервером MySQL через SSL:

Пример
$pdo = new PDO(
    'mysql:host=localhost;dbname=testdb',
    'user',
    'pass',
    [
        PDO::MYSQL_ATTR_SSL_CA    => '/path/to/ca-cert.pem',
        PDO::MYSQL_ATTR_SSL_CERT  => '/path/to/client-cert.pem',
        PDO::MYSQL_ATTR_SSL_KEY   => '/path/to/client-key.pem'
    ]
);

Параметры SSL задаются при создании объекта PDO и должны соответствовать сертификатам на сервере.

Подключение к SQL в PHP - comments

En
Php sql connect (php)