Avatar ·

Как получить имена столбцов таблицы в MySQL через PHP?

Всем привет! Я начинающий PHP-разработчик, делаю админку для небольшого интернет-магазина. Мне нужно вывести список товаров в виде таблицы, но я не хочу жестко прописывать названия колонок в HTML, так как таблица может меняться (добавляются новые поля для характеристик). У меня есть простой запрос: ```php $query = "SELECT * FROM products"; $result = mysqli_query($link, $query); while ($row = mysqli_fetch_assoc($result)) { // здесь я вывожу данные } ``` Проблема в том, что я могу вывести только данные, но не знаю, как динамически получить имена столбцов (например: id, name, price, category_id). Я пробовал использовать `mysqli_fetch_fields()`, но у меня ничего не вышло — то ли синтаксис неправильный, то ли я не ту функцию вызываю. Мне нужно решение на чистом PHP (желательно с mysqli или PDO), которое позволит получить массив с названиями колонок таблицы MySQL. Подскажите, как это сделать правильно? Заранее спасибо! <<>>

Решение с использованием PDO (рекомендуемый способ)

Современный и безопасный подход — использовать расширение PDO. Оно поддерживает метод getColumnMeta(), который возвращает метаданные о столбцах результата запроса. Вот полный пример:

<?php
// Подключение к БД через PDO
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$user = 'root';
$password = '';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $password, $options);
    
    // Выполняем запрос
    $stmt = $pdo->query('SELECT * FROM products LIMIT 1');
    
    // Получаем имена столбцов
    $columns = [];
    $count = $stmt->columnCount();
    
    for ($i = 0; $i < $count; $i++) {
        $meta = $stmt->getColumnMeta($i);
        $columns[] = $meta['name'];
    }
    
    // Теперь $columns содержит массив имен столбцов
    echo '<pre>';
    print_r($columns);
    echo '</pre>';
    
    // Выводим таблицу с динамическими заголовками
    echo '<table border="1">';
    echo '<thead><tr>';
    foreach ($columns as $col) {
        echo '<th>' . htmlspecialchars($col) . '</th>';
    }
    echo '</tr></thead>';
    
    // Выводим данные
    echo '<tbody>';
    while ($row = $stmt->fetch()) {
        echo '<tr>';
        foreach ($columns as $col) {
            echo '<td>' . htmlspecialchars($row[$col] ?? '') . '</td>';
        }
        echo '</tr>';
    }
    echo '</tbody></table>';
    
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>

Решение с использованием MySQLi

Если вы используете расширение MySQLi, то можно воспользоваться методом fetch_fields():

<?php
$mysqli = new mysqli('localhost', 'root', '', 'shop');

if ($mysqli->connect_error) {
    die('Ошибка подключения: ' . $mysqli->connect_error);
}

$result = $mysqli->query('SELECT * FROM products LIMIT 1');

// Получаем массив объектов с информацией о полях
$fields = $result->fetch_fields();

$columns = [];
foreach ($fields as $field) {
    $columns[] = $field->name; // name - имя столбца
}

print_r($columns);

$result->free();
$mysqli->close();
?>

Важные замечания

  • LIMIT 1 — используйте его, чтобы не загружать все данные, если вам нужны только имена столбцов.
  • Безопасность: всегда экранируйте вывод через htmlspecialchars() при отображении в HTML.
  • Альтернатива: можно получить имена столбцов напрямую из INFORMATION_SCHEMA: SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'products', но это дополнительный запрос к БД.

Рекомендую использовать PDO, так как это более современное расширение с лучшей поддержкой prepared statements и разных СУБД.

<<>>

Альтернативный подход: запрос к INFORMATION_SCHEMA

Если вам нужно получить имена столбцов без выполнения SELECT-запроса (например, для построения схемы таблицы), можно напрямую обратиться к системной таблице MySQL:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', '');
$stmt = $pdo->query("
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'shop' 
      AND TABLE_NAME = 'products'
    ORDER BY ORDINAL_POSITION
");

$columns = $stmt->fetchAll(PDO::FETCH_COLUMN);
print_r($columns);
?>

Когда это полезно?

  • Когда таблица пуста (SELECT не вернёт ни одной строки).
  • Когда нужно получить не только имена, но и типы данных, nullable, дефолтные значения.

Минус: это отдельный запрос к БД, что может быть чуть медленнее, чем использование getColumnMeta().