【问题标题】:MySQLi / PHP: Not redirecting to error page?MySQLi / PHP:不重定向到错误页面?
【发布时间】:2013-07-07 04:23:14
【问题描述】:

所以我在这里要做的是让我的用户登录。 这是我用来执行此操作的脚本。

我刚刚使用在这里找到的转换器:https://wikis.oracle.com/display/mysql/Converting+to+MySQLi 将我的 Mysql 转换为 mysqli,因为我是初学者并且不知道如何去做。

现在,当用户输入正确的密码和用户名时。 它完全符合我的要求,用户被重定向到“dashboard.php” 但是,当用户输入不正确的数据时,用户最终会看到黑色的“login.php”(这是我在这里展示的代码),而不是我想要的“loginerror.php”。

我希望这里的一些人可以帮助我,因为我很迷茫。

PS:是的,我知道密码现在是纯文本的,但不用担心,因为我稍后会修复它。

<?php

  session_start(); 

  if(!$_SERVER['REQUEST_METHOD'] == 'POST') { 
      echo "Please leave.<br /><br />"; 
      echo "<a href='index'>Click to go back</a>"; 
      exit();     
  } 


  if(($GLOBALS["___mysqli_ston"] = mysqli_connect('localhost',  'root',  ''))) { 
      if(((bool)mysqli_query($GLOBALS["___mysqli_ston"], "USE users"))) {  
          $username = $_POST['username']; 
          $password = $_POST['password']; 

          $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
          $zoekresultaat = mysqli_query($GLOBALS["___mysqli_ston"], $query); 

          if($zoekresultaat = mysqli_affected_rows($GLOBALS["___mysqli_ston"]) > 0) { 
              $record = mysqli_fetch_assoc($zoekresultaat);  

              $zoekresultaat = mysqli_query($GLOBALS["___mysqli_ston"], $query); 

              if($zoekresultaat = mysqli_affected_rows($GLOBALS["___mysqli_ston"]) > 0) { 
                  $record = mysqli_fetch_assoc($zoekresultaat); 

                  $_SESSION['login'] = true; 
                  $_SESSION['username'] = $record['username']; 

                  header('location: dashboard.php'); 
              } else { 
                  header('location: loginerror.php'); 
              } 

              exit(); 
          } else { 
              echo "<br /><br />Could not find Database"; 
          } 
      } else { 
          echo "<br /><br />Could not connect to Database"; 
      } 
  } 
?> 

【问题讨论】:

  • 调试并检查它是否真的进入 else 条件。
  • 在编写更多 SQL 代码之前,必须阅读proper SQL escaping 以避免SQL injection bugs。对于mysqli,您需要使用bind_param 方法提供查询使用的值,并且永远不应该将来自$_POST 的用户提供的数据直接放入您的查询中。

标签: php mysql database login mysqli


【解决方案1】:

在输出任何内容后,您无法使用 header 方法进行重定向。在这种情况下,您在标头重定向之前使用 Echo,因此它不起作用。

请参阅此线程以供参考:How to fix "Headers already sent" error in PHP

在您的应用程序中输出任何内容之前,您应该如何定义重定向,如果这看起来很困难,您的应用程序可能需要重新构建。

如果您不想这样做,这里有一些替代方法,但它们是不好的做法:

HTML

<meta http-equiv="Location" content="http://example.com/">

Javascript

<script> location.replace("target.html"); </script>

和往常一样,保护自己免受 MySQL 注入:How can I prevent SQL injection in PHP?

【讨论】:

  • 这很奇怪,因为在转换到mysqli之前它工作得非常好,我现在要测试它,'header('location:dashboard.php'); ' 有效,但另一个无效?
  • 其他东西肯定发生了变化。如果在使用 header() 之前输出了任何内容,即使是 PHP 文件中的尾随空格,它也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2010-12-16
  • 2014-05-15
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多