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