2014-04-29 54 views
-3

我正在使用PHP進行用戶註冊的郵件回覆鏈接。PHP:獲取URL引用密鑰

這個想法是,當你註冊時,一個隨機字符串被生成爲一個URL引用併發送到您的收件箱。然後,當您點擊電子郵件中的鏈接時,您會發送到確認您的帳戶的頁面。

但是我一直在遇到問題,從URL獲取引用鍵並將其與數據庫匹配。

到目前爲止,這是我:

// example URL - http://example.come?ref=5493tgfd83 

$passkey = $_GET['ref']; 
$success = true; 


$checkKey = "SELECT * FROM $tbl_name WHERE confirmCode ='$passkey'"; 
$confirmKey = mysql_query($checkKey); 

if($confirmKey){ 
    $countKey = mysql_num_rows($confirmKey); 
} 

// key doesn't match redirect to 404 
if($countKey != 1){ 
     header("Location: 404.php"); 
     $success = false; 
} 

目前,查詢不運行和頁面沒有進行重定向如我所料。即如果我輸入錯誤的鍵,頁面不會重定向。

+1

[爲什麼不應該在PHP中使用mysql_ *函數?](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php) – Phil

+0

是這個確切的代碼?因爲'$ tbl_name'沒有定義。 – user1978142

+0

它是應用程序的一部分,我們應該爲您考慮? –

回答

0

添加一個退出,當你重定向頁面

if($countKey != 1){ 
     header("Location: 404.php"); 
     exit; 
} 

,此外,它能夠更好地增加一個HTTP狀態告訴瀏覽器的行爲,你的代碼,並做SEO更友好

if($countKey != 1){ 
     header("HTTP/1.1 404 Not Found"); 
     header("Location: 404.php"); 
     exit; 
} 
0

首先,請勿使用reasons的MySQL擴展名。

其次,您沒有進行任何錯誤檢查或確保設置了值。

這裏有一個可愛的小PDO例子,讓你在正確的道路上......

$pdo = new PDO('mysql:host=localhost;dbname=xxxxxx;charset=utf8', 'username', 'password', [ 
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_EMULATE_PREPARES => false 
]); 

$ref = isset($_GET['ref']) ? $_GET['ref'] : null; 
$stmt = $pdo->prepare(sprintf('SELECT 1 FROM `%s` WHERE confirmCode = ?', $tbl_name)); 
$stmt->execute([$ref]); 
if (!$stmt->fetchColumn()) { 
    http_response_code(404); 
    header('Location: 404.php'); 
    exit; 
} 
+0

我正在使用PDO – user3143218

+0

@ user3143218您也可以使用* mysqli *,但除非您需要使用某些特定於MySQL的本機函數,否則我發現PDO API更易於使用。此外,它會拋出比檢查所有'mysqli_ *'函數返回值更容易管理的異常。 – Phil

1

這裏有兩個工作例子,這將讓你去。

您將使用num_rows

使用mysqli_ *函數與預處理語句得到更好的結果:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

$DB_HOST = "xxx"; 
$DB_NAME = "xxx"; 
$DB_PASS = "xxx"; 
$DB_USER = "xxx"; 

$db = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($db->connect_errno > 0) { 
    die('Connection failed [' . $db->connect_error . ']'); 
} 

// $passkey = $_GET['ref']; 
$passkey = mysqli_real_escape_string($db,$_GET['ref']); 

$tbl_name = "yourtable"; 

// $query = "SELECT * FROM $tbl_name WHERE confirmCode=?"; 
$query = "SELECT confirmCode FROM $tbl_name WHERE confirmCode=?"; 

if ($stmt = $db->prepare($query)){ 

     $stmt->bind_param("s", $passkey); 

     if($stmt->execute()){ 

      $stmt->store_result(); 

      if ($stmt->num_rows == 1){ 

      echo "Code verified."; 
      exit; 

      } 

else{ 
echo "Sorry."; 
// uncomment below and delete the above echo 
// header("HTTP/1.1 404 Not Found"); 
// header("Location: 404.php"); 
// exit; 
} 
     } 
    } 

使用mysql_ *功能:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

$connect = mysql_connect("xxx","xxx","xxx") or die("Error Connecting To MYSQL Server"); 
mysql_select_db("xxx") or die("Error connecting to database"); 

// $passkey = $_GET['ref']; 
$passkey = mysql_real_escape_string($_GET['ref']); 

$tbl_name = "yourtable"; 

$checkKey = "SELECT * FROM $tbl_name WHERE confirmCode ='$passkey'"; 
$confirmKey = mysql_query($checkKey); 

if (mysql_num_rows($confirmKey)) { 
echo "Code verified."; 
} 

else{ 
echo "Sorry."; 
// uncomment below and delete the above echo 
// header("HTTP/1.1 404 Not Found"); 
// header("Location: 404.php"); 
// exit; 
} 

腳註:

mysql_*功能已取消通知:

http://www.php.net/manual/en/intro.mysql.php

這個擴展不贊成PHP 5.5.0,並且不建議用於編寫新的代碼,因爲它會將來刪除。相反,應使用mysqliPDO_MySQL擴展名。請參閱MySQL API Overview以獲取進一步幫助,同時選擇MySQL API。

這些函數允許您訪問MySQL數據庫服務器。有關MySQL的更多信息,請參見»http://www.mysql.com/

有關MySQL的文檔可以在»http://dev.mysql.com/doc/找到。