2012-01-13 32 views
5

Tôi gặp sự cố với tập hợp kết quả mysqli. Tôi có một bảng có chứa một loạt các tin nhắn. Mỗi hàng trong bảng biểu thị một thông báo. Tôi có một vài cột như ID, tiêu đề, nội dung và 'công khai'. Cột công khai chứa các boolean, chỉ định nếu thông báo được hiển thị cho tất cả mọi người, hoặc chỉ cho người đã đăng nó. Tôi có một trang mà tôi muốn hiển thị tất cả các tin nhắn công cộng, và nếu bạn bấm vào một tin nhắn, bạn sẽ nhận được một trang với một tin nhắn duy nhất, và một số tùy chọn bổ sung. Để làm điều này, tôi muốn tải kết quả của một truy vấn mysqli vào một mảng hai chiều. Điều đó có nghĩa là một mảng các thông báo, và mỗi thông điệp là một mảng trên chính nó với ID, tiêu đề, nội dung, vv .. như các cột.Làm thế nào để tải kết quả MySQLi được đặt thành mảng hai chiều?

Vì vậy, tôi đã bắt đầu với mã sau đây. Biến '$ link' chứa kết nối mysqli (phù thủy hoạt động tốt).

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

print_r($array); 

Điều này chỉ dẫn đến mảng một chiều, với thông điệp mới nhất trong đó. Vì vậy, tôi đã cố gắng lặp while sau:

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

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

này hoạt động theo một cách: Nó hiển thị tất cả các thư, nhưng không đặt chúng trong một mảng (phù thủy Tôi muốn cho thực hiện nhiệm vụ dựa trên ID, và vị trí của các mảng tin nhắn trong mảng chứa.) Có ai biết cách chuyển đổi loại kết quả truy vấn này thành mảng hai chiều đẹp không? Hoặc một cách hoàn toàn khác, tiện lợi để đi về điều này? Cảm ơn trước.

PS. Xin lỗi vì tiếng Anh của tôi, tôi không phải là người bản ngữ.

Trả lời

15

Bạn đang gần như ở đó, bạn sẽ chỉ cần thay đổi một vài điều:

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

Điều này sẽ dẫn đến một cái gì đó như thế này:

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

Nếu bạn muốn các ID như các phím , hãy thực hiện một việc như sau:

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

Điều này sẽ dẫn đến:

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

Trong PHP 5.3, bạn cũng có được một phương pháp mới, mà không giống như các ví dụ mã đầu tiên tôi đã đăng:

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

Cảm ơn bạn đã trả lời câu trả lời này! đã giúp tôi rất nhiều! –

+0

Ví dụ của bạn đã hoạt động nhưng có thể rõ ràng hơn nếu bạn sử dụng các tên biến khác nhau nhiều hơn một ký tự ... ** $ message ** và ** $ messages ** –

0

Nếu tôi nhận bạn đúng, bạn muốn đạt được cái gì đó được sản xuất bởi:

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

Điều này sẽ giúp bạn có một mảng 2 chiều, sử dụng ID là chìa khóa.

+0

Tôi nghĩ rằng bạn sẽ cần phải thay đổi '[$ singleMessage]' với '[$ singleMessage [ 'id']]', nếu không, PHP sẽ sử dụng toàn bộ mảng như một key ... (Mà thực sự có thể hoạt động!) – RikkusRukkus

-1

Làm thế nào mảng cuối cùng của bạn phải trông như thế nào?

Hãy thử điều này:

$result = $link->query("SELECT title, body FROM messages WHERE public = '1'"); 
$array = array(); 
while ($array[] = mysql_fetch_assoc($result)) {} 
Các vấn đề liên quan