Как получить "имена полей" с помощью PHP ADOdb? - PullRequest
2 голосов
/ 11 февраля 2010

Я использую PHP ADOdb , и я могу получить набор результатов:

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

Как я могу получить имена полей из этой строки и пройти через них?

(я использую базу данных доступа, если это имеет значение.)

Ответы [ 5 ]

6 голосов
/ 11 февраля 2010

Это будет зависеть от вашего режима выборки - если вы установите для параметра 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);
}
3 голосов
/ 11 декабря 2011

Небольшое улучшение к решению, опубликованному @ thetaiko.

Если вам нужны ТОЛЬКО имена полей, добавьте LIMIT 1 в конец вашего оператора выбора (как показано ниже). Это скажет серверу отправлять вам одну строку с именами столбцов, а не отправлять вам всю таблицу.

SELECT * FROM table LIMIT 1;

Я работаю с таблицей, содержащей 9,1 млн записей, поэтому это незначительное изменение значительно ускоряет запрос!

1 голос
/ 07 мая 2012

Я изначально пытался использовать 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. Преимущество такого подхода заключается в том, что вы можете получить имена столбцов, даже если запрос из таблицы возвращает пустой набор.

1 голос
/ 18 января 2012

Это функция, которую я использую для возврата массива полей - я убрал некоторые дополнительные вещи, которые, например, позволяют работать с другими БД, отличными от 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 больше не требуется в приведенной выше уменьшенной версии.

0 голосов
/ 04 августа 2016

Если вам нужны имена столбцов даже для пустых таблиц или для объединений с несколькими таблицами, используйте это:

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

$colNames = array();
foreach($colNames as $info) $colInfo[] = $info->name;
...