Конструктор кода, использующий foreach в представлении


Я использую Codeigniter в настройке Apache xampp и пытаюсь впервые использовать foreach в представлении, и я просто не могу заставить его работать.

Мой код контроллера:

class Test extends CI_Controller {

        public function index($page = 'testv')
    {
            if ( ! file_exists(APPPATH.'/views/'.$page.'.php'))
            {
                show_404();
            }
                $this->load->model('testm');
                $data['news'] = $this->testm->get_news();

                $this->load->view('headder');
                $this->load->view($page, $data);
                $this->load->view('footer');
    }
}

Моя модель:

class Testm extends CI_Model {

    public function __construct()
    {
        parent::__construct();
    }

    Public function get_news()
    {
        $query = $this->db->query('SELECT id, date, text FROM news');

        foreach ($query->result_array() as $row)
        {
            echo $row['id'];
            echo $row['date'];
            echo $row['text'];
        }
    }
}

Мое мнение:

<main id='central_section'>
    <section id='logo_section'>
    <img src='<?php echo base_url(); ?>img/logo.png' id='small_logo' alt="Logo">
    </section>
    <section id='content'>
        <p class="large_headding">News</p>

            <?php foreach($news as $news) { ?>
                <article class="article_text">
                    <p class="segment_headding"><?php echo $news->date; ?></p>
                        <?php echo $news->text; ?>
                </article>
            <?php } ?>
        <div id="spacer"></div>
    </section>
</main>

В настоящее время я получаю следующее предупреждающее сообщение:

A PHP Error was encountered

Severity: Warning

Message: Invalid argument supplied for foreach()

Filename: views/testv.php

Line Number: 18

Backtrace:

File: C:\xampp\htdocs\tsh\CI\application\views\testv.php
Line: 18
Function: _error_handler

File: C:\xampp\htdocs\tsh\CI\application\controllers\test.php
Line: 16
Function: view

File: C:\xampp\htdocs\tsh\public_html\index.php
Line: 292
Function: require_once

Но текст из моей базы данных отображается в верхней части страницы за пределами заголовка, поэтому я знаю, что база данных подключается и данные из нее собираются. Мочь кто-нибудь скажет мне, где я ошибаюсь?

Author: Marco Bonelli, 2015-04-16

6 answers

У вас просто есть проблема в вашей функции модели, просто замените ее на:

$query = $this->db->query('SELECT id, date, text FROM news');
$result = $query->result_array();
return $result;
 1
Author: Imran Qamer, 2015-04-16 17:17:14

В своем контроллере вы правильно присваиваете результат модели переменной:

$data['news'] = $this->testm->get_news();

Но в вашей модели вы ПОВТОРЯЕТЕ результат, а не ВОЗВРАЩАЕТЕ их. ТАКИМ образом, $data['news'] - это null (поскольку метод модели ничего не возвращает), и вы не можете повторить null of курс ->, и это ошибка, на ваш взгляд. Измените свою модель, чтобы вернуть массив, например:

Public function get_news()
{
    $query = $this->db->query('SELECT id, date, text FROM news');
    return $query->result_array();
}

Текст из моей базы данных действительно отображается в верхней части страница

Потому что, действительно, вы повторяете это (как указано выше) до вывода представлений, поэтому вы видите их перед отображаемым html

 3
Author: Damien Pirsy, 2015-04-16 15:25:57

Пожалуйста, попробуйте это:

На странице просмотра:

<?php foreach($news->result() as $new) { ?>
        <article class="article_text">
            <p class="segment_headding"><?php echo $new->date; ?></p>
                <?php echo $new->text; ?>
        </article>
    <?php } ?>
 2
Author: , 2015-04-17 09:02:54
        <?php foreach($news as $new) { ?>
            <article class="article_text">
                <p class="segment_headding"><?php echo $new->date; ?></p>
                    <?php echo $new->text; ?>
            </article>
        <?php } ?>

Попробуйте foreach($news as $new) вместо foreach($news as $news).

 1
Author: ryush00, 2015-04-16 16:10:38

Использовать

foreach($thing as $something): //it is important if not compulsory to use a different name for variables!!
some HTML
endforeach;

Вместо

 1
Author: Omar El Don, 2015-04-17 04:32:38

Попробуйте это для вашего ответа:

Ваш контроллер:

public function index($page = 'testv')
{
        if ( ! file_exists(APPPATH.'/views/'.$page.'.php'))
        {
            show_404();
        }
            $this->load->model('testm');
            $data['news'] = $this->testm->get_news();

            $this->load->view('headder');
            $this->load->view($page, $data);
            $this->load->view('footer');
}

Функция модели:

Public function get_news()
{
    $query = $this->db->query('SELECT id, date, text FROM news');
    return $query;
}

В файле просмотра:

<?php foreach($news->result() as $new) { ?>
    <article class="article_text">
        <p class="segment_headding"><?php echo $new->date; ?></p>
            <?php echo $new->text; ?>
    </article>
<?php } ?>
 1
Author: Uraj, 2015-04-17 09:59:28