Как загрузить набор результатов MySQLi в двумерный массив? - PullRequest
5 голосов
/ 13 января 2012

У меня проблема с набором результатов mysqli. У меня есть таблица, которая содержит кучу сообщений. Каждая строка таблицы представляет одно сообщение. У меня есть несколько столбцов, таких как ID, заголовок, тело и «public». Публичный столбец содержит логические значения, которые указывают, должно ли сообщение отображаться всем или только тому, кто его опубликовал. У меня есть страница, на которой я хочу отобразить все публичные сообщения, и если вы нажмете на сообщение, вы получите страницу с одним сообщением и некоторыми дополнительными опциями. Для этого я хочу загрузить результат запроса mysqli в двумерный массив. Это означало бы массив сообщений, и каждое сообщение само по себе является массивом с идентификатором, заголовком, телом и т. Д. В виде столбцов.

Итак, я начал со следующего кода. Переменная '$ link' содержит соединение mysqli (работает отлично).

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

print_r($array);

Это приводит только к одномерному массиву с последним сообщением. Поэтому я попробовал следующий цикл while:

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

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

Это работает следующим образом: отображает все сообщения, но не помещает их в массив (ведь я хочу выполнять задачи на основе идентификатора и положения массива сообщений в содержащем массиве). Кто-нибудь знает, как преобразовать этот вид результата запроса в хороший двумерный массив? Или совершенно другой, изящный способ сделать это? Заранее спасибо.

PS. Извините за мой английский, я не являюсь носителем языка.

Ответы [ 3 ]

15 голосов
/ 13 января 2012

Вы почти на месте, вам нужно всего лишь изменить несколько вещей:

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

Это приведет к чему-то вроде этого:

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

Если вы хотите идентификаторыв качестве ключей сделайте что-то вроде этого:

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

Что приведет к:

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

В PHP 5.3 вы также получите новый метод, который делает то же самое, что и первыйПример кода, который я разместил:

$messages = $result->fetch_all(MYSQLI_ASSOC);
0 голосов
/ 13 января 2012

Как должен выглядеть ваш окончательный массив?

Попробуйте это:

$result = $link->query("SELECT title, body FROM messages WHERE public = '1'");
$array = array();
while ($array[] = mysql_fetch_assoc($result)) {}
0 голосов
/ 13 января 2012

Если я вас правильно понял, вы хотите добиться чего-то, что получается:

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

Это даст вам двумерный массив, использующий идентификатор в качестве ключа.

...