0

正常に動作する 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助言がありますか?

4

1 に答える 1

0

INSERTMySQL エラーが発生しているかどうかを確認するには、クエリの後に次のコードを追加してください。

printf("Errormessage: %s\n", $mysqli->error);

それでも問題が解決しない場合は、行内にメッセージを入れることを強くdie()お勧めします。そうすれば、エラーが発生している場所が正確にわかるからです。次のようにします。

die('This error happened!');

それぞれに固有のメッセージがある場合die()は、コードのどの部分が停止の原因になっているのか (もしあれば) を知ることができます。

最後に、スクリプトの最後に次のようなものを追加echo "FINISHED!";して、スクリプトが最後まで実行されるかどうかを確認します。

上記のエラー検出方法を組み合わせることで、問題の原因を突き止めるための正しい方向が示されるはずです。

幸運を!

于 2012-08-05T22:24:31.567 に答える