我正在自动工作,并动态生成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 :(得分:0)
我对功能进行了些微更改,以传递您使用global
访问的字段(因为不建议这样做)。因此,您将不得不更改对getTableDetails()
的呼叫。
mysqli_fetch_fields()
用于返回作为结果集一部分的字段,因为这是从describe
来的,您正在获取字段,它们是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);
}