codeigniter mysql按位运算符

问题描述 投票:0回答:1

我的数据库(int)十进制值。我的codeigniter应用程序中有几个常量链接到二进制1 - 2 - 4 - 8 - ....

我希望能够显示具有特定二进制访问级别的所有用户。

public function query($level = 0)
{
    $data = NULL;

    $this->db->select('user_id, user_email, user_name, user_firstname, user_imageammount, user_auth');
    $this->db->from('users');
    $this->db->where('user_auth' & $level);

    $query = $this->db->get();

    if ( $query->num_rows() > 0 )
    {
        $data = $query->result_array();
    }

    return $data;
}

当我在我的phpmyadmin中直接运行查询时,我得到了我需要的结果。

SELECT `user_id`, `user_email`, `user_name`, `user_firstname`, `user_imageammount`, `user_auth` FROM `users` WHERE `user_auth` & 1

当我在codeigniter中运行它时,我得到一个错误。

严重性:警告消息:遇到非数字值

任何帮助或建议将不胜感激。

php mysql codeigniter bitwise-operators
1个回答
1
投票

这显然是错误的:

$this->db->where('user_auth' & $level);

首先,你没有.将字符串部分连接到非字符串部分。即使你有'user_auth' . & $level,它仍然是错误的,因为操作者&应该被视为任何操作者,如<><>!=等。因为它也应该是一个字符串。因为它可能是一个语法(或类似的解析)错误,一个简单的test告诉我这个:

警告:第5行[...] [...]中遇到非数字值

所以试试这个:

 $this->db->where('user_auth & '.(int)$level);

一个简单的例子说明了这一点:

 #this is wrong
 $sql = "SELECT * FROM table WHERE user_auth" & 1;

 #this is correct
 $sql = "SELECT * FROM table WHERE user_auth & 1";

对于这个人你可以逃脱只需将level转换为INT,这应该很好地消毒它,因为它只是一个整数值。我必须确保理解消毒始终是重要的。准备好的查询是首选的,但是如果它是一个简单的INT(最有可能是从类常量中提取),我们就可以将其转换为非INT的任何东西,只会变成0,最坏的情况是不会返回任何结果。

关键是,即使在查询中使用类常量,也应该对其进行清理。特别是如果该常量作为函数参数传入。这是因为该函数可以与'unclean'数据一起使用,如果不查看大量代码,您无法知道它是否安全。如果你通过查询清理它,你知道它总是被照顾,等等。

请享用!

© www.soinside.com 2019 - 2024. All rights reserved.