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

Posted

技术标签:

【中文标题】foreach 给了我四次相同的行(PHP、Active Record、CodeIgniter)【英文标题】:foreach giving me the same row four times (PHP, Active Record, CodeIgniter) 【发布时间】:2014-11-12 02:00:36 【问题描述】:

我一直在努力解决的 foreach 问题。我对这个概念并不陌生,但我得到了奇怪的结果,我不知道为什么。我正在使用 phpmysql、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 保存的是字符串而不是数组。至于为什么它仍然试图四次回应相同的评论,我不知道。无论我的数据库中实际有多少 cmets,它始终是四个。

控制器

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($cmets);给我

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

var_dump($cmets);给我

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)

这解释了为什么它会四次回显同一行,但我仍然不知道如何将一个包含所有相关 cmets 的数组包含在内,而不仅仅是一个。我感觉我的模型有问题。将开始进一步探索。

var_dump($row);

string 'tribe' (length=5)

【问题讨论】:

调试这些类型的东西最好的朋友是print_rvar_dumpprint_r($comments) / var_dump($comments) 给你什么?此外,您的 order_by 语句看起来没有被合并到查询中。 我做到了,至少弄清楚了为什么要打印四个。我的数据库表有四列。 ID,姓名,文字,新闻。将更新我的问题以包含更多信息。 【参考方案1】:

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

仅供参考:这意味着第一次调用 row_array() 返回结果的第一行,第二行再次调用相同的函数,第三次第三行,...。它旨在用于 while 循环。另一方面,result_array() 将在单个数组中返回结果集中的所有结果(据我从控制器中的代码中可以看出,这是您所期望的)。

【讨论】:

【参考方案2】:

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();

当然,在 "$cmets as $row" 中使用 $row 来回显

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

【讨论】:

以上是关于foreach 给了我四次相同的行(PHP、Active Record、CodeIgniter)的主要内容,如果未能解决你的问题,请参考以下文章

我想在useEffect react Js中使用带有foreach的axios,但它给了我(无法读取属性Symbol(Symbol.iterator)错误?

为托管程序中的 foreach php pdo 提供的参数无效

如何在 php 中使用 implode 获取数据库表的列名

提交后不显示选中的行

尝试在 HTML 上显示时,PHP 函数给了我异常

SQL在php中给了我一个结果[关闭]