Попытка построить мой запрос, выбирая имена столбцов из выбранной таблицы

Я работаю автоматически и динамически генерирую запросы 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);
}

0

Решение

Я немного изменил функцию, чтобы передать поля, к которым вы обращаетесь с помощью 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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]