【问题标题】:Redirect Issue for referral system when fetching URL data获取 URL 数据时推荐系统的重定向问题
【发布时间】:2014-07-30 00:33:51
【问题描述】:

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

然后受邀者会收到一封电子邮件,其中包含一个 URL 链接,其中包含他们的电子邮件和他们唯一的邀请代码; http://website.com/register.php?email=email&inviteCode=1234567890

当用户点击链接时,页面 register.php 应该检查 URL 以及他们的数据在“推荐”表中是否有效。如果是这样,那么我有一个包含行来添加注册表单,如果没有,那么它们将被重定向。关键是没有人可以访问 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)谢谢。

【问题讨论】:

  • 在每个重定向中,将它们更改为 die(random message); 以查看引发重定向的条件。
  • 我确实怀疑它的 if($mysql-&gt;num_rows)
  • @Darren 第二个 else 语句似乎在强制重定向;当我把它拿出来时,脚本不包含文件,我什至检查了 URL 字符串;因为如果我手动输入 /register.php 我可以访问该页面;我应该被重定向。
  • @Darren 我很抱歉,我在访问该页面时仍然只是得到一个空白页面。没想到会有这么多bug,只要url和表数据匹配就一个简单的if和else语句

标签: php mysql redirect mysqli


【解决方案1】:

您应该首先考虑处理错误。试试这样的:

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-&gt;num_rows 的存在。

另一个注意事项:

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

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

您也可以更改您的 sql 查询以选择 COUNT(id) 并检查它是否大于 0,但这对于您尝试做的事情来说似乎有点过头了。

【讨论】:

  • 感谢您的回复 (Y) 我已经编辑了我的帖子,我已经测试了您的脚本 - 我收到一个空白页(必须缺少括号或分号)会回来。
  • @JSK 是的,请告诉我结果如何!
  • 我不确定我是盲人还是有其他问题,但是我添加了 if(!isset($_GET['email']) || !isset($_GET ['inviteCode'])) { die(header('Location: index.php')); } else & 我已经有错误报告了。我没有收到任何错误,页面只是空白,我不确定这是因为应用程序被杀死并且没有重定向或更小的错误。
  • 我还要检查 URL 字符串吗?我可能对应该是一个简单的脚本感到困惑
【解决方案2】:

执行此操作以确定您的查询是否返回任何内容:

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

$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."'";

【讨论】:

  • 对不起,我还在学习,我想知道我到底应该在哪里使用该脚本,它是在页面顶部还是在我的末尾?我已经连接了我的陈述以防万一
  • 没关系,我们都去过那里。我会更新我的答案。
  • 感谢您的帮助,我真的很感激。我收到了两个错误,未定义的变量和试图获取非对象的属性。这必须是为了使用 'num_rows' - 因此我假设我没有返回任何内容,这就是我的脚本落入最后一个 else 语句的原因。
  • 我已经编辑了我的脚本,似乎仍然没有任何变化,也没有出现错误。我只是得到最后一个回声,“问题”。用 URL 检查表格一定有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2012-05-28
  • 2013-02-28
  • 2013-08-16
  • 2022-11-25
  • 2014-06-10
  • 1970-01-01
相关资源
最近更新 更多