0

我正在编写 PHP 以激活用户帐户......代码经过过滤、消毒、密码加密,并且我使用 PDO 来存储数据......一旦数据,我有一个标题重定向存储,以引导用户单击其注册电子邮件地址上的激活链接。

一切正常,我使用 PDO RowCount() 来告诉重定向继续运行,但我在 MySql 数据库中添加了一个哈希列来帮助激活链接,然后查询以实际激活帐户,所以RowCount 已被填充,重定向将绕过表单本身运行。所以我编写了一些代码来启用重定向工作,它确实如此,但是它仍然绕过表单本身......我需要这段代码来运行标题重定向,说数据库已经被填充表单,但我需要它停止绕过表单本身并继续进行重定向。

下面的代码......更多代码可根据要求提供......

   try{
   $checkEmail = $db->prepare('SELECT email FROM users WHERE email = :email');
   $checkEmail->bindParam(':email', $clean['email']);
   $checkEmail->execute();
   $result = $checkEmail->fetch();
   print_r($result);
    } catch(PDOException $e) {
   $e->getMessage();
    }
   if ($result[0] === $clean['email']){

           header('Location:verifyemail.php');



     }

$clean['email'] 是编程逻辑中的当前电子邮件地址。但似乎 PHP 已经对此具有一定的价值,因此该表单被绕过了。

4

1 回答 1

0

我可能完全误解了这个代码片段的意图,但是如果页面第一次加载时$clean['email']NULL(因为没有处理任何表单输入),我认为这个if条件总是正确的:

  1. PDO 替换使用占位符替换 NULL 运行,因此相当于SELECT email FROM users WHERE email = NULL
  2. 没有匹配的行(保证,因为NULL = NULL在 SQL 中 even 为 false)
  3. $result[0]未定义,因为 SQL 查询未返回任何行
  4. 因此,$result[0]两者$clean['email']都评估为 PHP NULL,因此相同
  5. 重定向火灾

[更新,来自评论]我认为这种方法适用于 NULL 输入以外的所有内容;您只需要检测$clean['email']根本没有提供的情况。也许if ( ! empty($clean['email']) && $result[0] === $clean['email'] ) { ... }

于 2013-02-10T20:19:07.107 回答