我正在为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开始,该扩展已被弃用,不建议用于编写新代码,因为它将来会被删除。相反,应该使用mysqli或PDO_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;
}