Конструктор кода, использующий 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
Но текст из моей базы данных отображается в верхней части страницы за пределами заголовка, поэтому я знаю, что база данных подключается и данные из нее собираются. Мочь кто-нибудь скажет мне, где я ошибаюсь?
6 answers
У вас просто есть проблема в вашей функции модели, просто замените ее на:
$query = $this->db->query('SELECT id, date, text FROM news');
$result = $query->result_array();
return $result;
В своем контроллере вы правильно присваиваете результат модели переменной:
$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
Пожалуйста, попробуйте это:
На странице просмотра:
<?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 } ?>
<?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)
.
Использовать
foreach($thing as $something): //it is important if not compulsory to use a different name for variables!!
some HTML
endforeach;
Вместо
Попробуйте это для вашего ответа:
Ваш контроллер:
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 } ?>