ログインシステムの開発中に問題が発生しました。私は、複数のユーザーのログインを処理するクラスを作成します。また、管理者用の管理領域も作成しました。彼は新しいユーザーを追加したり、パスワードを変更したり、ユーザーを削除したりすることができます。ユーザーパスワードを変更する
今のところ私は新しいユーザーを追加してパスワードの部分を変更することができました。私が今問題にしているのは、パスワードの変更部分です。
私はこのような構造を持つテーブルを持っている:
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"
ユーザー名が正しい場合でもそれはテーブルに存在する最後の行で動作しますが、テーブルの最後の行に配置されているユーザ名で動作することを意味します。
私は間違ったことをしていると確信しています。私は何をしているのでしょうか?
少なくともこれらすべてのネストされた 'if'年代を回避しようとします。 – CodeCaster
どういう意味ですか? 'if'を削除してそのように動作しますか?そういうわけで、私は問題がどこにあるのか分からないでしょう... – Roland
あなたのメインのif/elseif/elseは同じレベルに字下げする必要があります。ネストされたコントロールではありません。 。 !isset($ message ['error'])をチェックするだけで$ message ['error']を$ errorに複製するのはなぜですか?また、主なif/elseif/else制御ブロックの後に複数のreturn文を1つのreturn文にまとめて削除することもできます。 $ message ['error'] = trueを初期化することもできます。メインのifブロックの前に、それが起こったときにfalseに設定するだけです。これは、あなたのコードをより簡潔に/可読なものにするはずです。 – codercake