2010-11-27 138 views
5

我爲我的網站寫了一個登錄系統。當用戶註冊時,系統會通過電子郵件向用戶提供的電子郵件地址發送激活鏈接。該鏈接包含兩個參數,電子郵件和密鑰。電子郵件參數包含用戶的電子郵件地址,關鍵參數包含註冊碼,以便可以驗證註冊並將其從待定更改爲確認。激活頁面應該從電子郵件列中設置了email參數的行中獲取狀態列。出於某種原因,腳本決定任何鏈接都是有效的,並嘗試更新帳戶的狀態,無論它是否存在。PHP帳戶激活問題

這裏是我的代碼:

<?php 

$email = $_GET['email']; 
if($email == "") { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
    exit; 
} 
$key = $_GET['key']; 
if($key == "") { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
    exit; 
} 

$con = mysql_connect("HOST", "USER", "PASS") or die(mysql_error()); 
mysql_select_db("zach_yardad", $con) or die(mysql_error()); 
$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 
$result1 = mysql_query($query1) or die(mysql_error()); 
if(mysql_num_rows($result1) <= 0) { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} else { 
    $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'"; 
    mysql_query($query) or die(mysql_error()); 
    header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
    exit; 
} 

?> 

這裏是一個有效的激活鏈接:

http://www.zbrowntechnology.info/yard/[email protected]&key=2772190956485245 

將通過以下鏈接激活帳戶,但它會重定向到登錄頁面激活後,如果鏈接無效。


編輯:

下面是該查詢DESCRIBE `Accounts`結果:

First Name varchar(65) NO  NULL  
Last Name varchar(65) NO  NULL  
Email varchar(100) NO  NULL  
Username varchar(65) NO  NULL  
Password varchar(65) NO  NULL  
Status varchar(65) NO  NULL  

回答

4

你可以嘗試改變你的代碼如下:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"); 
if(mysql_num_rows($query1) <= 0) { 

這應該工作..

如果不行,試試這個:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'", $con); 
    if(mysql_num_rows($query1) <= 0) { 

====完整代碼====

<?php 
if($_GET['email'] == "") { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 

if($_GET['key'] == "") { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 

$email = mysql_real_escape_string($_GET['email']); 
$key = mysql_real_escape_string($_GET['key']); 

$con = mysql_connect('HOST', 'USER', 'PASS'); 
mysql_select_db('zach_yardad', $con) or die(mysql_error()); 

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email` = '" . $email . "' AND `Status` = '" . $key ."'", $con); 
if(mysql_num_rows($query1) <= 0) { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit(); 
} else { 
mysql_query("UPDATE `Accounts` SET `Status`='Confirmed' WHERE `Email`='$email'", $con); 
header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
exit(); 
} 
?> 
0

第一件事我注意到的是,在你的MySQL查詢您所使用的狀態列一個where字段。

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 

從你寫的代碼看起來它應該是這樣:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'"; 

要調試的代碼,你怎麼樣註釋掉headerexit命令,然後定義$剛過query1,做一個

print $query1; 

重新嘗試頁面,這將幫助你看到你傳遞給MySQL。

UPDATE:

讀你最近的投入,我認爲這可能爲你工作:

if(mysql_num_rows($result1) > 0) { 
    $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'"; 
    mysql_query($query) or die(mysql_error()); 
    header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
    exit; 

} else { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 
+0

該colomn名稱是狀態。它包含註冊碼,並在激活後包含字符串「已確認」。所以,我應該檢查是否Status列= $鍵,不是嗎? – 2010-11-27 01:40:54

+0

如果您對此感到滿意,那也可以。繼續並嘗試打印$ query1 ;.另外如何嘗試,打印mysql_num_rows($ result1);.這些將幫助您瞭解發生了什麼問題。 – Haluk 2010-11-27 01:48:07

+0

正確的查詢是通過打印$ QUERY1返回:_SELECT`Status`從戶口所在`Email`='[email protected] '和'Status` =' 2772190956485245'_ – 2010-11-27 01:54:25

4

我注意到,您選擇的狀態,進行檢查,看其是否確認或不..

您的狀態字段是確認/未確認存儲正確的地方嗎?

你不應該檢查密鑰嗎?

換句話說,而不是:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 

用途:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'"; 

與您存儲在鍵字段的名稱更換Key ..因爲這是你正在用你的$ _GET請求,電子郵件和密鑰......而不是電子郵件和狀態進行檢查。