У меня проблема с набором результатов mysqli. У меня есть таблица, содержащая кучу сообщений. Каждая строка таблицы представляет одно сообщение. У меня есть несколько столбцов, таких как ID, заголовок, тело и «публика». Общий столбец содержит логические значения, указывающие, должно ли сообщение отображаться всем, или только тому, кто его опубликовал. У меня есть страница, где я хочу отображать все общедоступные сообщения, и если вы нажмете на сообщение, вы получите страницу с единственным сообщением и некоторые дополнительные опции. Для этого я хочу загрузить результат запроса 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. Извините за мой английский, я не носитель языка.
Вы почти там, вам нужно всего лишь изменить несколько вещей:
$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);
Если я исправлю вас, вы хотите достичь чего-то, что создается:
$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']; }
Это даст вам 2-мерный массив, используя идентификатор в качестве ключа.
Как должен выглядеть ваш последний массив?
Попробуй это:
$result = $link->query("SELECT title, body FROM messages WHERE public = '1'"); $array = array(); while ($array[] = mysql_fetch_assoc($result)) {}