2010-02-11 4 views

Répondre

4

Cela dépendra de votre mode de récupération - si vous setFetchMode à ADODB_FETCH_NUM (probablement la valeur par défaut) chaque ligne contient un tableau plat de colonnes. Si vous définissez FetchMode sur ADODB_FETCH_ASSOC, vous obtenez un tableau associatif dans lequel vous pouvez accéder à chaque valeur par une clé. Ce qui suit est tirée de la documentation 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') 

à boucle à travers un ensemble de résultats:

$result = &$db->Execute($query); 
foreach ($result as $row) { 
    print_r($row); 
} 
+0

Merci pour l'explication. :) Cela a fonctionné pour moi. – Abs

+0

http://phplens.com/adodb/reference.varibles.adodb_fetch_mode.html il y a aussi un mélange de deux d'entre eux – greenoldman

3

Petite amélioration à la solution publié par @thetaiko.

Si vous avez UNIQUEMENT besoin des noms de champs, ajoutez LIMIT 1 à la fin de votre instruction select (comme indiqué ci-dessous). Cela indiquera au serveur de vous envoyer une seule ligne avec des noms de colonne, plutôt que de vous envoyer la table entière. Je travaille avec une table qui contient des enregistrements 9.1M, donc cette modification mineure accélère la requête de manière significative!

1

Ceci est une fonction que j'utilise pour retourner un tableau de champs - j'ai supprimé des éléments supplémentaires qui, par exemple, lui permettent de fonctionner avec d'autres DB que 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; 

} 

Edit: juste pour signaler que, comme je le dis, je l'ai dépouillé des choses supplémentaires, et le chèque EOF est donc plus nécessaire dans ce qui précède, version réduite.

1

Je initally essayé d'utiliser MetaColumnNames, mais il a donné des résultats différents dans VisualPHPUnit et site réel, lors de l'exécution du même serveur, donc finalement je fini par faire quelque chose comme ceci:

$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']); 
} 

Je pense qu'il devrait travailler avec mysql, mssql et postgres. L'avantage de ce comportement est que vous pouvez obtenir les noms de colonne, même si une requête d'une table renvoie un ensemble vide.

0

Si vous avez besoin des noms Coloumn même pour tables vides ou pour les jointures sur les multiples tables utilisent ceci:

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

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