【问题标题】:How to get the column names of a result returned by select query如何获取选择查询返回的结果的列名
【发布时间】:2019-05-10 13:30:51
【问题描述】:

我正在构建一个报告工具,用户可以在其中输入 SQL 查询,该工具将以 CSV 文件的形式返回结果。除了只是写入一个 CSV 文件之外,我还需要在这里执行一些额外的逻辑。所以SELECT INTO OUTFILE 对我不起作用。

我知道执行任意用户提供的 SQL 查询是不好的,但是这个工具将只在内部使用,所以安全性不应该是一个问题。此外,我将其限制为仅选择查询。

现在当我以 CSV 格式导出数据时,我还想将查询的列名输出为 CSV 文件中的第一行。

所以我的问题是,有没有办法在 PHP 中使用 PDO 获取 SQL 查询的列名?

Mysql 客户端工具(如 Sequel Pro)能够在显示查询结果的同时显示列名。所以我假设它应该是可能的,但我找不到它。

【问题讨论】:

  • 行数组的键是列名。
  • 当然可以,考虑你的 sql 查询结果是一个多维数组,所以在显示行和列之前,只需获取第一行数组的键。 foreach($result[0] as $key=>$val) echo $key;

标签: php mysql pdo


【解决方案1】:

行结果的键是列名。您可以像这样显示它们:

$conn = mysqli_connect(YOUR_CONNECTION_INFO);
$result = mysqli_query($conn, YOUR_QUERY);
$row = mysqli_fetch_assoc($result);

foreach ($row as $key=>$value) {
    echo $key;
}

您说安全不是问题,因为代码只能在内部使用,但是如果您创建一个具有有限权限的新数据库用户并使用该用户连接到数据库会发生什么情况。

这样您就可以根据需要从数据库中设置权限,而不必担心用户删除表。

【讨论】:

  • 我已经只限制了select 查询。创建具有有限权限的新数据库用户将是一项额外检查。也会对此进行探索。
【解决方案2】:

这里我没有写完整的 PDO 连接代码。您可以使用以下代码/逻辑来获取返回列名称。

$stmt = $conn->query("SELECT COUNT(*), first_column, second_column FROM table_name");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$columns = array_keys($row);

print_r($columns); // array(0 => COUNT(*), 1 => first_column, 2 => second_column) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2017-10-08
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多