2

我已经完成了一个登录表单,它可以在我的 WAMP 服务器上 100% 运行。但是,当我在实时服务器上运行它时,一切都 100% 正常运行,除了我登录时它不会将我的页面重定向到它应该的页面(只显示一个空白的 HTML 页面)。但是它已登录,因为如果我输入它应该去的页面的 url,它会像它应该显示的那样显示。文件的路径是正确的。我希望我的问题很清楚。这是我的登录表单的代码:

<?php 
include_once "includes/scripts.php";
session_start();
include_once ("includes/connect.php");

if(isset($_SESSION['logged_in'])) {
    header('location: admin_cms.php');
    exit();
} else {
    if(isset($_POST['username'], $_POST['password'])) {
        $username = $_POST['username'];
        $password = md5($_POST['password']);

        if(empty($username) or empty($password)) {
             $error = '<p>NOTE: Fields are blank</p>';  
        } else {
             $query = $pdo->prepare("SELECT * FROM users WHERE user_name = ? AND user_password =?");
             $query->bindValue(1, $username);
             $query->bindValue(2, $password);
             $query->execute();
             $num = $query->rowCount();

             if($num == 1) {
                 $_SESSION['logged_in'] = true;
                 header('location: admin_cms.php');
                 exit();
             } else {
                 $error = "<p>NOTE: The username or password is incorrect</p>";     
             }
        }
    }
?>
    <div id="login_container">
        <br><img src="images/camelhorst_logo_full.png" style="margin-top:38px;">
        <h1>LOGIN<img src="images/three_column_grid_line.png" alt="line"></h1>
        <form  acton = "admin.php" method="post" autocompleate="off">
            <label>Username:</label>
            <input type="text" name="username" placeholder="Your Username" required autocomplete="off">
            <label>Password:</label>
            <input type="password" name="password" placeholder="Your Password" required autocomplete="off">
            <input type="submit"  value="Login" name="submit_login">
        </form>
<?php 
      if(isset($error)) {
          echo $error;
      }
?>
      <p id="copyright_admin"> © CAMELHORSE CREATIVE STUDIO 2013 </p>
    </div><!--login_container-->
<?php 
 } 
?>
</body>
</html>
4

4 回答 4

3

首先,

session_start() 

必须位于页面的最顶部。没有任何东西,在它之前没有空格。

第二,

if (empty($username) or empty($password)){

需要用这个替换

if (empty($username) || empty($password)){

试试看它是否有效

另外,这有点离题,我确信这不是导致您的问题的原因,但是 md5() 已经过时了。尝试使用

sha1();

改为加密。sha1() 也有点老了,但比 md5() 好。

这也有点跑题了。但是,这似乎值得注意。你有

if(isset($_POST['username'], $_POST['password'])) {
    $username = $_POST['username'];
    $password = md5($_POST['password']);

    if(empty($username) or empty($password)){
        $error = '<p>NOTE: Fields are blank</p>';   
    }

默认情况下,即使要加密的内容为空,md5 也会返回一个 32 个字符的十六进制数字。所以,条件

empty($password)

有点多余。更好的是:

if(isset($_POST['username'], $_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $pass_enc = md5($_POST['password']);

    if(empty($username) || empty($password)){
        $error = '<p>NOTE: Fields are blank</p>';   
    }
于 2013-09-28T20:13:23.097 回答
1

将重定向更改为此。

echo "<script>window.location='admin_cms.php'<script>";
于 2013-09-28T20:09:58.923 回答
0

伊克巴尔·马利克是对的。你应该使用 echo "window.location='admin_cms.php'";

对于重定向但是如果你想保留 header() 东西你必须放

 ob_start()

在页面顶部,就在下方

 session_start()

它会像魅力一样起作用。

编辑:关于 md5 / sha1 的事情,我刚开始使用:

 hash("sha512", md5($password))

用于我的密码加密。

于 2013-09-28T20:50:45.157 回答
0

大多数情况下,当你的 header() 重定向失败时,这是因为以前有输出(即使是空格也很重要),所以你可能需要确保文件或任何包含的文件上没有以前的输出。

<?php include_once "includes/scripts.php"; ?>

include_once ("includes/connect.php");

注意: <?php ?> 标签之外的任何空格都被视为输出。例如

<?php ...some php code... '
  //space below causes output to be written to html
?>

<?php
   ...more php code here...
?>
于 2013-09-28T20:16:58.050 回答