无法使用标题重定向(位置:)

时间:2013-09-24 22:54:31

标签: php redirect header

我无法从我的网站的登录页面重定向到信息中心。当我尝试通过提供正确的用户名和密码登录时,它再次向我显示登录页面,但是当我通过URL访问我的站点的仪表板时,我可以访问它,这证明会话已经开始。 以下是我的代码:

<?php

      error_reporting(0);
      session_start();
      include_once '../db.php';

      if(isset($_REQUEST['admsubmit']))
      {

          $result=executeQuery("select * from adminlogin where admname='".htmlspecialchars($_REQUEST['name'],ENT_QUOTES)."' and admpassword='".md5(htmlspecialchars($_REQUEST['password'],ENT_QUOTES))."'");

         // $result=mysql_query("select * from adminlogin where admname='".htmlspecialchars($_REQUEST['name'])."' and admpassword='".md5(htmlspecialchars($_REQUEST['password']))."'");
          if(mysql_num_rows($result)>0)
          {

              $r=mysql_fetch_array($result);
              if(strcmp($r['admpassword'],md5(htmlspecialchars($_REQUEST['password'],ENT_QUOTES)))==0)
              {
                  $_SESSION['admname']=htmlspecialchars_decode($r['admname'],ENT_QUOTES);
                  unset($_GLOBALS['message']);
                  header('Location: admwelcome.php');
              }else
          {
             $_GLOBALS['message']="Check Your user name and Password.";

          }

          }
          else
          {
              $_GLOBALS['message']="Check Your user name and Password.";

          }
          closedb();
      }
 ?>

4 个答案:

答案 0 :(得分:1)

根据我使用PHP的经验,问题是在清空页面缓冲区后无法重定向用户。问题是您必须先将标题发送到其他任何内容才能识别它们。您的脚本在发送导致用户重定向的Location头之前发送html数据,这就是重定向不起作用的原因。

要解决此问题,您必须在PHP代码的第一行启动缓冲区以防止发送html数据,并在文件末尾将其清空(如果缓冲区已满,它将自动清空)。您还可以在配置文件中指定缓冲区大小。

要打开output_buffering,请将以下行添加到.htaccess文件

php_flag output_buffering on

要启动缓冲区,请使用 ob_start()函数(http://www.php.net/manual/ro/function.ob-start.php)。

要清空缓冲区以防止它未填充,请使用 ob_end_flush()函数(http://www.php.net/manual/ro/function.ob-end-flush.php)。

您的代码应为:

<?php

  ob_start(); // start the page buffer so html data is not sent before the header

  error_reporting(0);
  session_start();
  include_once '../db.php';

  if(isset($_REQUEST['admsubmit']))
  {

      $result=executeQuery("select * from adminlogin where admname='".htmlspecialchars($_REQUEST['name'],ENT_QUOTES)."' and admpassword='".md5(htmlspecialchars($_REQUEST['password'],ENT_QUOTES))."'");

     // $result=mysql_query("select * from adminlogin where admname='".htmlspecialchars($_REQUEST['name'])."' and admpassword='".md5(htmlspecialchars($_REQUEST['password']))."'");
      if(mysql_num_rows($result)>0)
      {

          $r=mysql_fetch_array($result);
          if(strcmp($r['admpassword'],md5(htmlspecialchars($_REQUEST['password'],ENT_QUOTES)))==0)
          {
              $_SESSION['admname']=htmlspecialchars_decode($r['admname'],ENT_QUOTES);
              unset($_GLOBALS['message']);
              header('Location: admwelcome.php');
          }else
      {
         $_GLOBALS['message']="Check Your user name and Password.";

      }

      }
      else
      {
          $_GLOBALS['message']="Check Your user name and Password.";

      }
      closedb();
  }

  ob_end_flush(); // empty the buffer and send the html code back to the browser

  ?>

我还使用重定向功能,因此我可以更轻松地重定向:

function redirect($to) {

   header("Location: " . $to);

}

现在你可以像这样重定向(看起来更容易):

redirect("admwelcome.php");

请评价我的答案,因为我是新用户,暂不评价其他人: - )

答案 1 :(得分:1)

我在2分钟前遇到同样的问题......现在已经解决了:)

尝试使用JavaScript。在php代码中重新设置标头位置

?> 
<script type="text/javascript"> 


   window.location ="http://www.sirobd.com/index.php";

</script>
<?php

答案 2 :(得分:0)

使用meta尝试此代码。在content属性中,您可以更改数字,它是重定向之前的秒数

    if(strcmp($r['admpassword'],md5(htmlspecialchars($_REQUEST['password'],ENT_QUOTES)))==0){
        $_SESSION['admname']=htmlspecialchars_decode($r['admname'],ENT_QUOTES);
        unset($_GLOBALS['message']);
        echo '<meta http-equiv="Refresh" content="2;url=http://yourWebsite/admwelcome.php">';              
    }else{
         $_GLOBALS['message']="Check Your user name and Password.";
    }

答案 3 :(得分:0)

尝试添加:

session_write_close();
在标题调用之前

,然后添加exit for good measure。

session_write_close();
header('Location: admwelcome.php');
exit;