PHP:获取URL引用密钥

时间:2014-04-29 03:58:30

标签: php sql database

我正在开发一个用于PHP用户注册的电子邮件链接链接。

我们的想法是,当您注册时,会生成随机字符串作为网址引荐并发送到您的收件箱。然后,当您点击电子邮件中的链接时,您会收到一个确认您帐户的页面。

但是,我一直遇到从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;
}

目前,查询未运行且页面未按预期重定向。即如果我输入错误的密钥,页面就不会重定向。

3 个答案:

答案 0 :(得分: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时,另请参阅MySQL API Overview以获得进一步的帮助。

这些功能允许您访问MySQL数据库服务器。有关MySQL的更多信息,请访问»http://www.mysql.com/

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

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}