我的数据库(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中运行它时,我得到一个错误。
严重性:警告消息:遇到非数字值
任何帮助或建议将不胜感激。
这显然是错误的:
$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'数据一起使用,如果不查看大量代码,您无法知道它是否安全。如果你通过查询清理它,你知道它总是被照顾,等等。
请享用!