2012-01-13 13 views
5

Mam problem z zestawem wyników mysqli. Mam tabelę zawierającą kilka wiadomości. Każdy wiersz tabeli reprezentuje jedną wiadomość. Mam kilka kolumn, takich jak ID, tytuł, treść i "public". Publiczna kolumna zawiera wartości logiczne określające, czy wiadomość ma być wyświetlana wszystkim, czy tylko osobie, która ją opublikowała. Mam stronę, na której chcę wyświetlić wszystkie publiczne wiadomości, a po kliknięciu wiadomości pojawi się strona z pojedynczą wiadomością i kilkoma dodatkowymi opcjami. Aby to zrobić, chcę załadować wynik zapytania mysqli do tablicy dwuwymiarowej. Oznaczałoby to tablicę wiadomości, a każda wiadomość jest tablicą samą w sobie z identyfikatorem, tytułem, treścią itp. Jako kolumnami.Jak załadować zestaw wyników MySQLi do dwuwymiarowej tablicy?

Zacząłem od następującego kodu. Zmienna $ link zawiera połączenie mysqli (działa poprawnie).

$result = $link->query("SELECT * FROM messages WHERE public = '1'"); 
$array = $result->fetch_assoc(); 

print_r($array); 

Powoduje to tylko jednowymiarową tablicę z najnowszym komunikatem. Tak próbowałem następujące pętli while:

$result = $link->query("SELECT * FROM messages WHERE public = '1'"); 

while($message = $result->fetch_assoc()){ 
$title = $message['title']; 
$body = $message['body']; 
# etc... 
} 

Działa to w ten sposób: Wyświetla wszystkie wiadomości, ale nie umieścić je w tablicy (czarownica chcę do wykonywania zadań na podstawie identyfikatora, a pozycja tablica wiadomości w tablicy zawierającej.) Czy ktokolwiek wie, jak przekonwertować ten wynik kwerendy do ładnej, dwuwymiarowej tablicy? Lub zupełnie inny, zręczny sposób, aby o tym poradzić? Z góry dziękuję.

PS. Przepraszam za mój angielski, nie jestem native speakerem.

Odpowiedz

15

Jesteś prawie tam, to trzeba tylko zmienić kilka rzeczy:

$result = $link->query("SELECT * FROM messages WHERE public = '1'"); 
$messages = array(); 
while($message = $result->fetch_assoc()){ 
    $messages[] = $message; 
} 

Spowodowałoby to coś takiego:

array(
    0 => array('message' => ..., 'subject' => ...), 
    1 => array('message' => ..., 'subject' => ...), 
    2 => array('message' => ..., 'subject' => ...), 
); 

Jeśli chcesz identyfikatory jako klucze , zrób coś takiego:

$messages = array(); 
while($message = $result->fetch_assoc()){ 
    $messages[ $message["id"] ] = $message; 
} 

co skutkowałoby:

array(
    123 => array('message' => ..., 'subject' => ...), 
    456 => array('message' => ..., 'subject' => ...), 
    789 => array('message' => ..., 'subject' => ...), 
); 

W PHP 5.3, można również uzyskać nową metodę, która działa tak samo jak w pierwszym przykładzie kodu I Wysłany:

$messages = $result->fetch_all(MYSQLI_ASSOC); 
+0

Dziękuję za tę odpowiedź! bardzo mi pomogło! –

+0

Twoje przykłady zadziałały, ale mogą być bardziej przejrzyste, jeśli użyjesz nazw zmiennych różniących się o więcej niż jeden znak ... ** $ wiadomość ** i ** $ wiadomość ** –

0

Gdybym Ci rację, chcesz coś osiągnąć, który jest produkowany przez:

$result = $link->query("SELECT * FROM messages WHERE public = '1'"); 

$messages = array(); 
while($singleMessage = $result->fetch_assoc()){ 
    $messages[$singleMessage]['title'] = $singleMessage['title']; 
    $messages[$singleMessage]['body'] = $singleMessage['body']; 
} 

to będzie Ci się 2 wymiarową tablicę, używając identyfikatora jako klucza.

+0

Myślę, że trzeba zmienić '[$ singleMessage]' na '[$ singleMessage [ 'id']]', w przeciwnym razie, PHP wykorzysta całą gamę postaci klucz ... (Które może faktycznie zadziała!) – RikkusRukkus

-1

Jak twój ostateczny Tablica musi wyglądać?

Spróbuj tego:

$result = $link->query("SELECT title, body FROM messages WHERE public = '1'"); 
$array = array(); 
while ($array[] = mysql_fetch_assoc($result)) {}