我知道这个主题已经在Stack之前已经介绍过了,我已经看了一些答案,但我仍然有点卡住,对PHP来说还是个新手。我网站上的每个页面都需要登录,因此用户会在页面加载时重定向到登录页面。在每页的顶部,我有:
<?
require("log.php");
include_once("config.php");
include_once("functions.php");
?>
这会将用户重定向到log.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");
}
?>
登录表单包含在login.php中。与PHP / log.php相关的login.pho代码是:
<?
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的代码应该放在log.php或login.php的顶部。
我尝试将它添加到两者,但是一旦输入用户名和密码,登录页面就会循环播放。
我想知道是否有人可以帮助我实现这项工作?
谢谢,
尼克
答案 0 :(得分:1)
似乎我没有权限对您的帖子发表评论,所以我会尽力回答。我为所有场景道歉,我只是尽我所能地随心所欲地回答。
如果您真的没有在代码中选择数据库,如此处所示,这可能是您的问题吗?请注意,下面的代码是您发布的代码。
$db = mysql_select_db(""); //put your database name in here
下面的代码不是我在我构建的任何内容中使用的代码,我建议你尝试用下面的代码替换那行代码吗?
if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement
如果你是以下逻辑,那么也存在于login.php文件中......这可能是你的问题。在访问您的网站时,我注意到您的表单出现在login.php上,但您的逻辑是发布到log.php。我希望这段代码可以帮助排除“跳转”,因为login.php可能会保存自己并覆盖你已建立的$ _SESSION变量
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
如果把它从login.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
)
)
所以现在......您可以将您的网址设置为更像以下内容......
// 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
一切顺利,我当然希望这在某种程度上有所帮助。
答案 1 :(得分:0)
IN SCENARIO 4
从客户端测试ajax带有javascript代码的XMLHttpRequest的登录/密码到用于验证的专用脚本(在安全模式https上执行)
如果响应正确,请将登录密码发送到脚本服务器。
Stips:编码密码更安全!
答案 2 :(得分:0)
使用header()函数这是一个坏主意。
手动规范说;
请记住,在任何实际输出之前必须调用header() 通过普通HTML标记,文件中的空行或PHP发送。 使用include或require读取代码是一个非常常见的错误, 函数或其他文件访问函数,并且有空格或空 调用header()之前输出的行。一样的问题 使用单个PHP / HTML文件时存在。
所以在你的情况下,我建议使用带有ID的cookie只为会话生成,在第一次连接时生成,cookie的持续时间可能只有2到10分钟。
每次调用loging.PHP时重新生成cookie!
度过愉快的一天