[英]PHP Registration Script Not Working
我已經編寫了一個運行良好的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
仍將添加到數據庫中。
我認為發生這種情況是因為即使給定的if
語句的求值結果都不為true,也會觸發die()
語句。 有什么建議么?
要查看您是否遇到MySQL錯誤,請將此代碼放在INSERT
查詢之后。
printf("Errormessage: %s\n", $mysqli->error);
如果那行不通,我強烈建議您在die()
行中放入消息,因為這樣您就可以准確知道錯誤的出處。 像這樣做:
die('This error happened!');
如果每個die()
處都有唯一的消息,則可以告訴代碼的哪一部分導致其停止-如果有的話。
最后,輸入類似echo "FINISHED!";
在腳本的底部,因此您可以查看腳本是否一直被執行。
上面的錯誤查找方法的組合應該為您指出正確的方向,以找出問題所在。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.