Вернуть более одной строки из определенной таблицы в базе данных - PullRequest
1 голос
/ 15 января 2011

В настоящее время я работаю над системой личных сообщений. Сейчас я кодирую входящие и поместил 2 строки временных данных в свою таблицу сообщений, чтобы проверить, что входящие работают правильно.

Я пытаюсь вернуть все строки, где этот запрос верен:

<?php
class Messages_model extends CI_Model {


    public function inbox()
    {
        $user_id = $this->session->userdata('user_id');
        $username = $this->session->userdata('username');

        return $this->db->query("SELECT * FROM messages WHERE to_id = $user_id AND to_user = '$username'"); //to_id = id of currently logged in and to_user = username
    }
}

Вот мой контроллер. В настоящее время я возвращаю только одну строку, хотя обе строки должны быть возвращены. Я создал обе строки в БД с to_id и to_user, равными моим данным сеанса. Таким образом, они должны быть возвращены не только один. Когда я использую row_array, возвращается первая строка, как описано в руководстве пользователя CI. Когда я использую result_array (), все равно возвращается только одна строка.

Что я хочу сделать, это создать таблицу в формате HTML с несколькими столбцами и 1 строкой для заголовка каждого столбца, например. тема, статус, дата. Тогда в строке внизу будут фактические данные субъекта и статус сообщения. Затем я хочу запустить цикл while или foreach, который будет отображать эту пустую строку каждый раз, когда строка возвращается из таблицы сообщений для входящих сообщений.

Вот мой контроллер:

<?php
class Messages extends Public_Controller {
    public function  __construct() {
        parent::__construct();

        $this->load->model('messages_model');

    }

    public function inbox()
    {


        $query = $this->messages_model->inbox(); // return from model which is basically a row from messages table
        if ($query->num_rows() != 0) // if rows returned is equal to 1

        {       
        foreach ($query->result_array() as $row) // give array variable the value row_array

        // grab specific elements from row and assign to variables
        $row['id'];
        $row['to_id'];
        $row['to_user'];
        $row['from_id'];
        $row['from_user'];
        $row['time_sent'];
        $row['subject'];
        $row['message'];
        $row['opened'];
        $row['replied'];

        $this->load->view('messages/inbox', $row);
        }

       else
        {
            echo "You have 0 messages in your inbox";
        }
    }
}

Надеюсь, я объяснил, что я пытаюсь сделать. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 января 2011

Кажется, что в вашей петле for отсутствуют фигурные скобки:

 foreach ($query->result_array() as $row) // give array variable the value row_array
 {
    // grab specific elements from row and assign to variables
    $row['id'];
    $row['to_id'];
    $row['to_user'];
    $row['from_id'];
    $row['from_user'];
    $row['time_sent'];
    $row['subject'];
    $row['message'];
    $row['opened'];
    $row['replied'];
 }

Цикл for относится только к первой строке, если вы не окружаете тело фигурными скобками.

1 голос
/ 15 января 2011

Во-первых, имейте в виду, что я не очень знаком с CodeIgniter. Ваша проблема, однако, довольно общая PHP:

foreach ($query->result_array() as $row) // give array variable the value row_array

    // grab specific elements from row and assign to variables
    $row['id'];
    $row['to_id'];
    $row['to_user'];
    $row['from_id'];
    $row['from_user'];
    $row['time_sent'];
    $row['subject'];
    $row['message'];
    $row['opened'];
    $row['replied'];

    $this->load->view('messages/inbox', $row);
}

Каждый раз, когда вы сталкиваетесь с рядом, вы звоните $this->load->view(). Я считаю, что вы должны вызывать представление только один раз со всеми данными, которые вы хотите передать. Вы, вероятно, хотите сделать что-то вроде этого:

$data = array();
foreach ($query->result_array() as $row) {
    $data[] = array (
        'id' => $row['id'],
        'to_id' => $row['to_id'],
        'to_user' => $row['to_user'],
        'from_id' => $row['from_id'],
        'from_user' => $row['from_user'],
        'time_sent' => $row['time_sent'],
        'subject' => $row['subject'],
        'message' => $row['message'],
        'opened' => $row['opened'],
        'replied' => $row['replied']
    );
}
$this->load->view('messages/inbox', $data);

Затем вам нужно будет обработать несколько сообщений в вашем представлении.

...