【问题标题】:codeigniter mysql bitwise operatorcodeigniter mysql 位运算符
【发布时间】:2019-01-25 23:08:36
【问题描述】:

我的数据库中有一个值 (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);

标签: php mysql codeigniter bitwise-operators


【解决方案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,最坏的情况是不会返回任何结果.

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

享受吧!

【讨论】:

  • 确定这是一个简单的错字,你应该在开发时打开完整的错误报告,然后你会看到这是一个警告。让 PHP 告诉你哪里出了问题。
  • 确实是个好主意。我对 php 的开发很陌生,所以欢迎所有建议。顺便说一句,&~(而不是)运算符在 mysql 中可能吗?我似乎只是收到 & 运算符。
  • @Pieter-JanCasteels &~ 在 MySQL 中运行良好(例如 SELECT 24&~8 返回 16)dbfiddle.uk/…
  • 很奇怪。在我的 mysql 中,我没有收到正确的信息。使用 & 运算符,我收到一次计数 1 并且使用 &~ 我收到​​所有这些? i.imgur.com/7q6ckuC.jpg
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2016-01-09
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多