Оператор WHERE выдает ОБНОВЛЕНИЕ всех строк

0

У меня есть проблема в моем приложении, где функция "изменить мой пароль" имеет reset ВСЕ пользовательский пароль для одного и того же значения. Я восстановил резервную копию, поэтому никаких серьезных проблем, кроме этой ужасной ошибки, не было никакой ошибки, кроме моей.

Очевидно, это произошло из-за условия WHERE в инструкции UPDATE, не имеющей значения. Это было через активный запрос записи в CodeIgniter. Чтобы избежать этой проблемы, существует гарантия:

if( !is_numeric($userdata['client_id']) ) die('could not retrieve user ID from session');

A typeof($userdata['client_id']) говорит мне, что это "строка", поэтому моя проверка is_numeric должна работать нормально. массив $userdata поступает из сеанса.

Нет пользователей с client_id 0, все они имеют числовое значение.

Я думал, что это могло произойти через пользователя, обращающегося к странице "сменить пароль", ожидая, пока сеанс не выйдет из системы через X минут, а затем отправит форму. Я пробовал это сам, и он просто перенаправляет меня обратно на страницу входа, как и должно быть.

Оператор My WHERE пытается сопоставить значение $userdata['client_id'] с значением client_id_fk. Один или два тестовых клиента имеют client_id_fk из NULL - может ли такой тестовый клиент сбросить свой пароль, вызвав это?

Если нет, я в тупике. Кто-нибудь?

Теги:

3 ответа

0
Лучший ответ

Мое первое предположение заключалось бы в том, что $userdata['client_id'] был null и is_numeric() (ошибочно) возвращает true?

  • 0
    Я не уверен, что и как client_id мог быть НЕДЕЙСТВИТЕЛЕН, но я предполагаю, что это возможно через другую ошибку. Я добавил проверку is_null, чтобы убедиться. Благодарю.
0

is_numeric() возвращает true для всей загрузки строк. Предполагая, что ваше поле client_id всегда является целым (оно должно быть), то использование is_int() может быть лучшей идеей. Если client_id не извлекается как целое число (или вы читаете его из $_GET), то вы также можете рассмотреть вопрос о его использовании с помощью (int), например:

$userdata['client_id'] = (int) $_GET['client_id'];

Это должно гарантировать, что значение, с которым вы работаете, представляет собой целое число, а не что-то вроде +1e10 (которое вернет TRUE в проверку is_numeric().

http://uk.php.net/manual/en/function.is-numeric.php

Кроме того, вы должны попробовать var_dump() ваше значение вместо того, чтобы запускать его в своем запросе для его отладки.

0
I thought this could have occurred through the user accessing the "change password" page, waiting till the session logged him out after X minutes and then submitting the form. I tried this myself and it just redirects me back to the login page, as it should.

Сверху кажется, что вы отправляете данные формы после очистки данных userdata, поэтому пользовательские данные не будут доступны для запроса обновления пароля.

Также все записи обновляются, значит, is_numeric($userdata['client_id']) работает не так, как ожидалось.

Не могли бы вы сначала отправить данные формы и вывести сеанс?

  • 0
    Когда форма отправлена, сначала выполняется проверка, чтобы убедиться, что человек все еще вошел в систему, если нет, он перенаправляет на страницу входа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню