2012-10-11 9 views
12

Ho una tabella SQL denominata "marche" con id, nome, url delle colonne. In quel tavolo ho questo insieme di dati:Utilizzo del valore di una colonna come indice nei risultati utilizzando PDO

1, Solidfloor, solidfloor; 
2, Quickstep, quickstep; 
4, Cleanfloor, cleanfloor; 
5, Blue Dolphin, blue-dolphin; 
6, Krono, krono; 
8, Meister, meister; 

li sto recupero tutti in questo momento e ottenere una bella serie in cambio, ma, ho bisogno l'indice delle matrici di non essere un numero incrementato, ma l'id di quella particolare riga. Ovviamente potrei scorrere il set dei risultati, ma c'è un modo più pulito per farlo?

risposta

13

Visualizza come assoc

Per il manuale: http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

Controlli il contenuto della matrice restituita come documentato in PDOStatement :: fetch(). Il valore predefinito di PDO :: ATTR_DEFAULT_FETCH_MODE (valore predefinito PDO :: FETCH_BOTH)

Per restituire un array costituito da tutti i valori di una singola colonna dal set di risultati, specificare PDO :: FETCH_COLUMN. Puoi specificare quale colonna vuoi con il parametro indice-colonna.

Per recuperare solo i valori univoci di una singola colonna dal set di risultati, bitwise-OR PDO :: FETCH_COLUMN con PDO :: FETCH_UNIQUE.

Per restituire un array associativo raggruppato in base ai valori di una colonna specificata, bitwise-OR PDO :: FETCH_COLUMN con PDO :: FETCH_GROUP.

L'ultimo bit è la chiave. Non sembra essere completamente documentato (che ho potuto trovare), ma invece di PDO :: FETCH_COLUMN, è possibile combinare PDO :: FETCH_ASSOC DOP :: FETCH_GROUP per ottenere il risultato desiderato:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP) 

Così , data i dati di cui sopra:

$stmt = $PDO_obj->prepare('select * from brands'); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 
d($result); 

risultati in:

array (6) [ 
    '1' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Solidfloor" 
      'url' => string (10) "solidfloor" 
     ] 
    ] 
    '2' => array (1) [ 
     array (2) [ 
      'name' => string (9) "Quickstep" 
      'url' => string (9) "quickstep" 
     ] 
    ] 
    '4' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Cleanfloor" 
      'url' => string (10) "cleanfloor" 
     ] 
    ] 
    '5' => array (1) [ 
     array (2) [ 
      'name' => string (12) "Blue Dolphin" 
      'url' => string (12) "blue-dolphin" 
     ] 
    ] 
    '6' => array (1) [ 
     array (2) [ 
      'name' => string (5) "Krono" 
      'url' => string (5) "krono" 
     ] 
    ] 
    '8' => array (1) [ 
     array (2) [ 
      'name' => string (7) "Meister" 
      'url' => string (7) "meister" 
     ] 
    ] 
] 

(d() è solo una funzione di debug a portata di mano dalla libreria Kint, come var_dump() o print_r())

0.123.516,41 mila

Si noti che la colonna utilizzata per indicizzare l'array sarà sempre la prima colonna dei risultati, quindi è possibile modificare l'istruzione select per scegliere la colonna desiderata. E si noti inoltre che la colonna indicizzata verrà eliminata dalla matrice di ogni riga; per ovviare a ciò, è possibile aggiungere la colonna due volte alla propria istruzione select (ad esempio, select id, brands.* from brands, ecc.).

Ci sono più parametri documentati qui: http://php.net/manual/en/pdostatement.fetch.php, come PDO :: FETCH_UNIQUE per assicurarsi che ogni indice venga utilizzato una sola volta.

+4

$ st-> fetchAll (PDO :: FETCH_ASSOC | PDO :: FETCH_GROUP); Questo ha fatto il lavoro, grazie per l'aiuto! –

12

Anche se la descrizione di PDO::FETCH_UNIQUE nel manuale PHP non è chiara, ma in realtà è exact parameter you actually need.

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE); 

si sta dando un array indicizzato dal campo elencato nella clausola SELECT prima (quando * viene utilizzata poi primo campo nella definizione della tabella, che dovrebbe essere id nel tuo caso).

Si noti che per impostazione predefinita utilizzando solo PDO::FETCH_UNIQUE si otterrà le righe risultanti con valori raddoppiati. È possibile aggiungere la modalità di riga preferita a questa chiamata o, meglio, impostarla una volta per tutte le chiamate PDO nel costruttore o tramite setAttribute(). L'output di seguito è mostrato per PDO::FETCH_ASSOC impostato come modalità di recupero predefinita.

1 => array (
    'name' => 'Solidfloor', 
    'url' => 'solidfloor', 
), 
    2 => array (
    'name' => 'Quickstep', 
    'url' => 'quickstep', 
), 
    4 => array (
    'name' => 'Cleanfloor', 
    'url' => 'cleanfloor', 
), 
) 
+1

esattamente quello che stavo cercando, grazie –

Problemi correlati