我只是想知道我们是否需要具有!isset函数来激活电子邮件,因为我们实际上不是在填写表单来检查用户是否已提交表单,而是要链接。我在某处读到电子邮件激活可能失败,并且还应该允许用户手动激活其帐户,但是以下代码应该可以工作,但有时我会收到丢失的链接错误。但是,所有变量都显示在我的网址中:
<?php
include_once __DIR__.'/header2.php';
if($_SESSION['u_uid']) {
echo "<meta http-equiv='refresh' content='0;url=../index.php?activatelevel2promo=mustloggedoutfirst'>";
exit();
} else {
if (!isset($_GET['email']) || !isset($_GET['activatetoken']) || !isset($_GET['duration'])) {
echo "<meta http-equiv='refresh' content='0;url=../index.php?activatelevel2promo=missinglink'>";
exit();
} else {
include_once __DIR__.'/dbh.php';
// retrieve the email and token from url
$activate = 0;
$email = strip_tags($_GET['email']);
$token = strip_tags($_GET['activatetoken']);
$duration = strip_tags($_GET['duration']);
$sql = "SELECT * FROM memberships WHERE user_email = ? AND token2 = ? AND activate2 = ?;";
$stmt = mysqli_stmt_init($conn);
//Prepare the prepared stement
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL statement failed";
} else {
//Bind parameters to the placeholder
mysqli_stmt_bind_param($stmt, "ssi", $email, $token, $activate);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
$subscriptionplandate = date("Y-m-d H:i:s");
$level2promo_activate = 1;
if($duration == '1week') {
$expirydate = date('Y-m-d H:i:s', strtotime("+1 week"));
}
if($duration == '2weeks') {
$expirydate = date('Y-m-d H:i:s', strtotime("+2 week"));
}
if($duration == '3weeks') {
$expirydate = date('Y-m-d H:i:s', strtotime("+3 week"));
}
if($duration == '4weeks') {
$expirydate = date('Y-m-d H:i:s', strtotime("+1 month"));
}
$token = null;
$sql2 = "UPDATE memberships
SET subscriptionplandate2 = ?, expirydate2 = ?, token2 = ?, level2promo_activate = ?
WHERE user_email = ?;
";
$stmt = mysqli_stmt_init($conn);
//Prepare the prepared stement
if (!mysqli_stmt_prepare($stmt, $sql2)) {
echo "SQL statement failed";
} else {
//Bind parameters to the placeholder
mysqli_stmt_bind_param($stmt, "sssis", $subscriptionplandate, $expirydate, $token, $level2promo_activate, $email);
mysqli_stmt_execute($stmt);
echo "<meta http-equiv='refresh' content='0;url=../index.php?activatelevel2promo=success'>";
exit();
}
}
}
}
}
This is what is been shown in the url:
https://www.pianocourse101.com/includes/activatelevel2promo.php?email=pianoforte0011@gmail.com&activatetoken=%5E#%rG%5EGTq@&duration=2weeks
答案 0 :(得分:0)
因为我们并不是真正要填写表格来检查用户是否已提交表格,而是要链接?
没关系。就像我无法填写或删除名为foo
的表单字段一样,我也可以在调用它之前从任何URL中删除参数?bar=...
-结果将相同,脚本的参数为期待,分别。 需要以能够正确执行其任务,这还不存在。因此,是的,在两种情况下检查是否都获得了所需的所有数据。
,但是以下代码应该可以工作,但是有时我确实会收到缺少的链接错误。但是,所有变量都显示在我的网址中
是的,嗯...
…?email=pianoforte0011@gmail.com&activatetoken=%5E#%rG%5EGTq@&duration=2weeks
您在这里拥有的是一个名为email
和值pianoforte0011@gmail.com
的参数,以及一个名为activatetoken
的值%5E
或{{1 }},然后进行URL解码……就这样。
该URL的其余部分只是片段标识符或“哈希”-甚至根本没有发送到服务器。
您忽略了在此处正确地对参数值进行URL编码。 ^
在这里不应该有其特殊的含义,因此需要对其进行编码(#
)
您应该将%23
分别应用于所有参数值;或先将所有参数和值收集到一个数组中,然后使用urlencode
-这将为您完成创建整个查询字符串的全部工作,并在此过程中自动处理必要的编码。 / p>
http://php.net/manual/en/function.urlencode.php
http://php.net/manual/en/function.http-build-query.php