Подключение к базе данных MySQL из PHP
Способы установки соединения с MySQL в PHP
Как создать подключение к MySQL с помощью объектно-ориентированного mysqli?
Класс mysqli предоставляет современный интерфейс. Конструктор принимает имя хоста, имя пользователя, пароль, имя базы данных, порт и сокет.
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
Php mysql open (открытие соединения с mysql в php)
После создания соединения следует проверить свойство connect_errno. При ошибке выводится сообщение с помощью connect_error.
if ($mysqli->connect_errno) {
die('Ошибка подключения: ' . $mysqli->connect_error);
}
Типичная ошибка - неправильный пароль или хост. Проверяйте логины и разрешения пользователя MySQL. Также может потребоваться указать порт, если используется нестандартный (например, 3307).
Как использовать процедурный стиль mysqli для соединения?
Функция mysqli_connect() возвращает объект соединения. Параметры аналогичны.
$link = mysqli_connect('localhost', 'user', 'password', 'database');
if (!$link) {
die('Ошибка: ' . mysqli_connect_error());
}
Процедурный стиль удобен для простых скриптов, но в современных проектах предпочтительнее объектно-ориентированный подход.
При использовании процедурного стиля легко забыть проверить возвращаемое значение. Всегда используйте проверку через mysqli_connect_errno().
Как открыть соединение с MySQL через PDO?
PDO (PHP Data Objects) - универсальный драйвер, поддерживающий множество СУБД. Соединение создаётся с помощью строки DSN.
$dsn = 'mysql:host=localhost;dbname=database;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'password');
Рекомендуется установить режим ошибок на исключения (ERRMODE_EXCEPTION):
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Если драйвер MySQL для PDO не установлен, соединение не удастся. Убедитесь, что расширение pdo_mysql активно в php.ini. Также при неправильной кодировке могут возникнуть проблемы с символами; charset в DSN решает эту задачу.
Как настроить постоянные (persistent) соединения?
Постоянные соединения не закрываются после выполнения скрипта, а повторно используются. В PDO это достигается установкой опции PDO::ATTR_PERSISTENT.
$pdo = new PDO($dsn, 'user', 'password', [
PDO::ATTR_PERSISTENT => true
]);
Для mysqli можно добавить префикс 'p:' к хосту: $mysqli = new mysqli('p:localhost', ...);
Постоянные соединения могут привести к конфликтам с транзакциями и временным блокировкам. Используйте их только в средах, где это оправдано (например, FastCGI без пула процессов).
Наиболее эффективное решение - использование PDO с явной установкой режима ошибок через исключения и правильной кодировкой. PDO обеспечивает безопасность (подготовленные запросы), гибкость (смена СУБД) и единообразие кода.
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=myapp;charset=utf8mb4',
'username',
'secret',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
// работа с базой
} catch (PDOException $e) {
die('Соединение не удалось: ' . $e->getMessage());
}
Если исключение не перехвачено, скрипт остановится с фатальной ошибкой. Всегда оборачивайте подключение в try-catch. Также проверяйте наличие расширения pdo_mysql.
Дополнительные расширенные примеры для закрепления материала.
// Пример 1: Использование mysqli с опциями SSL
$mysqli = mysqli_init();
$mysqli->ssl_set('/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca-cert.pem', NULL, NULL);
$mysqli->real_connect('localhost', 'user', 'password', 'database', 3306, NULL, MYSQLI_CLIENT_SSL);
if ($mysqli->connect_errno) {
die('SSL подключение не удалось: ' . $mysqli->connect_error);
}
echo "Подключено по SSL";
Подключено по SSL
// Пример 2: PDO с кэшированием соединения (singleton pattern)
class Database {
private static $instance = null;
private function __construct() {}
public static function getConnection() {
if (self::$instance === null) {
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
self::$instance = new PDO($dsn, 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
]);
}
return self::$instance;
}
}
$pdo = Database::getConnection();
// Пример 3: Использование разных DSN для разных версий MySQL
$dsn = 'mysql:host=127.0.0.1;port=3307;dbname=old_db;unix_socket=/tmp/mysql.sock';
$pdo = new PDO($dsn, 'root', '');
$pdo->setAttribute(PDO::ATTR_TIMEOUT, 5); // таймаут соединения 5 секунд
// Пример 4: Проверка соединения перед длительной операцией
if (!$pdo->query('SELECT 1')) {
// соединение потеряно, переподключаемся
$pdo = new PDO(...);
}
(Результат: true, если соединение живо)
// Пример 5: Использование mysqli_ping
$mysqli = new mysqli(...);
if ($mysqli->ping()) {
echo "Соединение активно";
} else {
// переустановка
$mysqli->close();
$mysqli = new mysqli(...);
}
Соединение активно