2013-03-20 14 views
8

mam ten kod:PDO Tablice asocjacyjne - powrót asocjacyjne

$dbInstance = DB_Instance::getDBO(); 
$statement = $dbInstance->prepare("SELECT id, name FROM language ORDER BY id"); 
$statement->execute();  
$rows = $statement->fetchAll(); 

//Create associative array wuth id set as an index in array 
$languages = array(); 
foreach($rows as $r) { 
    $languages[$r['id']] = $r['name']; 
} 
return $languages; 

nie mogę dowiedzieć się, jak używać PDO oświadczenie, aby osiągnąć ten sam rezultat tej tablicy $ języki produkuje. Próbowałem różnych poziomów pobierania.

Próbowałem kilka różnych stylów i mogę dostać jak:

[0] svenska 
[1] engelska 

ale chcę jak:

[1] svenska 
[2] engelska 

(gdzie 1 i 2 są wartości ID w bazie danych)

Zgaduję, że mógłbym utworzyć funkcję i zadzwonić do niej z FETCH_FUNC, ale nie jestem pewien, czy byłby on tak wspaniały.

Czy powyższe jest najlepszym/najczystszym sposobem na zrobienie tego?

+3

Jeśli chcesz zwrócić tablicę asocjacyjną z PDO, czy '$ rows = $ Instrukcja-> fetchAll (PDO :: FETCH_ASSOC);' Wtedy można odwoływać się przez '$ rows [$ row_num] [$ col_name] ' – jdstankosky

+0

Rozumiem, o co prosisz. Zapoznaj się z moją zaktualizowaną odpowiedzią, aby odpowiedzieć na Twoje pytanie. – jdstankosky

Odpowiedz

10

Naprawdę nie jestem pewien, czy jest jakiś lepszy sposób. Możesz spróbować tego?

$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

$languages = array(); 

function getLangs($col, $row) { 
    $languages[$col['id']] = $col['name']; 
} 

array_walk($rows, 'getLangs'); 

Nie ma nic złego w pętlach foreach. W rzeczywistości używałbym tego, co masz. Trudno jest uzyskać czystsze niż ...

UPDATE:

Po uważnym przeczytaniu ponownie pytanie, co naprawdę powinno być pytaniem jest, czy można formatować zapytanie w taki sposób, że wyniki są zwracane w innym formacie.

Sposób, że zwracany jest normalne zapytanie SELECT jest thusly:

+----+----------+ 
| id |  name | 
+----+----------+ 
| 1 | svenska | 
| 2 | engelska | 
| .. |  ... | 
| .. |  ... | 
+----+----------+ 

$row = array(
    row_1 => array(
     id => "1", 
     name => "svenska" 
    ), 
    row_2 => array(
     id => "2", 
     name => "engelska" 
    ), 
    row_3 => array(
     id => "...", 
     name => "..." 
    ), 
    row_4 => array(
     id => "...", 
     name => "..." 
    ) 
) 

$row[$row_number][$column_name] = $value 

co pytasz, jest dla niektórych sposobem na powrót swoje wyniki kwerendy tak:

// Query result is only one row, with each 'id' as column name 
// And the 'name' from the same row as it's value... 

+---------+----------+-----+-----+-----+ 
|  1 |  2 | ... | ... | ... | 
+---------+----------+-----+-----+-----+ 
| svenska | engelska | ... | ... | ... | 
+---------+----------+-----+-----+-----+ 

$row = array(
    row_1 => array(
      1 => "svenska", 
      2 => "engelska", 
     ... => "...", 
     ... => "...", 
     ... => "..." 
    ) 
) 

$languages = $row[row_1]; 
$languages[$id] = $name; 

I nie jestem całkowicie pewny, czy możesz do this w SQL, aby być całkowicie szczery. Poleciłbym także, nawet jeśli byś tego chciał. Byłoby straszne dla stołu skalującego. Jeśli Twój stół jest statyczny, to dlaczego nie sformatować go w sposób, o którym właśnie wspomniałem? Dlaczego po prostu nie ma tego w statycznej tablicy PHP w pliku włączającym?

+0

Wielkie dzięki! :-) Co masz na myśli.Dlaczego powinienem to uwzględnić w statycznej tablicy PHP w pliku włączającym? Jaki jest tego cel? – bestprogrammerintheworld

+0

@bestprogrammerintheworld Nie wiedziałem, czy jest to tabela statyczna, ponieważ w tym przypadku języki zawsze będą dostępne, a jedynym powodem, dla którego są one w bazie danych, jest wyszukanie ich za pomocą zapytania, dlaczego nie wystarczy utworzyć tablicę z nich w twoim skrypcie ręcznie (tj., 'include" lang.php ";'? Ponownie, nie mam żadnej innej wiedzy na temat tabeli, o której mowa, więc po prostu wnioskuję tutaj. – jdstankosky

+0

OK, dzięki za wskazówkę!: -) – bestprogrammerintheworld

13

Wszyscy zapomnieli o

$sth->fetchAll(PDO::FETCH_KEY_PAIR); 
+0

Jeśli pracujesz z więcej niż jedną kolumną, może to być lepsze rozwiązanie: '$ STH-> fetchAll (PDO :: FETCH_ASSOC);' – dangre00