2

我正在使用PHP ADOdb,我可以得到结果集:

$result = &$db->Execute($query);

如何从那一行中获取字段名称并循环遍历它?

(如果这很重要,我正在使用访问数据库。)

4

6 回答 6

6

这取决于您的获取模式 - 如果您将 FetchMode 设置为 ADODB_FETCH_NUM(可能是默认值),每行包含一个平面列数组。如果将 FetchMode 设置为 ADODB_FETCH_ASSOC,您将获得一个关联数组,您可以在其中通过键访问每个值。以下内容来自 ADODB 文档 - http://phplens.com/lens/adodb/docs-adodb.htm#ex1

$db->SetFetchMode(ADODB_FETCH_NUM);
$rs1 = $db->Execute('select * from table');
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs2 = $db->Execute('select * from table');

print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')

要遍历一组结果:

$result = &$db->Execute($query);
foreach ($result as $row) {
    print_r($row);
}
于 2010-02-11T14:55:28.797 回答
3

对@thetaiko 发布的解决方案的小改进。

如果您只需要字段名称,请附加LIMIT 1到您的选择语句的末尾(如下所示)。这将告诉服务器向您发送带有列名的单行,而不是向您发送整个表。

SELECT * FROM table LIMIT 1;

我正在使用一个包含 910 万条记录的表,因此这个微小的更改显着加快了查询速度!

于 2011-12-10T20:34:45.000 回答
2

这是我用来返回字段数组的函数——我已经去掉了一些额外的东西,例如,允许它与 MySQL 以外的其他数据库一起工作。

function getFieldNames($strTable, $cn) {

    $aRet = array();

    # Get Field Names:
    $lngCountFields = 0;

    $strSQL = "SELECT * FROM $strTable LIMIT 1;";

    $rs = $cn->Execute($strSQL)
            or die("Error in query: \n$strSQL\n"  . $cn->ErrorMsg());
    if (!$rs->EOF) {
        for ($i = 0; $i < $rs->FieldCount(); $i++) {
            $fld = $rs->FetchField($i);
            $aRet[$lngCountFields] = $fld->name;
            $lngCountFields++;
        }
    }

    $rs->Close();
    $rs = null;

    return $aRet;

}

编辑:只是要指出,正如我所说,我已经去掉了一些额外的东西,因此在上面的简化版本中不再需要 EOF 检查。

于 2012-01-18T13:05:20.410 回答
1

我最初尝试使用MetaColumnNames,但它在 VisualPHPUnit 和实际站点中给出了不同的结果,同时从同一台服务器运行,所以最终我最终做了这样的事情:

$sql = "select column_name, column_key,  column_default, data_type, table_name, table_schema from information_schema.columns";
$sql .= ' where table_name="'.$table.'" and table_schema="'.$database_name.'"';
$result = $conn->Execute($sql);
while($row = $result->fetchRow()) {
    $out[] = strToUpper($row['column_name']);
}   

我认为它应该适用于 mysql、mssql 和 postgres。这样做的好处是,即使来自表的查询返回一个空集,您也可以获得列名。

于 2012-05-07T11:03:51.767 回答
1

如果即使对于空表或关于多个表的连接也需要列名,请使用以下命令:

$db->Execute("SELECT .......");
// FieldTypesArray - Reads ColoumnInfo from Result, even for Joins
$colInfo = $res->FieldTypesArray(); 

$colNames = array();
foreach($colInfo as $info) $colNames[] = $info->name;
于 2016-08-04T09:16:48.210 回答
0

OP 要求提供一个字段名列表,该列表将执行存储在 $query 中的 sql 语句。

使用 $result->fetchRow(),即使 fetch 模式设置为关联,如果没有记录匹配 $query 设置的条件,也不会返回任何内容。$result->fields 数组也将为空,并且不会提供获取字段名列表的信息。

实际上,我们不知道 $query 语句中的内容。此外,将 limit 设置为 1 可能无法与PHP ADOdb支持的所有数据库驱动程序兼容。

Radon8472的回答是正确的,但正确的代码可能是:

$result = $db->Execute($query);
// FieldTypesArray - an array of ADOFieldObject Objects 
// read from $result, even for empty sets or when 
// using * as field list.
    
$colInfo = [];
if (is_subclass_of($result, 'ADORecordSet')){
    foreach ($result->FieldTypesArray() as $info) {
        $colInfo[] = $info->name;
    }
}

我有检查 $result 的类名的习惯,因为如果执行失败,PHP ADOdb 将返回 false。

于 2021-03-28T19:17:42.293 回答