WHERE语句问题更新所有行
我的应用程序中“更改我的密码”功能已将所有用户的密码重置为相同的值。我恢复了一个备份,所以没有大问题,除了这个可怕的错误,除了我自己以外没有任何错误。WHERE语句问题更新所有行
显然这是由于UPDATE语句中的WHERE条件没有值。这是通过CodeIgniter中的活动记录查询。为了避免这个问题有到位的保障:
if(!is_numeric($userdata['client_id'])) die('could not retrieve user ID from session');
一个typeof($userdata['client_id'])
告诉我,这是一个“串”所以我is_numeric检查应该工作的罚款。 $ userdata数组来自会话。
没有client_id 0的用户,他们都有一个数字值。
我认为这可能是通过用户访问“更改密码”页面发生的,等待直到会议记录X分钟后提交表格。我自己尝试过,它只是将它重定向回登录页面,因为它应该。
我的WHERE语句尝试将$userdata['client_id']
与client_id_fk值进行匹配。一个或两个测试客户端的client_id_fk为NULL - 这样的测试客户端是否可以重置密码导致了这种情况?
如果不是,我很难过。任何人?
我的第一个猜测是$userdata['client_id']
是null
和is_numeric()
是(误导性)返回true?
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.
从上面这似乎是你正在清理会话详细用户数据后,提交表单的细节,让用户数据不会提供密码更新查询。
此外所有记录得到更新意味着is_numeric($userdata['client_id'])
不按预期工作。
请问您能否先尝试提交表格详细信息,然后退出会话?
提交表单时,首先进行检查以确保该用户仍然登录,如果没有,则重定向到登录页面。 – stef 2010-09-27 11:21:12
is_numeric()
对整个字符串负载返回true。假设你的client_id
字段总是一个整数(应该是),那么使用is_int()
可能是一个更好的主意。如果client_id
没有被作为一个整数检索(或者你是从$_GET
阅读它),那么你可能还需要考虑使用(int)
铸造,例如:
$userdata['client_id'] = (int) $_GET['client_id'];
这应该确保你的价值有工作是一个整数,而不是像+1e10
(这将在is_numeric()
检查返回TRUE
。
http://uk.php.net/manual/en/function.is-numeric.php
此外,你应该尝试var_dump()
你的价值而不是在查询中运行它来调试它。
我不知道是否以及如何client_id可以为NULL,但我想通过其他错误是可能的。我添加了一个is_null检查来确保。谢谢。 – stef 2010-09-27 11:20:27