WHERE语句发出UPDATing所有行

时间:2010-09-27 10:34:23

标签: php mysql

我的应用中存在一个问题,即“更改我的密码”功能已将所有用户的密码重置为相同的值。我恢复了备份,所以没有重大问题,除了这个可怕的错误,除了我自己之外没有任何错误。

显然这是由于UPDATE语句中的WHERE条件没有值。这是通过CodeIgniter中的活动记录查询。为了避免这个问题,有一个安全措施:

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

typeof($userdata['client_id'])告诉我这是一个“字符串”,所以我的is_numeric检查应该运行正常。 $ userdata数组来自会话。

没有user_id为0的用户,他们都有一个数字值。

我认为这可能是通过用户访问“更改密码”页面发生的,等待会话在X分钟后将其记录下来,然后提交表单。我自己尝试了这个,它只是将我重新定向到登录页面,就像它应该的那样。

我的WHERE语句尝试将$userdata['client_id']与client_id_fk值匹配。一个或两个测试客户端的client_id_fk为NULL - 这样的测试客户端是否可以重置密码?

如果没有,我很难过。任何人吗?

3 个答案:

答案 0 :(得分: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后提交表单详细信息,因此userdata将无法用于密码更新查询。

此外,所有记录都会更新,因此is_numeric($userdata['client_id'])无法正常工作。

您可以先尝试提交表单详细信息,然后注销会话吗?

答案 1 :(得分:0)

我的第一个猜测是$userdata['client_id']nullis_numeric()(误导性地)是真的吗?

答案 2 :(得分: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()您的值,而不是在查询中运行它来调试它。