foreach给了我四次相同的行(PHP,Active Record,CodeIgniter)

时间:2014-09-17 21:27:59

标签: php mysql codeigniter activerecord 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 Loops Returning Four of the Same Row 有些相关但没有帮助。

更新1:

print_r($ comments); 给了我

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

var_dump($ comments); 给了我

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 个答案:

答案 0 :(得分:0)

在您的模型中使用result_array()对象上的$query。这将返回数组中的所有结果。 row_array()函数只会逐行返回。

FYI:这意味着在第一次调用row_array()时返回结果的第一行,再次调用第二行,第三次第三行,.......它适用于while循环。另一方面,result_array()将在单个数组中返回结果集中的所有结果(就我从控制器中的代码中看到的那样,这是您所期望的。)

答案 1 :(得分: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();
}

当然,在“$ comments as $ row”中使用$ row回显

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