我已经在 stackoverflow 和 google 上搜索过,但无法解决问题。
对于我的登录页面,我使用了这里的代码https://github.com/Tutorialwork/Tutorials/tree/ac1ee61c5b43bde9b811759eaabcbed027b56385
尊重最初编写此代码的开发人员。
当我点击提交按钮(名为“Einloggen”)时,它没有重定向到“geheim.php”。这不适用于我的服务器。如果我使用 XAMPP 并输入数据库凭据,它可以正常工作。
在服务器上,它看起来只是在刷新 index.php 页面。 Chrome控制台没有报错。我在 Chrome 和 Safari 上试过了。都在 Mac 上。
在 mysql.php 中,我使用的凭据是服务器的凭据。我输入了真实的凭据,而不是代码中的凭据。无论如何,这不是问题。
当我回显变量 $count 时,它给我的值为 1,这意味着连接正常。我使用了我在这里发布的代码。所以,我只是用于测试目的的回声。因为我读到回声导致“位置”出现问题。
当我输入错误的密码或错误的用户时,它会按预期显示回声并写在代码中(“Der Login ist fehlgeschlagen”)。意味着数据库真的不是问题。
这条线不工作:
header("Location: geheim.php");
我没有把register.php贴在这里,因为它不应该是问题的原因。 但是你可以用它来创建一个用户。
在 sql 或 PhpMyAdmin 中我创建了数据库表。
CREATE TABLE accounts (USERNAME varchar(255), PASSWORD varchar(255));
index.php:我可以登录的主页。 mysql.php:包含数据库凭据。 logout.php:通过单击按钮在 geheim.php 页面上进行注销 geheim.php:点击 index.php 上的提交按钮后应显示的页面
就像我说的,凭据很好,它在我的计算机上本地工作。它正在重定向,登录注销。但是当我将它上传到服务器时,它并没有重定向。
index.php
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Login</title>
</head>
<body>
<?php
if(isset($_POST["submit"])){
require("mysql.php");
$stmt = $mysql->prepare("SELECT * FROM accounts WHERE USERNAME = :user"); //Username überprüfen
$stmt->bindParam(":user", $_POST["username"]);
$stmt->execute();
$count = $stmt->rowCount();
if($count == 1){
//Username ist frei
$row = $stmt->fetch();
if(password_verify($_POST["pw"], $row["PASSWORD"])){
session_start();
$_SESSION["username"] = $row["USERNAME"];
header("Location: geheim.php");
} else {
echo "Der Login ist fehlgeschlagen";
}
} else {
echo "Der Login ist fehlgeschlagen";
}
}
?>
<h1>Anmelden</h1>
<form action="index.php" method="post">
<input type="text" name="username" placeholder="Username" required><br>
<input type="password" name="pw" placeholder="Passwort" required><br>
<button type="submit" name="submit">Einloggen</button>
</form>
<br>
<a href="register.php">Noch keinen Account?</a>
</body>
</html>
mysql.php
<?php
$host = "localhost";
$name = "test";
$user = "root";
$passwort = "";
try{
$mysql = new PDO("mysql:host=$host;dbname=$name", $user, $passwort);
} catch (PDOException $e){
echo "SQL Error: ".$e->getMessage();
}
?>
注销.php
<?php
session_start();
session_destroy();
header("Location: index.php");
?>
geheim.php
<?php
session_start();
if(!isset($_SESSION["username"])){
header("Location: index.php");
exit;
}
?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>Top Secret</h1>
<a href="logout.php">Abmelden</a>
</body>
</html>
而不是使用
header()
功能,尝试在页面的任何地方使用htmlmeta
标签。
...
header("Location: geheim.php");
...
改为
...
echo '<meta http-equiv="refresh" content="0; url=geheim.php">';
exit;
...
按照标准编码惯例,这个
meta
标签必须放在页面的head
部分,但你也可以把这个标签放在正文的任何地方进行重定向。
这里的
content=0
代表页面在重定向之前的等待时间(以秒为单位)。