在 PHP 表单提交后重定向,使用 ajax 不启动会话



我正在尝试使用 ajax 提交PHP登录并在提交表单后重定向到header('Location:)'。但是我已经搜索了(我认为足够好(并发现一种方法是使用javascript window.location()但问题是登录后session没有启动。如何解决这个问题。以下是我的代码。

阿贾克斯

$('#submit_log').click(function(e) {
e.preventDefault();
username = $('#log_name').val();
password = $('#log_password').val();
formData = $('#loginForm').serialize();
$.ajax({
type: "POST",
url: "login.php",
data: formData,
beforeSend: function()
{
$('.logresult').html('Loading...');
},
success: function(response)
{
$('.logresult').html('Signing In...');
window.location = "exporter.php";
}
});
return false;
});

PHP 登录脚本

session_start();
require_once ("db.php");
$db = new MyDB();
if(isset($_POST['log_name']) && isset($_POST['log_password'])) {
$username = preg_replace('#[^A-Za-z0-9]#i', '', $_POST['log_name']);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST['log_password']);
$sql = $db->prepare("SELECT * FROM users WHERE uname = ?");
$sql->bindParam(1, $username, SQLITE3_TEXT);
$ret = $sql->execute();
$count = $db->prepare("SELECT COUNT(*) as COUNT FROM users WHERE uname = ?");
$count->bindParam(1, $password, SQLITE3_TEXT);
$count_ret = $count->execute();
if (count($count_ret) == 1)
{
while ($row = $ret->fetchArray(SQLITE3_ASSOC))
{
$id = $row['userid'];
$regas = $row['regas'];
$uemail = $row['uemail'];
$pword = $row['pword'];
if (password_verify($password, $pword))
{
$_SESSION['log_id'] = $id;
$_SESSION['log_name'] = $username;
$_SESSION['regas'] = $regas;
$_SESSION['uemail'] = $uemail;
//header("Location: index.php?log_id=$id");
echo "Sigining In...";
exit();
}
else
{
echo "Information incorrect";
exit();
}
}
}
}

谢谢。

它不起作用,因为在您的计数查询中,您正在根据用户名检查密码。

$count = $db->prepare("SELECT COUNT(*) as COUNT FROM users WHERE uname = ?");
$count->bindParam(1, $password, SQLITE3_TEXT);
$count_ret = $count->execute();

应该是

$count = $db->prepare("SELECT COUNT(*) as COUNT FROM users WHERE uname = ?");
$count->bindParam(1, $username, SQLITE3_TEXT);
$count_ret = $count->execute();

但实际上,您可以省略计数并从 while 循环开始。并移动

echo "Information incorrect";
exit();

在那下面。如果登录信息正确,则无法访问它。

最新更新