codeigniter mysql 按位运算符

彼得-简·卡斯蒂尔斯

我的数据库中有一个值(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,但它仍然是错误的opperator&应该为任何算子来处理,例如<><>!=等。在,它也应该是一个字符串。就目前而言,它可能是语法(或类似的解析)错误,一个简单的测试告诉我:

警告在第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,最坏的情况是不会返回任何结果。

关键是,即使在查询中使用类常量时,也应该对其进行清理。特别是如果该常量作为函数参数传入。这是因为该函数可以与“不干净”的数据一起使用,如果不查看大量代码,您将无法知道它是否安全。如果您通过查询正确清理它,您就会知道它总是得到照顾,等等。

享受!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章