2010-10-05 79 views
1

这花了我太多的时间来弄清楚。我正在使用Codeigniter来查询数据库。 模型做到这一点Codeigniter计数/如果

function currentfunction($id) 
{ 
    $query = $this->db->get_where('mytable', array("id =" => $id)); 

    if($query->num_rows() > 0){ 
     return $query->result_array(); 
    }else { 
     return false; 
    } 
} 

控制器

$this->load->model('Display'); 
$results = $this->Display->currentfunction($id); 
$this->load->view('current_items', array('currentitems' => $results)); 

视图

foreach($currentitems as $row){ 
       echo $row['name'] 
       ///....do more 
       } 

作品就好了,除非没有行返回

然后

Message: Invalid argument supplied for foreach()... 

如何处理的,如果... ...其他情形

我试过this Q-A,但对我不起作用。 PlsHlp。

回答

0

只要做到:

if(is_array($currentitems)) { 
    foreach($currentitems as $row){ 
       echo $row['name'] 
       ///....do more 
    } 
} 
else 
{ 
    echo "No items in database!"; 
} 

因为的foreach预计其第一个参数是一个数组你得到一个错误。如果数据库中没有项目,但是你的函数返回false。

+0

谢谢。有用。 – 2010-10-05 00:28:07

+0

啊人。我写了代码给你,虽然:( – Pavan 2010-10-05 00:30:22

0

这是因为当你运行你的代码:

$query = $this->db->get_where('mytable', array("id =" => $id)); 

    if($query->num_rows() > 0){ 
     return $query->result_array(); 
    }else { 
     return false; 
    } 

时没有行返回上面的代码工作正常,它只是不工作,在你试图为循环运行的观点。 如果没有返回行,则不应运行此for循环。但即使没有可用的行,您仍尝试运行forloop。

我的建议是改变代码如下所示:

$查询= $这个 - > DB-> get_where( 'MYTABLE',阵列( “ID =”=> $ ID));

if($query->num_rows() > 0){ 
    return $query->result_array(); 
}else { 
    $noResults = true; 
} 

在视图中,您将有这样的事情之前,你的for循环:

if($noResults != true){ 
    foreach($currentitems as $row){ 
     echo $row['name'] 
     ///....do more 
    } 
} 
else{ 
    //do something 
    echo "No items in database!"; 

} 

希望这有助于。

PK

+0

是的,但是知道替代解决方案很好,谢谢 – 2010-10-05 00:33:08

+0

别担心,你在我之前有过,我们都有同样的想法,那就是你不能运行forloop没有先检查是否有任何行可以使用GrRr下一次我会在你之前到达那里:P很好 – Pavan 2010-10-05 00:39:18

0

你为什么不只是这样做:

function currentfunction($id) 
{ 
    return $this->db->get_where('mytable', array("id =" => $id)); 
} 

在视图中,如果没有结果,空数组将被返回,并foreach不会引发错误:

foreach($currentitems->result_array() as $row) 
{ 
    echo $row['name'] 
    ///....do more 
} 

干净多了IMO。

如果你想显示在您的视图中的错误信息,你可以这样做:

if($currentitems->num_rows() > 0) 
{ 
    foreach($currentitems->result_array() as $row) 
    { 
     echo $row['name'] 
     ///....do more 
    } 
} 
else 
{ 
    // Error message 
} 

这比检查好是否有与if/else语句两次,像哈夫丹和帕文所提出的建议结果。

+0

嗨,一个查询虽然不是if..else ..逻辑最好留给控制器在一个MVC模型中?但我不知道真正的优点是什么 – 2010-10-05 05:15:36

+0

在我看来,在视图中使用if/else或foreach迭代没有任何问题,在视图中我喜欢使用替代语法来控制结构(http ://php.net/manual/en/control-structures.alternative-syntax.php)保持视图更清晰如果你不想显示错误信息,你甚至不需要if/else! – Mischa 2010-10-05 06:11:08