mysql — foreach дает мне одну и ту же строку четыре раза (PHP, Active Record, CodeIgniter)

У меня есть проблема с foreach, с которым я борюсь в течение долгого времени. Я не новичок в этой концепции, но получаю странные результаты и не знаю почему. Я использую php, MySQL, Active Record и CodeIgniter. Я пытаюсь повторить все комментарии новости. Текущая версия ниже наиболее близка к работе. Это дает мне самый ранний комментарий четыре раза. Когда я вхожу в модель и меняю asc на desc, я получаю самый последний комментарий четыре раза.

Посмотреть

<?php
foreach ($comments as $row) {
echo '<h4>'.$comments['name'].'</h4>';
echo $comments['text'];
}
?>

Да, я понимаю, что должен повторять ряд, вот так.

<?php
foreach ($comments as $row) {
echo '<h4>'.$row['name'].'</h4>';
echo $row['text'];
}
?>

Но это дает мне «недопустимое смещение строки«, как для имени, так и для текста, по четыре раза каждый, что, по-видимому, говорит о том, что $ row содержит строку вместо массива. Что касается того, почему он все еще пытается повторить один и тот же комментарий четыре раза, я понятия не имею. Это всегда четыре независимо от того, сколько комментариев у меня на самом деле есть в моей базе данных.

контроллер

public function view($slug)
{
$this->load->helper('form');
$this->load->library('form_validation');
$data['news_item'] = $this->news_model->get_news($slug);
$data['comments'] = $this->news_model->get_news_comments($slug);
$this->form_validation->set_rules('name', 'Name', 'required');
$this->form_validation->set_rules('text', 'text', 'required');

if (empty($data['news_item']))
{
show_404();
}

$data['title'] = $data['news_item']['title'];
$slug = $data['news_item']['slug'];

if ($this->form_validation->run() === FALSE)
{
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/rowter');
}
else
{
$this->news_model->set_news_comment($slug);
$this->load->view('news/success');
}
}

модель

public function get_news_comments($slug)
{
$this->db->order_by("id", "asc");
$query = $this->db->get_where('news_comments', array('news' => $slug));
return $query->row_array();
}

Если у вас есть идеи, что я делаю не так, пожалуйста, помогите мне. Кроме того, я хотел бы знать, почему позади, что идет не так, и почему это повторяет один и тот же ряд четыре раза.

Циклы while / foreach, возвращающие четыре одинаковых ряда
несколько связан, но не помог.

ОБНОВЛЕНИЕ 1:

print_r ($ комментарии); дает мне

Array ( [id] => 7 [name] => Mos Def [text] => And you call yourselves intellectuals [news] => tribe )

var_dump ($ комментарии); дает мне

array (size=4)
'id' => string '7' (length=1)
'name' => string 'Mos Def' (length=7)
'text' => string 'And you call yourselves intellectuals' (length=37)
'news' => string 'tribe' (length=5)

Это объясняет, почему он повторяет одну и ту же строку четыре раза, но я все еще не уверен, как включить массив со всеми соответствующими комментариями, а не только один. У меня есть ощущение, что есть проблема с моей моделью. Начну изучать дальше.

var_dump ($ строка);

string 'tribe' (length=5)

2

Решение

В вашей модели используйте result_array() на ваше $query объект. Это вернет вам все результаты в массиве. row_array() Функция будет возвращать только строку за строкой.

К вашему сведению: это означает, что при первом звонке row_array() возвращает первый ряд вашего результата, снова вызывая ту же функцию, второй ряд, третий раз третий ряд, …. Он предназначен для использования во время цикла. result_array()с другой стороны, вернет ВСЕ результаты в наборе результатов в одном массиве (это то, что вы ожидали, насколько я вижу из вашего кода в контроллере).

0

Другие решения

row_array () получает только строку. Его следует изменить на result_array (), чтобы получить все необходимые столбцы и строки.

public function get_news_comments($slug)
{
$this->db->order_by("id", "asc");
$query = $this->db->get_where('news_comments', array('news' => $slug));
return $query->result_array();
}

и, конечно, эхо, используя $ row в «$ comments as $ row»

foreach ($comments as $row) {
echo '<h4>'.$row['name'].'</h4>';
echo $row['text'];
0