codeigniter 如何修复错误:count():参数必须是数组或实现Countable的对象

7rtdyuoh  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(121)

遇到PHP错误严重性:警告
消息:count():参数必须是数组或实现Countable的对象
文件名:文件名:
行号:17
回溯:
文件:C:\xampp\htdocs\labexercise007\application\models\login_model.php行:17功能:错误处理程序
文件:C:\xampp\htdocs\labexercise007\应用程序\控制器\登录. php行:31功能:登录
文件:C:\xampp\htdocs\labexercise007\应用程序\控制器\登录. 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;
    }
  }
}
nwlqm0z1

nwlqm0z11#

PHP v7.2.0 count()现在会对传递给array_or_countable参数的无效可计数类型发出警告。see more

z18hc3ub

z18hc3ub2#

如果结果集为空,则row_array()值为NULL,并且不能对其使用count。请在计数前检查row_array()返回的值。

稍后编辑

尝试移除此区块:

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

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

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

这应该会解决您的警告并传回适当的结果。

wrrgggsh

wrrgggsh3#

您是否尝试获取结果数组?在查询生成器的文档中,它是这样给出的。
如果是,则返回一个值。
在这种情况下,即使在查询中没有结果,它也总是返回一个数组。

of1yzvn4

of1yzvn44#

与其计算在您的情况下可能为空的行数组,因此您没有可计数的对象或数组,不如计算查询结果。

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

请改用查询生成器中内置的count records函数。

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

b1payxdu

b1payxdu5#

在模型中:

function getPaymentTotalCount($search)
{
    $sql = 'SELECT id FROM tbl_payment WHERE '.$search;
    $query = $this->db->query($sql);
    return $query->num_rows();  // <- replace row() to num_rows()
}

相关问题