php - 单击登录表单中的提交会重定向到index.php并且不会登录

标签 php mysql html .htaccess form-submit

我正在使用 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 部分中不必要的 echo 搞砸了一切。 删除它解决了我的问题。 我没有立即发现它的原因是因为我实际上认为这是正确的做法。 另外,我在各个 php 文件之间复制粘贴了表单部分,所以我认为它在所有页面中都是相同的,并且由于它在一个页面中工作,所以我认为它在所有文档中都是正确的。 所以我试图在表单之外的php部分找到错误,因为它在所有文档中都发生了变化。 但在最后一次比较 post.php 和 login.php 后我终于注意到了这一点。我想结局是幸福的。

关于php - 单击登录表单中的提交会重定向到index.php并且不会登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24900609/

相关文章:

mysql - 如何在 CI Bonfire 中使用 MySql 查询

html - 浏览器调整大小时的响应式 div 行为

JavaScript:按类单击元素不起作用

javascript - 在鼠标轨迹中显示图像

PHPUnit-Skelgen 1.2.0 不创建命名空间

PHP datetime 添加一秒

MySQL 程序花费太多时间并且表非常大

php - Php PDO函数: lastInsertId?有多安全

php - 警告mysql_fetch_array,但显示值

php - 确定并排序多个位置的距离