Попытка построить мой запрос, выбирая имена столбцов из выбранной таблицы - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю автоматически и динамически генерирую запросы SQL для вставки данных CSV в выбранную базу данных.Теперь у меня есть список из 10 различных баз данных.Теперь мне интересно, можно ли динамически построить часть моего запроса (имена таблиц), извлекая имя столбца из базы данных?

Это код, который у меня есть сейчас, но он невполне работа:

function getTableDetails($table_name) {
    global $con, $user;

    $describeTable = mysqli_query($con, "DESCRIBE " . $user . "." . $table_name);

    $fields = [];
    while($show = mysqli_fetch_fields($describeTable)) {
        $fields['column_name'][] = $show['COLUMN_NAME'];
        $fields['column_length'][] = $show['CHARACTER_MAXIMUM_LENGTH'];
        $fields['column_type'][] = $show['COLUMN_TYPE'];
    }

    return $fields;
}

Как я пытаюсь получить их

$table = getTableDetails($settings_type);
foreach ($table['column_name'] as $columnName) {
    print_r($columnName);
}

1 Ответ

0 голосов
/ 10 декабря 2018

Я немного изменил функцию, чтобы передавать поля, к которым вы обращаетесь, используя global (так как это не рекомендуется).Таким образом, вам придется изменить вызов на getTableDetails().

mysqli_fetch_fields() используется для возврата полей, которые являются частью набора результатов, так как это из describe, вы выбирали полякоторые были возвращаемыми значениями описания, а не полями в таблице.Вместо этого вам нужно использовать mysqli_fetch_assoc(), который возвращает строки данных из оператора.

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

Я также проиндексировал данные по имени столбца, иногда это может быть полезно, но вы также можете просто использовать $fields[] = [....

Поскольку длина поля невозвращая часть набора полей, я добавил код, который будет извлекать его из типа данных, поэтому int(11) имеет значение 11, извлеченное из скобок с помощью preg_match().

function getTableDetails( $con, $user, $table_name) {
    $describeTable = mysqli_query($con, "DESCRIBE " . $user . "." . $table_name);

    $fields = [];
    while($show = mysqli_fetch_assoc($describeTable)) {
        $columnName = $show['Field'];
        // Extract length from field type (if any)
        preg_match('#\((.*?)\)#', $show['Type'], $match);
        $fields[$columnName] = ['column_name' => $show['Field'],
            'column_length' => $match[1]??0,
            'column_type' => $show['Type']];        
    }

    return $fields;
}

$table = getTableDetails( $con, $user, "articles");
foreach ($table as $columnName) {
    print_r($columnName);
}
...