codeigniter mysql побитовый оператор - PullRequest
0 голосов
/ 26 января 2019

У меня есть значение в моей базе данных (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, я получаю сообщение об ошибке.

Серьезность: предупреждение Сообщение: обнаружено нечисловое значение

Любая помощь или совет будут оценены.

1 Ответ

0 голосов
/ 26 января 2019

Это явно неверно:

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

Во-первых, у вас нет . для объединения строковой части в нестроковую.Даже если бы у вас было 'user_auth' . & $level, это все равно было бы неправильно, поскольку оператор & должен рассматриваться как любой оператор, такой как <, >, <> или != и т. Д. В этом случае он также должен бытьстрока.В нынешнем виде это, вероятно, синтаксическая (или подобная ошибка) синтаксического анализа, простой test сообщает мне следующее:

Warning : встречается нечисловое значениев [...] [...] в строке 5

Поэтому попробуйте это вместо:

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

AПростой пример проясняет это:

 #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, что в худшем случае не даст никаких результатов..

Суть в том, что даже при использовании констант класса в запросе его следует очищать.Особенно, если эта константа передается как аргумент функции.Это потому, что функцию можно использовать с «нечистыми» данными, и у вас нет возможности узнать, безопасно ли это, не просматривая много кода.Если вы очистите его по запросу, который, как вы знаете, всегда о нем заботятся и т. Д.

Наслаждайтесь!

...