2010-09-27 87 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()你的價值而不是在查詢中運行它來調試它。