答案 0 :(得分:6)
这将取决于您的获取模式 - 如果您将setFetchMode设置为ADODB_FETCH_NUM(可能是默认值),则每行包含一个平面列数组。如果setFetchMode为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);
}
答案 1 :(得分:3)
@thetaiko发布的解决方案的小改进。
如果您只需要字段名称,请将LIMIT 1
附加到select语句的末尾(如下所示)。这将告诉服务器向您发送一个包含列名的行,而不是向您发送整个表。
SELECT * FROM table LIMIT 1;
我正在使用包含9.1M记录的表,因此这个小的更改会显着加快查询速度!
答案 2 :(得分:1)
这是我用来返回字段数组的函数 - 我已经删除了一些额外的东西,例如,它允许它与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检查。
答案 3 :(得分: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。 这样做的好处是,即使表中的查询返回空集,也可以获取列名。
答案 4 :(得分:0)
如果你需要Coloumn名称,即使是空表,或者对于多个表的联接,请使用:
$db->Execute("SELECT .......");
// FieldTypesArray - Reads ColoumnInfo from Result, even for Joins
$colInfo = $res->FieldTypesArray();
$colNames = array();
foreach($colNames as $info) $colInfo[] = $info->name;
答案 5 :(得分:0)
OP 要求提供一个字段名列表,这些字段名将导致执行存储在 $query 中的 sql 语句。
使用 $result->fetchRow(),即使提取模式设置为关联,如果没有记录匹配 $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。