MySQL SELECT-ed列解析为PHP

时间:2013-12-22 15:08:53

标签: php mysql

如果有人能帮助我,我真的很感激。

我正在为我的大学做一个项目,我应该创建一个接口来处理预定义和“自由形式”的MySQL查询。 预定义为执行查询的几个按钮,这不是问题,问题出在“自由格式”查询中。

我有一个查询所在的<input type="text">标记和一个执行查询的按钮。

现在主要问题是,我应该如何解析通过输入字段发送的查询,以便生成与所选列对应的表头?像这样:

通过输入

发送
SELECT column1, column2, column5 FROM anywhere

它需要解析列信息,以便它可以:

<tr>
    <th>column1</th>
    <th>column2</th>
    <th>column5 </th>
</tr>

示例2:

SELECT column1, column2, column5, column8, column9 FROM anywhere

这样做:

<tr>
    <th>column1</th>
    <th>column2</th>
    <th>column5 </th>
    <th>column8 </th>
    <th>column9 </th>
</tr>

我应该怎么做呢?

提前感谢您对此问题的任何帮助。

感谢m_poorUser的帮助,它与我的需求有些接近,它只支持基本的MySQL查询并返回列的名称。

我用更复杂的查询尝试了它并且没有用,...我尝试了这个:

$input = "SELECT column1, column2, column5, column8, (SELECT column3, coulumn4 FROM somewhere) AS \"something\" FROM anywhere";

它只返回:

<pre>Table: somewhere
Array
(
    [0] => column3
    [1] => coulumn4
)

我应该如何使它忽略子查询并使其使用AS引用而不是实际解析子查询中的列名?

3 个答案:

答案 0 :(得分:1)

您可以使用fetch_assoc()和implode()函数从sql查询创建表,您可以拥有所需的列数:

$fields = $sqlResult->fetch_assoc();
// use keys as table heading
echo '<tr><th>'.implode('</th><th>', array_keys($fields)).'</th></tr>';
// display first table row
echo '<tr><td>'.implode('</td><td>', $fields).'</td></tr>';
// display other rows
while ( $fields = $sqlResult->fetch_assoc() ) {
 echo '<tr><td>'.implode('</td><td>', $fields).'</td></tr>';
}

答案 1 :(得分:0)

之前我也做了同样的事情,你需要使用结果集的元数据来创建表。您可以知道返回了多少列,并创建表结构,也可以知道返回的行数等。 要检索结果集视图的列this article

答案 2 :(得分:0)

您可以使用正则表达式。像这样的东西(完整的例子):

echo '<pre>';
$pattern = "#SELECT (?P<cols>[a-zA-Z0-9_, ]+) FROM (?P<table>[a-zA-Z0-9_]+)#";
$input = "SELECT column1, column2, column5, column8, column9 FROM anywhere";
$a = preg_match_all($pattern, $input, $output);

$cols = explode(',', $output['cols'][0]);
$clean_cols = array();
foreach($cols as $col)
    $clean_cols[] = trim($col);

$table = trim($output['table'][0]);

echo 'Table: '.$table.PHP_EOL;
print_r($clean_cols);

但是用正则表达式解析任何可能性都可能很苛刻。例如,您可以将此用于简单查询。

编辑:我想我误解了这个问题。您可以使用fetch_assoc()来获取包含列名的数据。然后你要做的就是获取标题的数组键。