我正在开发一个用于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;
}
目前,查询未运行且页面未按预期重定向。即如果我输入错误的密钥,页面就不会重定向。
答案 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开始,不推荐使用此扩展,不建议用于编写新代码,因为将来会删除它。相反,应使用mysqli或PDO_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;
}