PHP:获取URL引用密钥


PHP: Getting URL Referral Key

我正在为PHP用户注册创建一个电子邮件参考链接。

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

然而,我在从URL获取推荐密钥并将其与DB匹配时遇到了问题。

到目前为止,这就是我所拥有的:

// 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;
}

目前,查询没有运行,页面也没有像我预期的那样重定向。即,如果我输入了错误的键,页面不会重定向。

这里有两个工作示例,可以帮助您继续学习。

使用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时的进一步帮助。

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

MySQL文档可在»http://dev.mysql.com/doc/.

重定向页面时添加出口

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;
}

首先,不要使用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;
}