2010-09-27 85 views
0

我的应用程序中“更改我的密码”功能已将所有用户的密码重置为相同的值。我恢复了一个备份,所以没有大问题,除了这个可怕的错误,除了我自己以外没有任何错误。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 - 这样的测试客户端是否可以重置密码导致了这种情况?

如果不是,我很难过。任何人?

回答

0

我的第一个猜测是$userdata['client_id']nullis_numeric()是(误导性)返回true?

+0

我不知道是否以及如何client_id可以为NULL,但我想通过其他错误是可能的。我添加了一个is_null检查来确保。谢谢。 – stef 2010-09-27 11:20:27

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. 

从上面这似乎是你正在清理会话详细用户数据后,提交表单的细节,让用户数据不会提供密码更新查询。

此外所有记录得到更新意味着is_numeric($userdata['client_id'])不按预期工作。

请问您能否先尝试提交表格详细信息,然后退出会话?

+0

提交表单时,首先进行检查以确保该用户仍然登录,如果没有,则重定向到登录页面。 – stef 2010-09-27 11:21:12

0

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()你的价值而不是在查询中运行它来调试它。