Php WHERE语句发出更新所有行的命令

Php WHERE语句发出更新所有行的命令,php,mysql,Php,Mysql,我的应用程序中有一个问题,“更改我的密码”功能将所有用户的密码重置为相同的值。我恢复了一个备份,所以没有什么大问题,除了这个可怕的错误,除了我自己的错误 显然,这是因为UPDATE语句中的WHERE条件没有值。这是通过CodeIgniter中的活动记录查询实现的。为避免此问题,有一项保障措施: if( !is_numeric($userdata['client_id']) ) die('could not retrieve user ID from session'); typeof($use

我的应用程序中有一个问题,“更改我的密码”功能将所有用户的密码重置为相同的值。我恢复了一个备份,所以没有什么大问题,除了这个可怕的错误,除了我自己的错误

显然,这是因为UPDATE语句中的WHERE条件没有值。这是通过CodeIgniter中的活动记录查询实现的。为避免此问题,有一项保障措施:

if( !is_numeric($userdata['client_id']) ) die('could not retrieve user ID from session');
typeof($userdata['client\u id')
告诉我这是一个“字符串”,所以我的is\u数字检查应该可以正常工作。$userdata数组来自会话

没有客户端id为0的用户,他们都有一个数值

我认为这可能是通过用户访问“更改密码”页面,等待会话在X分钟后将其注销,然后提交表单来实现的。我自己也尝试过,它只是将我重定向回登录页面,这是应该的

我的WHERE语句尝试将
$userdata['client\u id']
与client\u id\u fk值匹配。一个或两个测试客户端的client_id_fk为NULL-这样的测试客户端重置其密码会导致这种情况吗

如果没有,我就被难倒了。有人吗

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. 我认为这可能是通过用户访问“更改密码”页面,等待会话在X分钟后将其注销,然后提交表单来实现的。我自己也尝试过,它只是将我重定向回登录页面,这是应该的。 从上面看,您似乎是在清除会话详细信息userdata之后提交表单详细信息,所以userdata将无法用于密码更新查询

此外,所有记录都得到更新意味着
是数值($userdata['client\u id'])
没有按预期工作


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

我的第一个猜测是,
$userdata['client\u id']
null
is\u numeric()
是(误导性地)返回true吗?

is\u numeric()
对于整个字符串负载返回true。假设您的
client\u id
字段始终是一个整数(应该是),那么使用
is\u int()
可能是一个更好的主意。如果<代码> clitTyId < /C>没有被检索为整数(或者您正在从<代码> $$GET中读取),那么您也可能想考虑使用<代码>(int)< /C> >,例如:

$userdata['client_id'] = (int) $_GET['client_id'];
这应该确保您使用的值是整数,而不是类似于
+1e10
(在
是数值()检查中返回
TRUE


此外,您应该尝试
var_dump()
您的值,而不是在查询中运行它来调试它。

我不确定客户端id是否为空以及如何为空,但我猜这可能是由于另一个错误造成的。我添加了一个is\u NULL检查以确保。谢谢。提交表单时,首先进行检查以确保该人仍然登录,如果不是,则重定向到登录页面.