PHP и MySQL: подключение, выборка и основные операции

Подключение к MySQL через mysqli, проверка соединения, перебор истории заказов, prepared statements и ID вставленной записи. Особенности DISABLE KEYS для MyISAM.

Содержание статьи

Подключение и быстрая проверка БД

Файл db.php:

<?php
function requiredEnv(string $name): string {
    $value = getenv($name);
    if ($value === false || $value === '') {
        throw new RuntimeException('Не настроена переменная окружения: ' . $name);
    }
    return $value;
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $mysqli = new mysqli(
        requiredEnv('DB_HOST'), requiredEnv('DB_USER'),
        requiredEnv('DB_PASSWORD'), requiredEnv('DB_NAME')
    );
    $mysqli->set_charset('utf8mb4');
} catch (mysqli_sql_exception | RuntimeException $error) {
    error_log('Сбой подключения к MySQL; код: ' . $error->getCode());
    http_response_code(500);
    exit('Подключение к базе данных недоступно.');
}

После подключения выполните простую выборку:

$mysqli->query('SELECT 1');
echo 'Соединение с БД установлено';

В OpenCart параметры уже определены в config.php как DB_HOSTNAME, DB_USERNAME, DB_PASSWORD и DB_DATABASE. Их можно передать тому же конструктору mysqli. Не публикуйте config.php и var_dump() соединения. При строгом режиме ошибка вызывает исключение: одной проверки connect_errno после конструктора недостаточно.

Перебор данных в таблице

Пример сохраняет поля истории заказов OpenCart. Префикс oc_ замените своим фиксированным префиксом таблиц.

require __DIR__ . '/db.php';
$result = $mysqli->query(
    'SELECT order_history_id, order_id, date_added FROM oc_order_history'
);
$i = 0;
while ($row = $result->fetch_assoc()) {
    $order_history_id = $row['order_history_id'];
    $order_id = $row['order_id'];
    $date_added = $row['date_added'];
    $i++;
}
$result->free();

Для последовательного чтения data_seek(0) не нужен. Метод позволяет перемещаться по буферизованному результату.

Запрос с параметром

$orderId = 123;
$stmt = $mysqli->prepare(
    'SELECT order_history_id, date_added FROM oc_order_history WHERE order_id = ?'
);
$stmt->bind_param('i', $orderId);
$stmt->execute();
$result = $stmt->get_result(); // требуется mysqlnd
while ($row = $result->fetch_assoc()) {
    // Работа с полями строки.
}
$stmt->close();

Значения передаются отдельно от SQL. Имена таблиц и столбцов не подставляются вместо вопросительного знака: они должны быть фиксированными или выбираться из разрешённого списка.

ID последней вставленной записи

$name = 'Новая запись';
$stmt = $mysqli->prepare('INSERT INTO my_table (name) VALUES (?)');
$stmt->bind_param('s', $name);
$stmt->execute();
$id = $mysqli->insert_id;
$stmt->close();

Читайте insert_id сразу после INSERT через то же соединение. Значение 0 означает, что последняя операция не сформировала AUTO_INCREMENT, а не обязательно отсутствие вставленных строк. При пакетной вставке возвращается первый автоматически созданный ID.

Отключение и включение обновления индексов MyISAM

$mysqli->query('ALTER TABLE my_table DISABLE KEYS');
// Массовая загрузка данных в my_table.
$mysqli->query('ALTER TABLE my_table ENABLE KEYS');

DISABLE KEYS приостанавливает обновление неуникальных индексов MyISAM, ENABLE KEYS перестраивает их. Для InnoDB такой эффект не применяется. В имени таблицы нельзя использовать входящие параметры.

Проверенные источники

www.php.net, www.php.net, www.php.net, www.php.net, dev.mysql.com. Проверено 10 октября 2026 года.

Все материалы раздела «Программирование»Каталог инструментов