2013-05-11 71 views
1

我剛剛開始使用PHP進行編碼,並且被重定向卡住了。我接受了提交表單中的$ _POST信息並將它們分配給變量。我收到2個密碼變量:$ password和$ c_password。我的目標是檢查這兩個密碼是否匹配,如果他們想要散列它們。如果沒有,我想發回用戶(重定向)到register.php頁面。問題是如果我阻止了JavaScript重定向下的所有內容,它就會起作用。但是如果我在js重定向之後不阻止腳本,用戶就會在數據庫中註冊並重定向到login.php頁面。下面是我到目前爲止編碼:重定向腳本,用表格哈希處理後的PHP

<?php 

// Open database connection 
include 'db_connect.php'; 

// check existence and accept form data 
if(isset($_POST['username']) && isset($_POST['email']) && isset($_POST['password']) && isset($_POST['c_password'])) { 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 
$c_password = $_POST['c_password']; 
} 

// Hash the password if password and c_password match 
if(strcmp($password, $c_password) == 0) { 
$password = hash('sha512',$_POST['password']); 
} 
else { ?> 
    <script type="text/javascript"> 
     document.location = './register.php?pass_nomatch=1'; 
    </script> 
<?php 
} 

// Create a random salt 
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); 

// Create salted password (Careful not to over season) 
$password = hash('sha512', $password.$random_salt); 

// Add your insert to database script here. 
// Make sure you use prepared statements! 
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {  
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt); 
// Execute the prepared query. 
$insert_stmt->execute(); 
// Close MYSQL database connection 
mysqli_close($mysqli); 
// Redirect user to login page 
header('Location: ./login.php'); 
} 

?> 

如果任何人有回答我的問題請儘快回覆:)

+0

重定向是什麼意思?你的意思是,重定向用戶到另一個頁面? – samayo 2013-05-11 14:00:16

+0

我不完全確定你的問題是什麼,但我會建議使用標題重定向(標題(「位置:網址/」);)像你最後做的而不是JavaScript,就像你在中間做的一樣。 – Matt 2013-05-11 14:02:13

+0

@Matt我嘗試過頭('register.php?pass_nomatch = 1');但是如果在header()之後有任何代碼,則它不起作用。 – Dribba 2013-05-11 14:05:46

回答

0

重定向在PHP頁面中,您可以使用內置在功能header();

例如:header('Location: http://www.yoursite.com/page.php')

記住,你說,絕對路徑,作爲參數傳遞給頭是很重要的。這是爲什麼從Wikipedia: HTTP_location

互聯網標準要求絕對URI遵循位置 頭,這意味着它必須包含一個方案[4](例如,HTTP:,HTTPS :, 的telnet :,的mailto:)[5]和符合方案特定的語法和語義。例如,對於HTTP URL,HTTP方案特定的語法和語義 需要「主機」(web服務器地址)和「絕對路徑」,並帶有「端口」和「查詢」的可選組件。在沒有絕對路徑的 的情況下,當 用作資源的請求URI時,它必須以「/」給出。

現在,匹配的密碼應儘可能容易,因爲:

if($passwordA === $passwordB) { 
    // === is called, identity comparison operator. 
    // http://www.php.net/manual/en/language.operators.comparison.php 

else{ 
    header('Location: http://site.com/register.php?pass_nomatch=1'); 
    die("If you are not redirected in 5 seconds, click <a href='#'>here<a/> "); 
    } 
+0

如果密碼匹配失敗,我想將用戶重定向到register.php頁面。那可能嗎 ? – Dribba 2013-05-11 14:01:21

+0

更新了它。檢查它現在 – samayo 2013-05-11 14:08:17

+0

PHP NoOb,感謝您的解決方案..作品像一個魅力:D ..有什麼區別如果($密碼== $ c_password)和如果($密碼=== $ c_password)? – Dribba 2013-05-11 14:15:39

1

只需使用:

header('Location: http://www.yoursite.com/page.php'); 

,然後停止腳本:

die(); 

這將保證腳本停止。

+0

正確。在PHP中調用'header'什麼都不做,只能把另一個HTTP響應頭在「堆」上發送 - 但它不會影響進一步的腳本執行。如果在輸出(重定向)頭後輸出一個腳本,並且不再執行下面的代碼,則必須使用'die()'或'exit'明確地執行。 – CBroe 2013-05-11 14:36:08