2012-06-03 73 views
2

我有一個頁面標題changepassword.php ...在此頁面中,用戶可以更改其帳戶的密碼。查詢通過併發送它發送的消息,但是,數據庫不會更改。密碼保持與原來相同。我正在使用我不習慣的sha1散列(第一次使用它)。任何人都知道它發生了什麼?謝謝!php sql中的更新不會更新數據庫

<?php 

    session_start(); 

    $user_name = $_SESSION['user_name']; 

    if($user_name) 
    { 
    //user is logged in 

    if(isset($_POST['submit'])) 
    { 
    //check fields 

    $oldpassword = $_POST['oldpassword']; 
    $newpassword = $_POST['newpassword']; 
    $repeatnewpassword = $_POST['repeatnewpassword']; 

    //check password against db 

    $connect=mysql_connect("localhost","root","passssssssword") or die(); 
    mysql_select_db("database") or die(); 

    $queryget= mysql_query ("SELECT user_pass FROM users WHERE user_name='$user_name'")   or die("Query didn't work."); 
    $row = mysql_fetch_assoc ($queryget); 

    $oldpassworddb = $row['user_pass']; 

    //check passwords 

if (sha1($oldpassword)==$oldpassworddb) 
{ 
    if ($newpassword==$repeatnewpassword) 
    { 
     if (strlen ($newpassword)>25 || strlen ($newpassword)<6) 
     { 
     echo "Password must be between 6 and 25 characters"; 
     } 
     else 
     { 
     //change password in db 

     $newpassword = sha1($newpassword); 

     $querychange = mysql_query("UPDATE users SET   password='$newpassword' WHERE user_name='$user_name'"); 
     session_destroy(); 
     die ("Your password has been changed. <a   href='index.php'>Return</a> to the main page and login with your new password."); 
     } 

    } 
    else 
     die ("New passwords do not match!"); 

} 
else 
    die ("Old password is inncorrect!"); 

    } 

    else 
    { 
    echo 
    "<form action = 'changepassword.php' method = 'POST'> 
    <table> 
    <tr> 
     <td> 
    Old password: 
     </td> 
     <td> 
    <input type='text' name='oldpassword'><p> 
     </td> 
    </tr> 
    <tr> 
     <td> 
    New password: 
     </td> 
     <td> 
    <input type='password' name='newpassword'> 
     </td> 
    </tr> 
    <tr> 
     <td> 
    Repeat new password: 
     </td> 
     <td> 
    <input type='password' name='repeatnewpassword'> 
     </td> 
    </tr> 
    <table> 
    <input type='submit' name='submit' value='Change password'> 
    </form> 
    "; 
    } 


    } 
    else 
die("You must be logged in to change your password!"); 
    ?> 
+1

@Delan Azabani:「如果新密碼中有單引號,你會怎麼想?」---什麼都不會發生,它會被哈希 – zerkms

+2

@zerkms:是的,但是用戶名至少應該是肯定的被消毒。 – Litty

+0

爲什麼要限制密碼的最大長度? –

回答

5

QUERY_1:

SELECT user_pass FROM users WHERE user_name='$user_name' 

你Query_2:

UPDATE users SET **password**='$newpassword' WHERE user_name='$user_name' 

但是,Query_2應該是:

UPDATE users SET **user_pass**='$newpassword' WHERE user_name='$user_name' 
+0

+1,超好看的眼睛。 – Litty

+0

'$ querychange'將會是'false' – manuskc

+0

感謝您注意! – ryno

1

不知道文字/單引號將允許PHP內插變量。我通常也使用sprintf。另外,一般來說,你不想只檢查用戶名,但用戶名和舊密碼。

"SELECT user_pass FROM users WHERE user_name='$user_name'" 

應該是: $ SQL = sprintf的(%s「從用戶其中user =選擇user_pass 」「,$ USER_NAME);

還,你的 」死()「 將是你更好輸出mysql_error(),即

$connect=mysql_connect("localhost","root","passssssssword") or die(); 
mysql_select_db("database") or die("cannot connect".mysql_error()); 

但是,可能解決的最快方法是把一個錯誤的請求mysql_query:

$sql = sprintf("UPDATE users SET password="%s" WHERE user_name="%s"",$newpassword,$user_name); 
$querychange = mysql_error($sql) or die ("Error updating: ".mysql_error());