我试图制作一个简单的登录系统而且我被严重困住了。问题在于会话。当我按下登录时,我在登录页面被重定向。现在我可以看到,在登录页面中启动了一个会话.session_id()给出了一些数字。
但受保护的页面显示为NULL。如何在受保护的页面上启动会话?我试图实现一些代码的代码 - 仍然重定向到登录页面。我尝试使用新的空页面,只是页面上的表单,但是使用相同的数据库并仍然重定向到登录页面。
这是登录页面
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
require('dbcon.php');
if (isset($_POST['email']) && ($_POST['password'])) {
$e = mysqli_real_escape_string($dbcon, $_POST['email']);
$p = mysqli_real_escape_string($dbcon, $_POST['password']);
$q = "SELECT uid,mail,psword,unm FROM pics WHERE (mail='$e' AND psword=SHA1('$p'))";
$result = mysqli_query($dbcon,$q);
if(mysqli_num_rows($result) == 1){
session_start();
$uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
$_SESSION['uid'] = $uid['uid'];
header("location: members.php");
exit();
mysqli_free_result($result);
mysqli_close($dbcon);
}else{
echo 'no match';
}
}else{
echo 'Empty fields...';
}
}
?>
这是在“受保护”页面之上
<?php
session_start();
if(!isset($_SESSION['uid'])){
header("Location:index.php");
}
?>
会话信息
session
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
Directive Local Value Master Value
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path C:\xampp\tmp C:\xampp\tmp
session.serialize_handler php php
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies On On
session.use_only_cookies On On
session.use_strict_mode Off Off
session.use_trans_sid 0 0
答案 0 :(得分:1)
我做出的假设没有说明的假设:
表单数据以POST
类型提交,并且字符集正确(因此u
是u
是u
)
问题中显示的所有代码都在标题中引用的文件中,并且不在包含和其他“#34;隐藏的角落”中。
一些代码改进
<?php
session_start(); //at the start.
error_reporting(E_ALL); //as suggested by others add error logging
ini_set('display_errors',1); //and debugging to tell you info.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
require 'dbcon.php'; //no need for brackets here.
if (!empty($_POST['email']) && !empty($_POST['password'])) {
// you had a syntax error here. Also use empty() rather than
// isset as POSTED forms will still send the data containers
// even if it contains nothing.
$e = mysqli_real_escape_string($dbcon, $_POST['email']);
$p = mysqli_real_escape_string($dbcon, $_POST['password']);
$q = "SELECT uid,mail,psword,unm FROM pics WHERE mail='$e' AND psword=SHA1('$p')"; //no need for brackets here.
$result = mysqli_query($dbcon,$q);
if(mysqli_num_rows($result) == 1){
$uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
if(is_array($uid) && count($uid) > 0){
//added a further debug qualifier here
// to check that your SQL result is as expected.
$_SESSION['uid'] = $uid['uid'];
mysqli_free_result($result); //These occur AFTER the
mysqli_close($dbcon); // exit statement which stops the script.
//so put them before hand. but it's pretty worthless as
//mysqli will stop the connection anyway unless
//specifically told otherwise.
header("location: members.php");
exit();
}
else {
die("your SQL returned an empty result");
}
}else{
echo 'no match';
}
}else{
echo 'Empty fields...';
}
}
// removed PHP closing marker. Unneeded.
作为一个注释,当你只使用一个值时,为什么要从表中选择4个值?
目标网页
所以现在你已经向我们保证,这些值正被SQL ok抓取并被保存到SESSION
ok,所以问题在于在目标页面上找到会话?
首先,开始会议:
然后,正如其他人所说 - 错误日志和调试:
然后看看已将传递给会话处理程序:
session_start(); //always at the start!!!
error_reporting(E_ALL); //always use for error reporting in development
ini_set('display_errors',1); //always!!!
print_r($_SESSION);
如果此处没有显示任何错误,那么您需要返回登录页面并检查会话是否正确保存,所以:
$uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
$_SESSION['uid'] = $uid['uid'];
$_SESSION['sausages'] = "roasted";
...
header("location: members.php");
exit();
然后返回查看此members.php
页面上是否显示此静态变量字符串
如果是,那表明您的SQL查询而不是您的会话无效且失败,我不打算进入此处,但足以说明会话不是问题。这里可能的错误是您没有在数据库中正确存储散列值(SHA1
)。但是,如果发生SQL错误,我们需要更多信息来提供具体的帮助。
如果没有出现那么确实表明会话问题或文件处理问题,主要是你需要有一个明确的路径,代码在文件结构中,是&#34;受保护的& #34;您在页眉中引用的页面中实际显示的页面代码,此页面与登录页面位于同一目录中(而不是任何mod_rewrite
jibjag等)?
告诉我这对于确定问题的确切位置有何启发。
在其他说明中,值得注意的是您的密码系统不符合生产质量,应采用不同的方法。请研究StackOverflow。
修改强>
会议详情:
session.cookie_httponly
转为on
。C:\xampp\tmp
)中是否具有所有读写和执行设置(chmod 0777
)。 session.use_strict_mode
更改为on
。session.auto_start
设为on
。虽然我必须承认,除了绝对确定PHP已经允许读取和写入指定的会话目录外,您的会话信息中没有任何内容对我来说是一个可能的原因。
您的服务器日志(在您的计算机上运行PHP的程序)是否有任何错误/警告?
你可以找到一个好的explanation of chmod here。
THIS POST也可能给你很多帮助。
答案 1 :(得分:0)
这是行标题(&#34; location:members.php&#34;);工作?
我真的不需要以下几行:
exit();
mysqli_free_result($result);
mysqli_close($dbcon);
因为您的网页已被重定向。
现在,你究竟在members.php页面写了什么? 如果我的想法是正确的,您是否已将此受保护的页面包含在members.php之上?
答案 2 :(得分:0)
我是html5锅炉板,打开了一个新项目,我开始逐个添加html文件。在我开始编码登录之前,我有一个网站的备份。然后我复制了php代码。然后css和js files。到目前为止,只要我不更改文件夹的名称,登录就可以使用相同的代码。我希望它能保持这种状态。谢谢你的时间和帮助。我很感激