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

时间:2018-12-10 16:43:54

标签: php mysql innodb procedural-programming

我正在自动工作,并动态生成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);
}

1 个答案:

答案 0 :(得分:0)

我对功能进行了些微更改,以传递您使用global访问的字段(因为不建议这样做)。因此,您将不得不更改对getTableDetails()的呼叫。

mysqli_fetch_fields()用于返回作为结果集一部分的字段,因为这是从describe来的,您正在获取字段,它们是describe的返回值,而不是字段在桌子上。相反,您需要使用mysqli_fetch_assoc()来返回语句中的数据行。

要经常检查的另一件事是,如果您在获取数据时遇到问题,请使用print_r()检查返回的内容。

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

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