【问题标题】:Codeigniter Count / IfCodeigniter 计数/如果
【发布时间】:2010-10-05 00:11:31
【问题描述】:

我花了很长时间才弄清楚。我正在使用 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()...

我该如何处理 if...else...场景

我试过this Q-A,但对我不起作用。请告知。

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    只要做:

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

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

    【讨论】:

      【解决方案2】:

      这是因为当您运行代码时:

      $query = $this->db->get_where('mytable', array("id =" => $id));
      
          if($query->num_rows() > 0){
              return $query->result_array();
          }else {
              return false;
          }
      

      当没有返回行时,上面的代码可以正常工作,只是在您尝试运行 for 循环的视图中不起作用。 如果没有返回行,则不应运行此 for 循环。然而,即使没有可使用的行,您仍试图运行 forloop。

      我的建议是像这样更改代码:

      $query = $this->db->get_where('mytable', array("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

      【讨论】:

      • 别担心。你比我先到那里。我们都有同样的想法。也就是说,如果不先检查是否有任何行可以使用,就无法运行 forloop。 GrRr 下次我会在你之前到达那里:P 不错
      【解决方案3】:

      你为什么不这样做:

      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 两次检查是否有结果要好,就像 halfdan 和 Pavan 建议的那样。

      【讨论】:

      • 嗨,一个查询。 if..else.. 逻辑不是最好留给 MVC 模型中的控制器吗?但我不确定真正的优势是什么。
      • 在我看来,在视图中使用 if/else 或 foreach 迭代没有任何问题。在视图中,我喜欢使用控制结构的替代语法 (php.net/manual/en/control-structures.alternative-syntax.php) 以保持视图更清晰。如果你不想显示错误信息,你甚至不需要 if/else!
      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多