我知道这个主题之前在 Stack 上已经讨论过了,我已经看过一些答案,但我仍然有点卡住了,对 PHP 相当陌生。 我网站上的每个页面都需要登录,因此用户在页面加载时被重定向到登录页面。 在每页的顶部,我有:
<?
require("log.php");
include_once("config.php");
include_once("functions.php");
?>
这会将用户重定向到日志.php(添加了新代码):
<?
session_name("MyLogin");
session_start();
if(isset($_SESSION['url']))
$url = $_SESSION['url']; // holds url for last page visited.
else
$url = "index.php"; // default page for
if($_GET['action'] == "login") {
$conn = mysql_connect("localhost","",""); // your MySQL connection data
$db = mysql_select_db(""); //put your database name in here
$name = $_POST['user'];
$q_user = mysql_query("SELECT * FROM users WHERE login='$name'");
if (!$q_user) {
die(mysql_error());
}
if(mysql_num_rows($q_user) == 1) {
$query = mysql_query("SELECT * FROM users WHERE login='$name'");
$data = mysql_fetch_array($query);
if($_POST['pwd'] == $data['password']) {
$_SESSION["name"] = $name;
header("Location: http://monthlymixup.com/$url"); // success page. put the URL you want
exit;
} else {
header("Location: login.php?login=failed&cause=".urlencode('Wrong Password'));
exit;
}
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User'));
exit;
}
}
// if the session is not registered
if(session_is_registered("name") == false) {
header("Location: login.php");
}
?>
登录表单包含在登录.php中。 与 PHP/log 相关的 login.pho 代码.php为:
<?
session_start();
if($_GET['login'] == "failed") {
print $_GET['cause'];
}
?>
和
<form name="login_form" id="form" method="post" action="log.php?action=login">
我遇到的答案是我应该补充:
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
到每个页面的顶部,我这样做了,在页面顶部(在"require("log.php");"上方),然后添加:
if(isset($_SESSION['url']))
$url = $_SESSION['url']; // holds url for last page visited.
else
$url = "index.php"; // default page for
到我的登录页面,并在成功登录后使用以下 URL 进行重定向:
header("Location: http://example.com/$url"); // perform correct redirect.
我不是 100% 存储引用 URL 的代码应该去哪里,在日志.php或登录.php的顶部。
我尝试将其添加到两者中,但是一旦我输入用户名和密码,登录页面就会循环。
我想知道是否有人可以帮助我解决这个问题?
谢谢
缺口
看来我没有特权对您的帖子发表评论,所以我会尽我所能回答。对于所有情况,我深表歉意,我只是尽我所能一时兴起回答。
场景 1:
如果您确实没有在代码中选择数据库(如此处所示),这可能是您的问题吗?请注意,下面的代码是您发布的代码。
$db = mysql_select_db(""); //put your database name in here
场景 2:
下面的代码不是我在构建的任何东西中使用过的东西,我可以建议你尝试用它下面的行替换那行代码吗?
if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement
场景 3:
如果你是以下内容的逻辑,也存在于登录.php文件中......这可能是您的问题。访问您的网站时,我注意到您的表单出现在登录.php时,但您的逻辑正在发布到 log.php。我希望这段代码可以帮助排除"跳转",因为登录.php可能会保存自己并覆盖您建立的 $_SESSION 变量
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
如果它太复杂而无法将其从登录.php文件中取出,如果您甚至在那里,我已经整理了一些代码,您可以使用这些代码来创建"内部"面包屑,因此您可以在历史记录中返回 2 页。
if(!isset($_SESSION['internal_breadcrumbs']))
$_SESSION['internal_breadcrumbs'] = array();
$_SESSION['internal_breadcrumbs'][] = $_SERVER['REQUEST_URI'];
$max_breadcrumbs = 5;
while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
array_shift($_SESSION['internal_breadcrumbs']);
这将创建一个最多包含 $max_breadcrumbs 元素的数组,最后是你最近的页面,如下所示
Array
(
[internal_breadcrumbs] => Array
(
[0] => /other_page.php
[1] => /other_page.php
[2] => /other_page.php
[3] => /user_page.php <-- desired page
[4] => /login.php <-- most recent page
)
)
所以现在...您可以将 URL 设置为更像以下内容的内容...
// I'm doing - 2 to accommodate for zero indexing, to get 1 from the current page
if(isset($_SESSION['internal_breadcrumbs']))
$url = $_SESSION['internal_breadcrumbs'][count($_SESSION['internal_breadcrumbs']) - 2];
else
$url = "index.php"; // default page for
万事如意,我当然希望这在某种程度上有所帮助。
场景 4 中
从客户端测试带有javascript代码的ajax XMLHttpRequest的登录名/密码到专用脚本进行验证(在https模式下进行安全)
如果响应正确,则将登录密码发送到脚本服务器。
提示:编码密码更安全!
使用 header() 函数是个坏主意。
说明书规格说;
请记住,在任何实际输出之前必须调用 header() 通过普通 HTML 标记、文件中的空行或从 PHP 发送。 读取包含或要求的代码是一个非常常见的错误 函数或其他文件访问函数,并且具有空格或空 在调用 header() 之前输出的行。同样的问题 使用单个 PHP/HTML 文件时存在。
因此,在您的情况下,我建议使用仅针对会话生成的 ID 的 cookie,在第一次连接时生成,并且 cookie 的持续时间可能只有 2 到 10 分钟。
每次登录时重新生成cookie。PHP被称为!
有好的一天