Содержание статьи
Подключение и быстрая проверка БД
Файл 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 года.