【问题标题】:Call to a member function on non object in CodeIgniter在 CodeIgniter 中调用非对象上的成员函数
【发布时间】:2015-12-17 17:17:56
【问题描述】:

我正在尝试验证用户名并检查系统中是否已存在该用户名。现在的问题是我在表格中有用户列表:ea_user 以及表中的用户设置:ea_user_settings。现在:

ea_user > contain the id of the user that isn't remove from the system, the field 'data'

ea_user_settings > contain the username

所以我的功能是这样的:

 public function validate_username($username, $user_id)
{
    $num_rows = $this->db->join('ea_user_settings', 'ea_user_settings.id = ea_user.id', 'inner')
                          ->get_where('ea_user_settings',
                              array('username' => $username, 'id_users <> ' => $user_id, 'ea_user.data' => 0))->num_rows();
    return ($num_rows > 0) ? FALSE : TRUE;
}

问题是我得到这个错误:

致命错误:在非对象上调用成员函数 num_rows()

【问题讨论】:

    标签: sql codeigniter


    【解决方案1】:

    试试这个

    public function validate_username($username, $user_id)
    {
        $this->db->select(*);
        $this->db->from('table_name');
        $this->db->join('ea_user_settings', 'ea_user_settings.id = ea_user.id', 'inner')
        $this->db->get_where('ea_user_settings', array('username' => $username, 'id_users <> ' => $user_id, 'ea_user.data' => 0));
        $query = $this->db->get();
        $result = $query->result_array(); # add this
    
        $count = count($result);
            if (!empty($count)) {
                return true;
            }
            else{
                return false;
            }
        }
    }
    

    【讨论】:

    • 在非对象上调用成员函数 result_array(),用你的代码检查我的更新
    • 你得到了什么??'id_users ' => $user_id,
    • @Sandokan 乐于助人
    【解决方案2】:

    没有记录,但任何get() 函数(在您的情况下为get_where())都可以返回 FALSE。 (学到这个很难。)这似乎是你的问题。 FALSE-&gt;num_rows() 没有任何意义,因为 FALSE 不是对象。

    这通常是因为查询没有正确构建。 可以通过这样做来检查编译后的查询。

    public function validate_username($username, $user_id)
    {
      $this->db->select(*)
           ->from('ea_user_settings')
           ->join('ea_user_settings', 'ea_user_settings.id = ea_user.id', 'inner')
           ->where(array('username' => $username, 'id_users <> ' => $user_id, 'ea_user.data' => 0));
    
     $compiled_select = $this->db->get_compiled_select(NULL, FALSE);
     //inspect or var_dump($compiled_select) to see what query statement was built.
    

    在设置所有连接、位置和其他查询片段后,我在使用它的返回值之前检查了get() 的真实性。在你的情况下是这样的。代码在 $compiled_select = $this-&gt;... 行之后(或代替)提取

      if($query = $this->db->get())
      {
          return ($query->num_rows() > 0) ? FALSE : TRUE;
      } 
      else 
      {
          throw new Exception("get call returned FALSE");
      }   
    }
    

    对我来说,异常主要在开发过程中很有用。但是,如果有用的话,您可以将您的呼叫放在 try catch 块中。

    【讨论】:

    • 哦,如果 get() 返回 false,请尝试将可选的第三个参数设置为 where(),如在您的情况下,-&gt;where(array(...), NULL, FALSE); 我发现问题经常是错误地转义值。 FALSE 参数将阻止查询生成器转义输入。
    猜你喜欢
    • 2011-12-23
    • 2013-08-23
    • 2012-01-09
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多