Я использую PHP ADOdb, и я могу получить набор результатов:
$result = &$db->Execute($query);
Как получить имена полей из одной строки и прокрутить ее?
(Я использую базу данных доступа, если это имеет значение.)
Это будет зависеть от вашего режима выборки – если вы установите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); }
Небольшое улучшение решения, отправленного @thetaiko.
Если вы ТОЛЬКО нуждаетесь в именах полей, добавьте LIMIT 1
в конец вашего оператора select (как показано ниже). Это скажет серверу отправить вам одну строку с именами столбцов, а не отправлять вам всю таблицу.
SELECT * FROM table LIMIT 1;
Я работаю с таблицей, содержащей 9.1M записей, поэтому это незначительное изменение значительно ускоряет запрос!
Это функция, которую я использую для возврата массива полей – я убрал некоторые дополнительные материалы, которые, например, позволяют ему работать с другими БД, чем 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 больше не нужна в приведенной выше, уменьшенной версии.
Я сначала попытался использовать 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. Преимущество этого в том, что вы можете получить имена столбцов, даже если запрос из таблицы возвращает пустой набор.
Если вам нужны имена Coloumn даже для пустых таблиц или для объединений в нескольких таблицах, используйте это:
$db->Execute("SELECT ......."); // FieldTypesArray - Reads ColoumnInfo from Result, even for Joins $colInfo = $res->FieldTypesArray(); $colNames = array(); foreach($colNames as $info) $colInfo[] = $info->name;