尝试通过从所选 table 中获取列名来构建我的查询

Trying to build my query by fetching column names from the selected table

我正在自动和动态地生成 SQL 查询以将 CSV 数据插入选定的数据库。现在我有一个包含 10 个不同数据库的列表。现在我很好奇是否可以通过从数据库中获取列名来动态构建查询的一部分(table 名称)?

这是我现在拥有的代码,但它并不完全有效:

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() 用于 return 作为结果集一部分的字段,因为这是来自 describe,您正在获取 [=31] 的字段=] 描述的值而不是 table 中的字段。相反,您需要使用 mysqli_fetch_assoc(),其中 return 是语句中的数据行。

另一件要始终检查的事情是,如果您在获取数据时遇到问题,请使用 print_r() 检查正在 return 编辑的内容。

我还通过列名对数据进行了索引,这有时很有用,但您也可以只使用 $fields[] = [....

由于字段长度不是被 returned 的字段集的一部分,我添加了将从数据类型中提取它的代码,因此 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);
}