簡體   English   中英

單擊登錄表單中的提交重定向到index.php且不登錄

[英]Clicking on submit in login form redirects to index.php and doesn't login

我正在使用html5 / php / mysql創建我的第一個動態網站。 我不明白為什么這行不通。 根目錄下的index.php文件基本上將所有內容放在一起。 位於example.com/(或example.com/index.php):

<!doctype html>
<html>
<?php
include("layout/header.php");
include("layout/layout.html");

/*content BEGIN*/
if (!empty($_SERVER['QUERY_STRING'])) {
    $page = $_SERVER['QUERY_STRING'];
    if(substr($page, -1) == '/') {
    $page = substr($page, 0, -1);
    }
    /*$page = basename($page);*/
    if (!file_exists("page/$page.php")){
        include("layout/404.html");
        }
    else{
        include("page/$page.php");
        }
}
else {
    include("page/home.php");
}
/*content END*/
include("layout/footer.html");
?>
</html>

.htaccess具有以下功能:

RewriteRule ^(.*)$ index.php?/$1 [L]

因此,基本上example.com/foo/bar在網站的布局內顯示example.com/page/foo/bar.php的內容。

此post.php(位於example.com/page/admin/post.php並通過example.com/admin/post進行布局訪問)可以正常工作:

<div class="text">
<?php
session_start();
if (!isset($_SESSION['login'])){
    header("Location: /admin/login");
    }
if(isset($_POST['submit']) && ($_POST['submit'])=="Post"){
    if (!isset($_POST["title"]) || (trim($_POST["title"])=="")){
        echo "Insert a title.";
        }
    elseif(!isset($_POST["post"]) || (trim($_POST["post"])=="")){
        echo "You forgot the post";
        }
    elseif(!isset($_POST["author"]) || (trim($_POST["author"])=="")){
        echo "Write your name";
        }
    else{
        $postTitle = $_POST["title"];
        $post = $_POST["post"];
        $postAuthor = $_POST["author"];
        include "mysql.php";
        $sql = new mysql();
        $sql->connect();
        $sql->insert("post",array($postTitle, $post, $postAuthor),"title,post,author");
        echo "Great Success!";
        $sql->disc();
        }
}
else{
?>
<form action="<?php $_SERVER["PHP_SELF"];?>" method="post">
<h2>New Post:</h2>
Title:
<br />
<input name="title" type="text" size="64" />
<br />
Text:
<br />
<textarea name="post" cols="80" rows="20"></textarea>
<br />
Author:
<br />
<input name="author" type="text" size="32"  />
<br />
<input name="submit" type="submit" value="Post" />
</form>
<?php
}
?>
</div>

所以正如我所說,這很好。 但是我的登錄面板(example.com/page/admin/login.php或example.com/admin/login)僅在我直接訪問它(example.com/page/admin/login.php)時才有效,因此沒有布局周圍。 如果我通過example.com/admin/login以“正確的方式”訪問它,則會加載它,但是在單擊“提交”后,總是將我重定向到example.com/index.php(此精確URL,而不是example.com/),但不會實際登錄我。這是login.php的代碼:

<div class="text">
<?php
session_start();
if(isset($_SESSION['login'])){
    header("Location: /admin/panel");
    }
if(isset($_POST["submit"]) && (trim($_POST["submit"])=="Login")){
    if (!isset($_POST["password"]) || (trim($_POST["password"])=="")){
        echo "Insert password";
        }
    elseif (!isset($_POST["username"]) || (trim($_POST["username"])=="")){
        echo "Insert your username";
        }
    $username = trim(filter_var($_POST['username'], FILTER_SANITIZE_STRING));
    $password = trim(filter_var($_POST['password'], FILTER_SANITIZE_STRING));
    $password = sha1($password);
    include "mysql.php";
    $sql = new mysql();
    $sql->connect();
    $loginlist = $sql->query("SELECT user_id FROM users WHERE username = '$username' AND password = '$password'");
    if(mysql_num_rows($loginlist)==0){
        echo "Username/password wrong";
        }
    else{
        $userdata = $sql->extract($loginlist);
        $_SESSION["login"] = $userdata->user_id;
        $sql->disc();
        header("Location: /admin/panel");
        }
    }
    else{
?>
<h2>Admin panel login</h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Username:
<br>
<input name="username" type="text" size="16">
<br>
Password:
<br>
<input name="password" type="password" size="64">
<br>
<input name="submit" type="submit" value="Login">
<br>
</form>
<?php 
} 
?>
</div>

apache日志也說:

"POST /index.php HTTP/1.1" 200 2906

每次發生這種情況。

我自己找到了解決方案。 在這一點上,我失去了希望,沒想到能真正解決這個問題。 基本上,在post.php(從一開始就起作用的形式)的形式中

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">

但是在一個行不通的網站上,login.php是

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

看到不同? 正是php部分中不必要的回聲搞砸了一切。 刪除它解決了我的問題。 我沒有立即發現它的原因是因為我實際上認為這是正確的方法。 我也復制粘貼了我的各個php文件之間的表單部分,因此我認為在所有頁面中都相同,並且由於可以在一個頁面中使用,所以我認為在所有文檔中都是正確的。 因此,我嘗試在表單之外的php部分中查找錯誤,因為該錯誤在所有文檔中均發生了變化。 但是最后一次比較了post.php和login.php之后,我終於注意到了。 我猜很開心的結局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM