获取URL数据时重定向引用系统的问题

时间:2014-07-30 00:33:52

标签: php mysql redirect mysqli

我创建了一个脚本供用户使用电子邮件地址邀请朋友,电子邮件地址和随机生成的10个字符串'inviteCode'被发送到名为'referrals'的表。

受邀人员会收到一封电子邮件,其中包含一个包含其电子邮件及其唯一的inviteCode的URL链接; http://website.com/register.php?email=email&inviteCode=1234567890

当用户点击链接时,页面register.php应该检查URL以及它们的数据在'referrals'表中是否有效。如果是,那么我有一个包含行来添加注册表单,如果没有,那么它们被重定向。重点是没有人可以访问register.php,除非他们被邀请并发送了链接。

此时页面会一直重定向到index.php;

Register.php脚本:

<?php 

  include 'config.php';

if (isset($_GET['email'],$_GET['inviteCode'])) {

$mysqli     = new Mysqli(/* your connection */);
$email      = $mysqli->real_escape_string($_GET['email']);
$inviteCode = $mysqli->real_escape_string($_GET['inviteCode']);
$sql                = "SELECT email,inviteCode FROM referrals WHERE email='".$email."' AND inviteCode='".$inviteCode."'";
$query      = $mysqli->query($sql);

if ($query->num_rows > 0) {  //check if values are correct and available in database
    echo 'lol';
}
else
     {
    echo  'no';
          exit;
     }
}
else
    {
 echo 'problem'; //Page not accessible if neither email nor referral entered
    }

?>

我将第一个if语句替换为:

if(!isset($_GET['email']) || !isset($_GET['inviteCode'])) {
    die(header('Location: index.php'));
} else 

我收到一个没有错误的空白页面。我相信电子邮件可能有问题,邀请代码没有设置。

对此有任何帮助将非常感谢(Y)谢谢。

2 个答案:

答案 0 :(得分:0)

你应该首先考虑处理错误。尝试这样的事情:

if(!isset($_GET['email']) || !isset($_GET['inviteCode'])) {
    die(header('Location: index.php'));
} else {
    $mysqli = new Mysqli(/* your connection */);
    $email = $mysqli->real_escape_string($_GET['email']);
    $inviteCode = $mysqli->real_escape_string($_GET['inviteCode']);
    $sql = "SELECT email,inviteCode FROM referrals WHERE email='$email' AND inviteCode='$inviteCode'";
    $query = $mysqli->query($sql);

    if ($query->num_rows > 0) { //check if values are correct and available in database
        include'register-form.php';
    } else {
        die(header('Location: index.php'));

    }
}

<强>击穿

if块会检查GET[email]GET[inviteCode]是否 设置。如果是这种情况,请使用die()终止该应用并将用户重定向至index.php

第二个变化是这一行:

if ($query->num_rows > 0) {

这将检查以确保返回的行超过 0 (意味着实际上返回了行。)因为您之前只测试了$query->num_rows的存在

另一个注意事项:

打开错误报告,它会在调试过程中帮助您:

ini_set('display_errors', 1);
error_reporting(E_ALL);

你也可以改变你的sql查询来选择COUNT(id)并检查它是否大于0,但这对你正在尝试做的事情来说似乎有些过分。

答案 1 :(得分:0)

执行此操作以查明查询是否返回任何内容:

首先确保与数据库的连接成功:

$mysqli       = new Mysqli(/* your connection */);
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}
$email        = $mysqli->real_escape_string($_GET['email']); 

添加,然后告诉我们之后的结果,还提供特定的错误消息。

要调试num_rows,请将其替换为:

$query        = $mysqli->query($sql);

  if ($query->num_rows) //check if values are correct and available in database
    {
     include'register-form.php';
    }

有了这个:

$query        = $mysqli->query($sql);

$count = $query->num_rows;
print $count;
exit;

  if ($query->num_rows) //check if values are correct and available in database
    {
     include'register-form.php';
    }

如果显示0,我怀疑这是因为你的sql语句需要连接。

"SELECT email,inviteCode FROM referrals WHERE email='".$email."' AND inviteCode='".$inviteCode."'";