簡體   English   中英

PHP注冊腳本不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM