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