如何在codeigniter中处理空数组?

时间:2016-09-08 17:09:39

标签: php codeigniter

所以这些是我的代码。

模型

function read() {
     $sql= "SELECT * from table WHERE name = 'rabin'";
     $query = $this->db->query($sql);
     $res = $query->result_array();
     return $res;
 }

控制器

function show() {
    $this->load->model("db");
    $array['data'] = $this->db->read();
    $this->load->view("page", $array);
 }

视图

foreach($data as $val) {
   "<p>" . echo $val['name']; . "</p>"
   "<p>" . echo $val['address']; . "</p>"
}

这里,当数据库中没有满足查询中WHERE子句的记录时,模型返回null,我收到错误$data expects parameter 1 to be array, null given。有几种方法可以解决这种情况。但是,处理这种情况的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

问题是数据库提供的foreach需要数据,但你没有给任何人。

所以我会这样做:

模型

function read() {

    $this->db->where('name', 'rabin');  
    $res = $this->db->get('table');

    return ($res->num_rows() > 0) ? $query->result_array() : false;

}

控制器

function show() {

    // $this->(model_name)->(function);
    $result = $this->db_model->read();

    if ( $result ) {
        // if there has data returns, load view

        $array['data'] = $result;
        $this->load->view('page', $array);      
    }
    else {
        // otherwise, show errors.
        // you can handle by yourself
        echo "no result!";
    }
}
  1. 始终使用Query Builder来阻止SQL Injection
  2. 模型返回result_arrayfalse,以便您可以处理结果。
  3. 如果查询结果只返回一行,请使用$res->row_array()。 (就像某个成员一样)。
  4. 您应该将模型从db重命名为(示例)db_model或其他。 db将与系统方法冲突。
  5. 从模型加载函数的方法是$this->model_name->function_name,例如,它应该是$this->db_model->read()
  6. 您应该加载模型(如果是db_model),例如$this->load->model('db_model')中的public function __construct() { }

答案 1 :(得分:1)

在你的模特中试试这个

function read() {
    $this->db->select()->from('table')->where('name', 'rabin');
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}

然后检查你是否得到了结果 - 在你的控制器中,

function show() {
     $this->load->model("db");
     $array= array( 'data' => $this->db->read());
     $this->load->view("page", $array);
 }

要在视图文件中查看结果,请执行print_r($data);

然后让我知道你得到的结果

答案 2 :(得分:1)

在你的视图中,if if else阻止了foreach循环。类似的东西:

<?php if ($data != FALSE): ?>
<?php
    foreach($data as $val)
    {
       "<p>" . echo $val['name']; . "</p>"
       "<p>" . echo $val['address']; . "</p>"
    }
?>
<?php else: ?>
<?php echo "There is no demanded data."; ?>
<?php endif; ?>

答案 3 :(得分:1)

这很像Benyi的答案,有点扭曲。

可能你最终希望模型能够找到“rabin”以外的名字。因此,这显示了如何通过将值传递给模型来实现这一点。此外,此模型方法始终返回对控制器有用的内容。

function read($name)
{
    $noRecords[] = array('name' => "No Results!", 'address' => "");

    if(empty($name))
    {
        return $noRecords;
    }

    //Such a simple query does not require Query Builder which adds a 
    //lot of extra processing to get to the same place as this query statement
    $sql = "SELECT * from table WHERE name = ?";
    //This is a "bound" query that will escape the input to guard against injection attacks 
    $query = $this->db->query($sql, array($name));
    $res = $query->result_array();

    if($res->num_rows() > 0)
    {
        return $query->result_array();
    }
    else
    {
        // send the controller an array containing a little something to explain what happened
        return $noRecords;
    }
    //the above if/else could also be expressed with this ternary
    // return $res->num_rows() > 0 ? $query->result_array() : $noRecords;   
}

控制器现在非常轻便。

function show()
{
    $name = 'rabin'; //some data for the model
    $array['data'] = $this->db_model->read($name);
    $this->load->view('page', $array);
}

您的观点也大大简化了

<?php foreach($data as $val): ?>
    <p><?php echo $val['name']; ?>"</p>"
    <p><?php echo $val['address']; ?>"</p>"
<?php endforeach; ?>