Php 如何处理codeigniter中的空数组?

Php 如何处理codeigniter中的空数组?,php,codeigniter,Php,Codeigniter,这是我的密码 模型 控制器 function show() { $this->load->model("db"); $array['data'] = $this->db->read(); $this->load->view("page", $array); } 看法 foreach($val数据){ “”.echo$val['name'];。”” “”.echo$val['address'];。”” } 在这里,当数据库中没有满足

这是我的密码

模型

控制器

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

foreach($val数据){
“”.echo$val['name'];。”

” “”.echo$val['address'];。”

” }

在这里,当数据库中没有满足查询中WHERE子句的记录时,模型返回null,我得到的错误是,
$data期望参数1是数组,null给定。有几种方法可以处理这种情况。但是,处理这种情况的最佳方法是什么呢?

在您的模型中,尝试一下这个方法

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);
 }
要在视图文件中查看结果,请执行打印($data)


然后让我知道你在模型中得到了什么/结果

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);
 }
要在视图文件中查看结果,请执行打印($data)


然后让我知道你得到了什么/result

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

因此,我将这样做:

模型 控制器
  • 使用“始终”可防止
    SQL注入
  • 模型返回
    结果\u数组
    ,或
    ,以便您可以处理结果
  • 如果查询结果只返回一行,请使用
    $res->row\u array()
    。(像某一位成员)
  • 您应该将模型从
    db
    重命名为(示例)
    db\u model
    或其他。
    db
    将与系统方法冲突
  • 从模型加载函数的方法是
    $this->model\u name->function\u name
    ,例如,它应该是
    $this->db\u model->read()
  • 您应该加载模型(如果它是
    db\u model
    ),就像
    $this->load->model('db\u model')
    中的
    公共函数{}
    一样

  • 问题是,
    foreach
    需要数据库提供的数据,但您没有给他们任何人

    因此,我将这样做:

    模型 控制器
  • 使用“始终”可防止
    SQL注入
  • 模型返回
    结果\u数组
    ,或
    ,以便您可以处理结果
  • 如果查询结果只返回一行,请使用
    $res->row\u array()
    。(像某一位成员)
  • 您应该将模型从
    db
    重命名为(示例)
    db\u model
    或其他。
    db
    将与系统方法冲突
  • 从模型加载函数的方法是
    $this->model\u name->function\u name
    ,例如,它应该是
    $this->db\u model->read()
  • 您应该加载模型(如果它是
    db\u model
    ),就像
    $this->load->model('db\u model')
    中的
    公共函数{}
    一样

  • 在您的视图中,将if-than-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; ?>
    

    在视图中,使用foreach循环放置if-than-else块。比如:

    <?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; ?>
    

    这很像本义的答案,但有点扭曲

    也许您最终会希望模型能够查找除“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; ?>
    

    ” “


    这很像本义的答案,但有点扭曲

    也许您最终会希望模型能够查找除“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; ?>
    

    ” “


    谢谢您的评论,但问题不在于代码。如果名称字段中有“rabin”,则返回所有数据;如果名称字段中没有“rabin”,则返回null。问题是我如何以最好的方式处理错误。@RabinLama在回答中更改了控制器。然后执行
    打印($data)在您的视图中感谢您的评论,但问题不在于代码。如果名称字段中有“rabin”,则返回所有数据;如果名称字段中没有“rabin”,则返回null。问题是我如何以最好的方式处理错误。@RabinLama在回答中更改了控制器。然后执行
    打印($data)
    在您的视图中,以与在PHP中检查相同的方式:
    如果(is_array($data)&&&$data){foreach($data……
    嗯,这是处理错误的基本方法。但这是最好的方法吗?是的,是的。您的视图只需要确保提供了它需要处理的确切数据类型。如果您开始胡乱处理
    If($data!=FALSE){}
    那么您的代码将变得越来越脆弱。想象一下,如果
    $this->db->read();
    开始返回字符串作为可变输出的一部分或
    null
    ,那么您将不得不返回并重新计算
    if(){}
    阻塞。但是,如果您将视图的结构设置为仅在收到预期数据类型时才执行操作,则视图将继续执行此操作。下面继续……唯一的警告是,如果出现故障,则可能会使调试根本原因变得有点棘手,但至少您的用户不会受到错误或空白屏幕的轰炸在视图中,您可以使用
    if($data)foreach($data as$val)
    处理是否有结果。与您在PHP中检查的方法相同:
    if(is_array($data)&&&&$data){foreach($data……
    这将是处理错误的基本方法。但这是最好的方法吗