2011-12-27 11 views
0

ログインシステムの開発中に問題が発生しました。私は、複数のユーザーのログインを処理するクラスを作成します。また、管理者用の管理領域も作成しました。彼は新しいユーザーを追加したり、パスワードを変更したり、ユーザーを削除したりすることができます。ユーザーパスワードを変更する

今のところ私は新しいユーザーを追加してパスワードの部分を変更することができました。私が今問題にしているのは、パスワードの変更部分です。

私はこのような構造を持つテーブルを持っている:

TABLE user 
id int(11) AUTO INCREMENT 
admin int(11) DEFAULT 0 
username varchar(256) 
password varchar(256) 

テーブルから、管理者がユーザのタイプを定義し、0がIは、上記で説明したものを行うことができる管理者ユーザ用の通常のユーザと1のためのものです。

私にuserPasswordを変更するには、次の機能を持っている:

public function changeUserPassword($cusrn,$oldPass,$newPass,$newPassConfirm) { 
    if(strlen($newPass) < 4) { 
     $error = true; 
     $message['error'] = true; 
     $message['message'] = "The Password is to short"; 
     return json_encode($message); 
    } 
     elseif($newPass != $newPassConfirm) { 
      $error = true; 
      $message['error'] = true; 
      $message['message'] = "Confirmed Password doesn't match"; 
      return json_encode($message); 
     } 
      elseif(!(ALLOW_SPECIAL_CHARACTERS == true) && preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $newPass)) { 
       $error = true; 
       $message['error'] = true; 
       $message['message'] = "Special characters are not allowed"; 
       return json_encode($message); 
      } 
       elseif(!(ALLOW_NUMBERS == true) && preg_match('#\d#',$newPass)) { 
        $error = true; 
        $message['error'] = true; 
        $message['message'] = "Numbers are not allowed"; 
        return json_encode($message); 
       } 
        elseif(!isset($error)) { 
         $oldPass = hash_hmac('sha512',$oldPass,$this -> salt($cusrn,$oldPass)); 
         $newPass = hash_hmac('sha512',$newPass,$this -> salt($cusrn,$newPass)); 
         $sql = 'SELECT username,password FROM user WHERE username = ? AND password = ?'; 
         if($stmt = $this->conn->prepare($sql)) { 
          $stmt->bind_param('ss',$cusrn,$newPass); 
          $stmt->execute(); 
          $stmt->bind_result($usrn,$passw); 
          if($stmt->fetch()) { 
           if($cusrn == $usrn) { 
            if(!(strcmp($oldPass,$passw) == false)) { 
             $error = true; 
             $message['error'] = true; 
             $message['message'] = "The current Password is incorrect"; 
             return json_encode($message); 
            } 
             elseif (!(strcmp($oldPass,$newPass) == false)) { 
              $stmt->close(); 
              $sql = "UPDATE user SET password = ? WHERE username = '$usrn' LIMIT 1"; 
              if($stmt = $this->conn->prepare($sql)) { 
               $stmt->bind_param('s',$newPass); 
               $stmt->execute(); 
               $stmt->close(); 
               $error = false; 
               $message['error'] = false; 
               $message['message'] = "Password successfuly changed"; 
               return json_encode($message); 
              } 
               else { 
                $error = true; 
                $message['error'] = true; 
                $message['message'] = "Cannot connect to database for updating"; 
                return json_encode($message); 
               } 
             } 
              else { 
               $error = true; 
               $message['error'] = true; 
               $message['message'] = "New Password must not match the old one"; 
               return json_encode($message); 
              } 
           } 
            else { 
             $error = true; 
             $message['error'] = true; 
             $message['message'] = "The current Username is incorrect"; 
             return json_encode($message); 
            } 
           } 
            else { 
             $error = true; 
             $message['error'] = true; 
             $message['message'] = "Cannot fetch data from the database"; 
             return json_encode($message); 
            } 
          } 
           else { 
            $error = true; 
            $message['error'] = true; 
            $message['message'] = "Cannot prepare database connection"; 
            return json_encode($message); 
           } 
        } 
         else { 
          $error = true; 
          $message['error'] = true; 
          $message['message'] = "Check the PHP syntax | Something went wrong"; 
          return json_encode($message); 
         } 
} 

私が持っている問題は、私が入力しようとすると、特定のユーザ名が、それは私にこのスローのどちらかということである。

"Cannot fetch data from the database" 

またはそれを

"The current Username is incorrect" 

ユーザー名が正しい場合でもそれはテーブルに存在する最後の行で動作しますが、テーブルの最後の行に配置されているユーザ名で動作することを意味します。

私は間違ったことをしていると確信しています。私は何をしているのでしょうか?

+1

少なくともこれらすべてのネストされた 'if'年代を回避しようとします。 – CodeCaster

+0

どういう意味ですか? 'if'を削除してそのように動作しますか?そういうわけで、私は問題がどこにあるのか分からないでしょう... – Roland

+2

あなたのメインのif/elseif/elseは同じレベルに字下げする必要があります。ネストされたコントロールではありません。 。 !isset($ message ['error'])をチェックするだけで$ message ['error']を$ errorに複製するのはなぜですか?また、主なif/elseif/else制御ブロックの後に複数のreturn文を1つのreturn文にまとめて削除することもできます。 $ message ['error'] = trueを初期化することもできます。メインのifブロックの前に、それが起こったときにfalseに設定するだけです。これは、あなたのコードをより簡潔に/可読なものにするはずです。 – codercake

答えて

3

あなたのコードが読みにくいですが、私が見ることができるつのエラーは、あなたのユーザーを選択する場所です:

$sql = 'SELECT username,password FROM user WHERE username = ? AND password = ?'; 
        if($stmt = $this->conn->prepare($sql)) { 
         $stmt->bind_param('ss',$cusrn,$newPass); 

あなたがその意志ので、あなたはそれを変更する前に、ユーザーを選択するために、新しいパスワードを使用しています失敗すると、ユーザーが見つかりません。

ところで、管理者に異なるユーザーのパスワードを変更させたい場合は、管理者ユーザーをパスワード比較機能の一部から除外する必要があります。例えば

(あなたがセッションであなたのadminユーザーを設定仮定):

if(!(strcmp($oldPass,$passw) == false) || $_SESSION['admin_user']) { 
+0

私は 'bind_param()'を使わずに試してみましたが、同じ結果が得られます。だから何をすべきか? – Roland

+0

@Roland後であなたの古いパスワード比較をしているので、WHERE条件でパスワードを使用しないでください。ユーザーとパスワードを取得して比較に進むだけです。 – jeroen

+0

これは '$ sql = 'SELECT username、password FROM user'のようになりました。 \t \t \t \t \t \t \t場合)({ \t \t \t \t \t \t \t \t $ stmt->実行($ STMT =の$ this - > conn->($のSQL)を調製)。 \t \t \t \t \t \t \t \t $ stmt-> bind_result($ usrn、$ PASSW)。 \t \t \t \t \t \t \t \t 場合($ stmt->フェッチ()){ 'が、私はそのユーザ名がテーブルに存在するにもかかわらず、この'現在のユーザー名がincorrect'で取得します。これは最初の行でのみ動作し、ユーザー名はテーブルの最初の行に配置されます。 – Roland

関連する問題