SQL Select Query с активными записями CodeIgniter и 'where sha1' возвращает запись первой строки

Я продублировал эту проблему на полностью чистой установке CodeIgniter 2.0.2

Следующий код был добавлен в контроллер приветствия по умолчанию, и я создал «test_model», чтобы продемонстрировать ошибку.

Можно предположить / изменить конфигурацию / автозагрузку / базу данных: – правильное определение базового url – библиотека базы данных автозагрузки – регистрация установлена ​​на 4 (все сообщения) – параметры подключения к базе данных

Это то, что я добавил к контроллерам / welcome.php:

function test_me() { $this->load->model('test_model'); # data for sql query $where = array( 'email' => $this->input->post('email'), 'password' => sha1($this->input->post('password'), true); ); log_message('info', '----email: '.$where['email']); log_message('info', '----password: '.$where['password']); # exec query $query = $this->test_model->get_user($where); log_message('info', '----query->num_rows() ='.$query->num_rows()); if($query->num_rows() > 0) { $row = $query->row(); log_message('info', '----query->row()->email = '.$row->email); print $row->email; } else print "worked correctly."; # returned ZERO rows } 

Это модели / test_model.php:

 class Test_model extends CI_Model { var $_user_table = 'users'; # user table name // ------------------------------------------------------------------------ /** * Constructor * * @access public */ public function __construct() { log_message('INFO', 'User model initialized'); parent::__construct(); } /** * Get_user * * Retrieves user data from the database * * @access public * @param array sql select query data * @param int default return limits to 1 user * @param int offset * @return mixed sql query result */ public function get_user($data, $limit = 1, $offset = 0) { foreach($data as $where) log_message('INFO', 'Getting user data from db where: '.$where); # refer this as QUERY1 $query = $this->db->query('SELECT * FROM `users` WHERE `email` = \''.$data['email'].'\' AND `password` = \''.$data['password'].'\' LIMIT 1 OFFSET 0 '); # refer this as QUERY2 #$query = $this->db->get_where($this->_user_table, $data, $limit, $offset); log_message('info', 'get last sql query: '.$this->db->last_query()); return $query; } } 

В QUERY1 это просто использует прямой SQL со всеми параметрами, которые передаются QUERY2. Разница заключается в том, что QUERY2 использует активные записи CodeIgniter.

Теперь это журнал, полученный при запуске выше:

INFO – 2011-07-19 23:34:01 -> —- email: INFO – 2011-07-19 23:34:01 -> —- пароль: Ú9 £ î ^ kK2U¿ï • `¯Ø INFO – 2011-07-19 23:34:01 -> Получение пользовательских данных из db где:

INFO – 2011-07-19 23:34:01 -> Получение пользовательских данных из db где: Ú9 £ î ^ kK2U¿ï • `¯Ø

INFO – 2011-07-19 23:34:01 -> получить последний запрос sql: SELECT * FROM users WHERE email = '' AND password = 'Ú9 £ î ^ kK2U¿ï • `¯Ø' LIMIT 1 OFFSET 0

INFO – 2011-07-19 23:34:01 -> —- query-> num_rows () = 0

DEBUG – 2011-07-19 23:34:01 -> Окончательный вывод отправлен в браузер DEBUG – 2011-07-19 23:34:01 -> Общее время исполнения: 0.0923

Результат работы браузера: корректно работает.

И это то, что происходит, когда я комментирую QUERY1 и запускаю QUERY2 (CI's AR):

INFO – 2011-07-19 23:40:05 -> —- email:

INFO – 2011-07-19 23:40:05 -> —- пароль: ڹ Į ^ kK2U࠯ ֠ Я ؇

INFO – 2011-07-19 23:40:05 -> Получение пользовательских данных из db где: INFO – 2011-07-19 23:40:05 -> Получение пользовательских данных из db где: ڹ Į ^ kK2U࠯ ֠ Я ؇

INFO – 2011-07-19 23:40:05 -> получить последний запрос sql: SELECT * FROM ( users ) WHERE email = 0 И password = 'ڹ Į ^ kK \ r2U࠯ ֠ Я ؇' LIMIT 1

INFO – 2011-07-19 23:40:05 -> —- query-> num_rows () = 1

INFO – 2011-07-19 23:40:05 -> —- query-> row () -> email = myemail@gmail.com

DEBUG – 2011-07-19 23:40:05 -> Окончательный результат отправлен в браузер DEBUG – 2011-07-19 23:40:05 -> Общее время исполнения: 0.0965

Результат скрипта – myemail@gmail.com. Это первая строка в таблице и всегда возвращает первую строку таблицы. Если я не использую значение LIMIT = 1 по умолчанию, num_rows () фактически равно количеству строк в таблице.

Теперь, в фоновом режиме, я использую это как явно проверку скрипта формы, но форма не обязательно всегда заполняется. Я использую javascript для проверки, но это случай, когда браузер не мог включить javascript или если поля были отправлены пустым пользователем. База данных не имеет действительных пустых записей и не должна возвращать строки. Поскольку я храню хэши sha1 в качестве необработанных двоичных (20) данных, используется sha1 ('', true). Как ни странно, это создает какую-то ошибку, которую я предполагаю с помощью Active Records в CI и вместо того, чтобы возвращать ошибку или возвращать нулевые строки (как и следовало ожидать), она возвращает EVER row в таблице!

Я что-то делаю неправильно или это ошибка или не предполагаемый способ использования активных записей? Потому что я хотел бы сохранить метод принятия массива предложений where в запросе.

благодаря

  • ОБНОВИТЬ –

Спасибо пользователю, комментирующему ниже, за то, что он толкнул меня в этом направлении. Кажется, я ошибался в том, что sha1 имеет какое-то отношение к этому на самом деле … $ this-> input-> post () возвращает «False», если нет данных для сообщения (что в данном случае), и, таким образом, Значение «email» равно «false» в массиве.

Итак, теперь я нахожусь на другом вопросе, который я, вероятно, буду пересказывать, и именно поэтому, где email = 'false' возвращает всю таблицу?

  • ОБНОВИТЬ –

На самом деле, я никогда не видел этого раньше, потому что НИКОГДА не бывает … в QUERY1 (sql), он работает правильно. В QUERY2 с ActiveRecords этого нет. Так что все еще есть разница.