【问题标题】:How to fix error: count(): Parameter must be an array or an object that implements Countable如何修复错误:count():参数必须是数组或实现 Countable 的对象
【发布时间】:2021-01-07 02:26:38
【问题描述】:

遇到 PHP 错误 严重性:警告

消息:count():参数必须是数组或者实现了Countable的对象

文件名:models/login_model.php

行号:17

回溯:

文件:C:\xampp\htdocs\labexercise007\application\models\login_model.php 线路:17 函数:_error_handler

文件:C:\xampp\htdocs\labexercise007\application\controllers\login.php 线路:31 功能:登录

文件:C:\xampp\htdocs\labexercise007\application\controllers\login.php 线路:14 功能:运行

    <?php
class login_model extends CI_Model
{
  public function __construct()
  {
    parent::__construct();
    $this->load->database();
  }

  public function login($username, $password)
  {
    $condition_array = array(
      'user_name' => $username,
      'user_pass' => md5($password)
    );
    $rs = $this->db->get_where('users', $condition_array);
    $row_count = count($rs->row_array());

    if ($row_count > 0) {
      return $rs->row_array();
    } else {
      return FALSE;
    }
  }
}


    <?php
class Login extends CI_Controller
{
  public function index()
  {
    $data['title'] = 'Login';
    $this->load->view('login', $data);
  }
  public function verify()
  {
    $this->form_validation->set_rules('txtuser', 'Username', 'required');
    $this->form_validation->set_rules('txtpass', 'Password', 'required|callback_check_user');

    if ($this->form_validation->run() === TRUE) {
      if ($this->session->user_lvl == 1) {
        redirect('admin/home');
      } else {
        redirect('home');
      }
    } else {
      $this->index();
    }
  }

  public function check_user()
  {
    $username = $this->input->post('txtuser');
    $password = $this->input->post('txtpass');

    $this->load->model('login_model');
    $login = $this->login_model->login($username, $password);

    if ($login) {
      $sess_data = array(
        'account_name' => $login['user_accountname'],
        'user_lvl' => $login['user_lvl'],
        'islogged' => TRUE
      );
      $this->session->set_userdata($sess_data);
      return true;
    } else {
      $this->form_validation->set_message('check_user', 'Invalid Username/password');
      return false;
    }
  }
}

【问题讨论】:

    标签: codeigniter


    【解决方案1】:

    您应该计算查询结果,而不是计算在您的情况下可能为 null 的行数组,因此您没有可计数的对象或数组。

    $row_count = count($rs->row_array()); 
    

    改为使用查询生成器中内置的计数记录功能。

      public function login($username, $password)
      {
        $condition_array = array(
          'user_name' => $username,
          'user_pass' => md5($password)
        );
        $rs = $this->db->from('users')->where($condition_array)->get();
        
        $row_count = $this->db->num_rows();
    
        if ($row_count > 0) {
          return $rs->row_array();
        } 
        return FALSE;
      }
    

    更改了函数以删除 else 语句,因为在这种情况下不需要它。

    另外,我可能会补充一点,您不应该使用 MD5 来加密您的密码。 MD5 目前还不是很安全。

    有关在 codeigniter 3 上计算数据库结果的更多信息:https://codeigniter.com/userguide3/database/query_builder.html?highlight=count#limiting-or-counting-results

    【讨论】:

    • 如果您使用像 SELECT * FROM table WHERE x = 'y' 这样的 SQL 查询字符串而不是 Active Record 查询,那么您将不得不使用 num_rows(),就像在 -&gt;num_rows() 中一样
    【解决方案2】:

    您是否尝试获取结果数组?在查询生成器的文档中,它给出了这样的结果。

    $row_count = count($rs->getResultArray()) ;

    在这种情况下,即使您在查询中没有结果,它也会始终返回一个数组。

    【讨论】:

      【解决方案3】:

      如果您的结果集为空,则row_array() 值为NULL,您不能在其上使用count。在计数之前检查 row_array() 返回的内容。


      稍后编辑

      尝试删除此块:

          if ($row_count > 0) {
            return $rs->row_array();
          } else {
            return FALSE;
          }
      

      并将其替换为三元运算符调用:

          return $rs->row_array() ?: false;
      

      这应该可以解决您的警告并返回正确的结果。

      【讨论】:

      • 不太正确!在 PHP 7.2 之前,该函数将返回零。之后它会发出警告。
      • 没错。但是,我确实认为他需要在尝试计数之前检查结果集。
      • 我同意你的看法。
      【解决方案4】:

      PHP v7.2.0 count() 现在将对传递给 array_or_countable 参数的无效可数类型产生警告。 see more

      【讨论】:

        猜你喜欢
        • 2019-05-10
        • 2020-08-15
        • 2019-06-20
        • 2020-04-08
        • 2019-02-26
        • 2021-05-30
        • 2018-06-28
        • 2018-12-19
        • 1970-01-01
        相关资源
        最近更新 更多