为什么我会丢失链接或未设置错误

时间:2019-01-31 04:44:51

标签: php

我只是想知道我们是否需要具有!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

1 个答案:

答案 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