1
私はユーザーのログインを確認する以下の機能を持っています。現在の状態では、ユーザー名または電子メールとパスワード(ハッシュ)のいずれかをチェックし、結果がdb内の値と一致する場合、値を返します(他の変数や関数を抽象化してください。 )それらを参照してください、私がやろうとしていることは証明書がデシベルと一致で発見された場合の値を返す前にある、今データベースから選択した値が1の場合、ユーザーをブロックする方法はありますか?
// Start Checking The Login Credentials
public function checkUserLogin($username, $password) {
$password = hash_hmac('sha512', $password, $this->salt($password));
if(preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $username)){
$identifier = 'user_email';
} else {
$identifier = 'user_username';
}
$sql = 'SELECT user_username,user_level FROM users WHERE '.$identifier.' = ? AND user_password = ?';
// Check Login Attempts
if (isset($_SESSION['attempts']) && $_SESSION['attempts'] >= NUMBER_OF_ATTEMPTS) {
$lockdown = true;
$message['lockdown'] = true;
$message['message'] = SYSTEM_LOCKDOWN_MESSAGE;
return json_encode($message);
} else {
if ($stmt = $this->connect->prepare($sql)) {
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$stmt->bind_result($username, $level);
if ($stmt->fetch()) {
$stmt->close();
$_SESSION['member_logged_in'] = true;
$_SESSION['username'] = $username;
$_SESSION['level'] = $level;
$_SESSION['attempts'] = 0;
$ip = $this->getIP();
$sql = "UPDATE users SET user_last_login_date = NOW(), user_last_login_ip = '$ip' WHERE user_username = '$username'";
if ($stmt = $this->connect->prepare($sql)) {
$stmt->execute();
$stmt->close();
} else {
$error = true;
$message['error'] = true;
$message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE;
return json_encode($message);
}
$message['level'] = $level;
if($level = 0) {
$_SESSION['standard'] = true;
} elseif($level = 1) {
$_SESSION['special'] = true;
} elseif($level = 2) {
$_SESSION['admin'] = true;
}
$error = false;
$message['error'] = false;
$message['message'] = SUCCESFUL_LOGIN_MESSAGE;
return json_encode($message);
} else {
@$_SESSION['attempts'] = $_SESSION['attempts'] + 1;
$error = true;
$message['error'] = true;
$message['message'] = FAILED_LOGIN_MESSAGE;
return json_encode($message);
}
}
}
}
デシベルで別の値をチェックするには、いずれかの0
とすることができるuser_disabled
と呼ばれますまたは1
があり、1
の値が見つかった場合はのような別のメッセージが返され、0
が見つかった場合は、前回と同じように残りのコードを実行します(ログインに成功しました)。
私は私が必要なものを約ありませんが、私はこのパブリック関数の内部配置しようとしたとき、それは動作しません。次のコードを持っている:私は理解することはできませんので
$sql = "SELECT user_disabled FROM users WHERE user_username = '$username'";
if ($stmt = $this->connect->prepare($sql)) {
$stmt->execute();
$stmt->bind_result($disabled);
$stmt->fetch();
$stmt->close();
if($disabled = 0){
/* Here is what should happen if the user is not blocked | The code after "$stmt->fetch()" */
} else {
@$_SESSION['attempts'] = $_SESSION['attempts'] + 1;
$error = true;
$message['error'] = true;
$message['message'] = 'ceva';
return json_encode($message);
}
} else {
$error = true;
$message['error'] = true;
$message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE;
return json_encode($message);
}
誰かがこれで私を助けることができるのそれをどうやって行うのか?
'もし($無効== 0)'を読んでください!余分な等号が必要な場合があります –
それだけでもいいですか? – Roland
この例では非常に多くのことが起こっているので、あなたの問題が何であるかは言うまでもありません。おそらく、問題を表示する短い自己完結型の例を作成することができれば、それは診断しやすくなります。 –