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

cwdobuhd  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(382)

我正在自动和动态地生成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);
}
krugob8w

krugob8w1#

我稍微修改了函数,以便传入您使用 global (因为不建议这样做)。所以你得把电话改成 getTableDetails() . mysqli_fetch_fields() 用于返回作为结果集一部分的字段,因为这是从 describe ,获取的字段是descripe的返回值,而不是表中的字段。相反,你需要使用 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);
}

相关问题