我向你们致敬,感谢你们以前的帮助。 有人会想到这个非常简单的错误,它让我失望了几个小时。
在登录页面中,我将登录用户名和密码与数据库值进行比较(验证)。如果它们匹配,我将它们存储在会话变量中并重定向到仪表板页面。
在重定向之前,我打印__($ _SESSION)以查看是否设置了变量。它们的输出为TRUE(会话已设置)。
但是在仪表板上,调用会话变量会返回session!set。 请检查以下代码。
[登录页面]
<?php
session_start();
require_once('../data/conString_mysqli.php');
$uNameErr = $pWordErr = "";
$uName = $pWord = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//*************************************
if (!empty($_POST["username"])) {
$uName = test_input($_POST["username"]);
} else {
$uNameErr = "Email is required!";
// check if e-mail address is well-formed
if (!filter_var($uName, FILTER_VALIDATE_EMAIL)) {
$uNameErr = "Invalid email format";
}
}
if (!empty($_POST["password"])) {
$pWord = test_input($_POST["password"]);
$hashed = md5($pWord);
} else {
$pWord1Err = "Password is Required!";
if ($pWord < 8) {
$pWordErr = "Invalid Password.";
}
}
}//end if... IS_POST
function test_input($data) {
//require connection file
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}//end function
?>
<?php
if (!empty($uName) && !empty($pWord)){
$hashed = md5($pWord);
$read_data = mysqli_query($connect, "SELECT * FROM service_providers WHERE activated='1' AND ppword ='".$hashed."' AND pemail='".$uName."'") or die(mysqli_error());
$count = mysqli_num_rows($read_data);
if($count >= 1){/*echo '<script type="text/javascript">alert("Records Found!");</script>';*/
//store session variables
$row = mysqli_fetch_array($read_data);
$_SESSION[ 'serv_pid' ] = $row[ 'serv_pid' ];
$_SESSION[ 'providerName' ] = $row[ 'pname' ];
echo '<script type="text/javascript">alert("Session Name: '.$_SESSION['providerName']." - Session ID: ". $_SESSION['serv_pid'].'");window.location="../dashboard/";</script>';
/*echo "<pre>";
print_r ($_SESSION);
echo "</pre>";
*/
}else{echo '<script type="text/javascript">alert("Invalid Login Details");window.location="../login/";</script>';
}
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" style="margin-top: 1.5em;">
<div class="form-group">
<div class="input-group">
<input type="text" name="username" class="form-control text-center" placeholder="username (your email)" value="<?php echo $uName;?>"><span class="error"> <?php echo $uNameErr;?></span>
<span class="input-group-addon btn btn-warning" style="background: #f0ad4e; color: #fff;">
<span class="glyphicon glyphicon-user" style="margin: 0;"></span>
</span>
</div>
</div>
<div class="form-group">
<div class="input-group">
<input type="password" name="password" class="form-control text-center" placeholder="password" value="<?php echo $pWord;?>"><span class="error"> <?php echo $pWordErr;?></span>
<span class="input-group-addon btn btn-warning" style="background: #f0ad4e; color: #fff;">
<span class="glyphicon glyphicon-lock" style="margin: 0;"></span>
</span>
</div>
</div>
<p style="font-size: 16px !important;"><a style="color: #fff; text-decoration: none; margin-top: 2em; display: block;" href="../sign-up/">Don't have an Account? <u>Get one!</u></a> <span style="color:#FF0000; font-weight:bold; text-decoration:underline;"><em><a href="forgot_pass.php" title="Click here to get your password">Forgot your password?</a></em></span></p>
<div class="col-md-6 col-md-offset-3 text-center" style="margin-top: 5px;">
<button type="submit" name="login" class="btn btn-warning btn-lg btn-custom" style="margin-right: 1em; border-width: 3px;">LOGIN</button>
<a href="../sign-up/" class="btn btn-warning" style="background: none !important; border: 3px solid #fff;">SIGN UP</a>
</div>
<div class="clearfix"></div>
</form>
[DASHBOARD PAGE]
<?php
session_start();
echo "<pre>";
print_r ($_SESSION);
echo "</pre>";
/*
if (!isset($_SESSION['serv_pid'])){// or !isset($_SESSION['providerName'])){
die('<script type="text/javascript">alert("You do not have permission to access beyond the previous page.");window.location="../login/";</script>');
}else{
$serv_pid = $_SESSION['serv_pid'];
$pName = $_SESSION['providerName'];
}*/
?>
从登录页面,print_r返回的结果是:
阵 ( [serv_pid] =&gt; 1 [providerName] =&gt;无名 )
但是在进入登录页面时,就像会话被破坏一样。 print_r返回的结果是:
阵 ( )
请帮我解决任何想法。 提前谢谢。
答案 0 :(得分:0)
当您在PHP中启动会话时,它会设置一个会话cookie,当您在php
括号内或第一个echo
打印第一个字符时,会话cookie会被发送到浏览器。
我认为问题是当您尝试将用户重定向到仪表板页面时。您正在设置会话,向浏览器写入重定向到另一个页面的脚本,但同时服务器不会停止页面上的处理。
尝试在PHP中使用echo "<script>..."
替换header("Location: dashboard.php")
,然后执行exit(0);
指令。
第一个实际上告诉浏览器重定向到dashboard.php页面(或任何页面),第二个告诉浏览器停止执行页面。
此外,删除?>
和<?php
括号之间的空白行。该行实际上将标题与cookie一起发送到浏览器,即使它是空白字符。
答案 1 :(得分:0)
登录页面和发送页面上有多余的session_start()函数。每个session_start()都取消了另一个,变量在进入登录页面之前就被销毁了。
但是,我不得不放弃整个页面并一次重新创建一行。所以,它现在正在工作。
我真的很想欣赏Marco Todisco,他也为我的编码做出了暗示性的回应。