2013-04-29 91 views
3

我目前有一些麻煩,讓登錄系統工作,我相信我找到了原因,雖然我不知道爲什麼發生或具體造成它。從數據庫檢索PHP截斷哈希密碼

我有一個散列密碼存儲在數據庫中。在password列的值是:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7de 

現在,當我去簡單地選擇和打印領域在PHP中像這樣:

$query = "SELECT password FROM webusers WHERE username = 'Roy'"; 
$update = odbc_exec($connect, $query); 
$row = odbc_fetch_array($update); 
print $row['PASSWORD']; 

它輸出:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7d 

滾動到這兩個哈希的結尾,你會看到第二個哈希缺少最後的'e',所以這是拋棄我的整個登錄系統。爲什麼會發生這種情況?我不確定PHP或SQL是否應該受到指責。

我使用PHP 5.4.7,數據庫是通過ODBC連接的4D SQL服務器。

編輯:password的數據類型是Text其中,根據4D手冊,可容納多達2GB的數據,以便列大小不是問題。

+1

數據庫中'password'字段的數據類型是什麼?當您直接在數據庫中查看密碼字段(通過PHPMyAdmin或其他工具)時,您是否看到最後一個e? – MatthewMcGovern 2013-04-29 15:10:55

+0

在db中增加這個字段的長度 – 2013-04-29 15:12:24

+0

@MatthewMcGovern是的,當我在4D中查看數據庫字段時,我確實看到了最後的e。字段類型是「文本」。 – Roy 2013-04-29 15:13:11

回答

0

要確定您的問題是在MySQL還是PHP,請直接登錄到MySQL並確定您是否能夠直接執行SQL命令時檢索完整值。我將使用PHP正在使用的相同的SQL查詢,以便您可以看到應用程序將看到的與MySQL系統相同的輸出。如果您在MySQL中時看到截斷值(PHP不再是圖片的一部分),那麼您肯定知道您已經超出了您在MySQL中定義的字段的字符限制。同樣,如果字符串完美顯示,那麼PHP必須截斷值。

如果PHP截斷值,那麼它可能是mysql_result對象的限制,或者它可能是PHP的系統限制,這似乎不太可能。通過進一步縮小問題的位置,您的答案將變得清晰。

我還沒有見過PHP截斷一個字符串,永遠。在爲電子郵件創建附件標頭時,我至少將一兆字節的數據存儲在單個字符串值中。我不相信你的限制在於PHP本地語言。

+0

這不是MySQL的我使用的,但4D的SQL實現。該字段在數據庫本身內沒有問題。我已經使用了一種解決此問題的不同方法,但它看起來像故障在我使用的古老的ODBC驅動程序中。我寧願不使用它,但不幸的是,我必須建立一個現有的15歲左右的系統,並且沒有多少選擇。無論如何感謝您的迴應! – Roy 2013-05-15 10:37:38