正常に動作する PHP 登録/ログイン システムを作成しました。ただし、サーバー側のエラーチェックを追加して、ユーザーがパスワードを入力せずにサインアップできないようにしたり、パスワードフィールドが一致することを確認したりしました。コードは次のとおりです。
<?php
session_start();
// retrieve data via POST
$username = $_POST['username'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
$userLoc = $_POST['userLoc']; // user location is a field on the submitted form
include("config.php");
$username = mysqli_real_escape_string($conn, $username); // clean username input
// ensure that the two password fields match
if ($pass1 != $pass2) {
header('Location: ../');
die();
}
// ensure that the user didn't bypass maxlength for username
if(strlen($username) > 30) {
header('Location: ../');
die();
}
// ensure that the user actually entered a password
if( strlen($pass1<3) || strlen($pass2<3) ) {
header('Location: ../');
die();
}
// check if username already taken
// I'm using a session variable that causes a div to be displayed on index.php to indicate username taken
// (I also have AJAX username check already implemented)
$query = "SELECT 1 FROM users WHERE username='$username'";
$result = mysqli_query($conn,$query);
if ( $result && mysqli_num_rows($result) > 0 ) {
$_SESSION['usernameTaken'] = 1;
header('Location: ../');
}
// create hash for password
$hash = hash('sha256', $pass1);
// create salt for password
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = hash('sha256', $salt . $hash);
$userLoc = mysqli_real_escape_string($conn, $userLoc);
$query = "INSERT INTO users ( username, password, salt, userLoc ) VALUES ( '$username' , '$hash' , '$salt' , '$userLoc' );";
mysqli_query($conn,$query);
mysqli_close();
header('Location: ../');
?>
ここに私が理解できない問題があります:die();
そこにステートメントがあると、条件のいずれかが満たされた場合(パスワードが一致しない、ユーザー名が既に存在するなど)、スクリプトは実際に終了し、適切にリダイレクトされますindex.php ( ../
) に追加され、ユーザー名はデータベースに追加されません。ただし、エラー チェック ロジックがまったくトリガーされない場合 (つまり、ユーザー名が使用可能である、パスワードが一致するなど)、ユーザー名はデータベースに追加されません。データベースに追加するものを取得できる唯一の方法は、すべてのdie()
ステートメントを削除することですが、これにより、エラーチェックが機能しなくなります (たとえば、一致しないパスワードを入力しても、ユーザー名は引き続きハッシュ化された とともにデータベースに追加されますpass1
)。
特定のステートメントが true と評価されなくdie()
ても、ステートメントがトリガーされているため、これが発生していると思います。if
助言がありますか?