0

我花了很多天来解决这个问题,但我找不到解决方案。在我使用我的 ajax 表单 + php 后端登录后,用户被重定向的页面显示“缺少会话”消息,如果我尝试转储 $_SESSION 它看起来像空的。然后,如果我返回并进行相同的登录,它将正常工作。这发生在不同的浏览器(通常是当他们清除 cookie 和缓存时)和不同的托管服务提供商。

这是我的ajax代码:


$(document).ready(function(){
 $('#loginbtn').click(function(){

if($('#username').val() == "" || $('#password').val() == ""){
            return false;   
        }
        else
        {

            $.ajax
            ({
                type: 'POST',
                url: 'ajax_login.php',
                cache: false,
                dataType: 'json',
                data:
                {
                    username: $('#username').val(),
                    password: $('#password').val()
                },
                success:function(data)
                {


                if(data.error === true){

alert("Failed to login: "+data.message)

                    }
                    else
                    {


        setTimeout(function() 
        { 
window.location = 'http://www.mywebsite.com/dashboard.php';
        },2000);  

                    }
                },
                error:function(XMLHttpRequest,textStatus,errorThrown){
            alert("An error occured!");

                }
            });
            return false;
        }

   });    

   });

这是 PHP 登录后端:

<?php
include "config.php"; // start session and connect to mysql db, also contain functions sanitize(), getip()

$username = sanitize(htmlspecialchars($_POST['username'],ENT_QUOTES));
$pass = sanitize($_POST['password']);


 // FUNCTION TO LOGIN
$sql = mysql_query("SELECT * FROM members WHERE username = '$username' AND password = '$pass'"); 
$array = mysql_fetch_array($sql);

if(mysql_num_rows($sql) === 0){
$message['error'] = true;
$message['message'] = "Wrong username or password.";    
echo json_encode($message); 
exit;
}


$_SESSION['username'] = ucwords(strtolower($username)); 
$_SESSION['points'] = $array['points'];
$_SESSION['ip'] = getip(); 
$_SESSION['welcome'] = true;


$message['error'] = false;
$message['message'] = "Completato.";    

echo json_encode($message); 
exit;

最后这是 dashboard.php 检查会话代码:

<?php

include "config.php";
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); 

if($_SESSION['username'] == "") {
header("Location: index.php?nosession");
exit;
}

编辑:这是 config.php 里面的内容

<?
session_start();
date_default_timezone_set("Europe/Rome");
$hostname = ""; //hostname 
$data_username = "dbxxxxxxxx"; //database username
$data_password = "xxxxx"; //database password
$data_basename = "dbxxxxxxx"; //database name
$conn = mysql_connect("".$hostname."","".$data_username."","".$data_password."");  
mysql_select_db("".$data_basename."") or die(mysql_error()); 

function sanitize($text) { // funzione che pulisce le stringe per prevenire exploit;
if(get_magic_quotes_gpc() == 0) {
$text = addslashes($text);
}
$text = htmlentities($text);
$text = strip_tags($text);
$escape = mysql_real_escape_string($text);
$arraydangerous = array('SELECT *', 'LOAD_FILE', 'DELETE', 'TRUNCATE', '\' OR', '<javascript>', 'src=', '<?', '?>', 'document.cookie', 'http://', 'www.'); 
$text = str_replace($arraydangerous, "", $text);
return $text;
}

function getip()
{
    return filtra($_SERVER['HTTP_CF_CONNECTING_IP']);   // I use CloudFlare ,so i must use this way :)
}

我怎样才能解决这个问题?谢谢

4

2 回答 2

1

config.php之后添加此行session_start();

session_start();

// reset the session, if not logged-in
if (empty($_SESSION['username'])) {

    $_SESSION['username'] = null; 
    $_SESSION['points'] = null;
    $_SESSION['ip'] = null; 
    $_SESSION['welcome'] = null;
}

另外我想你最好把dashboard.php改成这样:

<?php

include "config.php";

if($_SESSION['username'] == "") {
    header("Location: index.php?nosession");
    exit;
}


if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); 

?>

我认为您的问题是您在测试代码时在服务器上拥有的旧会话。例如,您尝试登录,将值添加到会话,但由于某种原因您收到一些错误,并且您看到您没有登录。您忘记了您已经向会话添加了一些数据,您刷新看到dashboard.php,你会看到,嘿,看来你已经登录了。然后你可能会认为你的代码很疯狂,随机运行或任何其他不相关的原因。(几年前我有一段代码,当天下雨的时候能用,没下雨的时候就不行。幸好我用了2天就解决了这个问题,才发疯!)

您还可以清理存储在服务器上的所有会话,以确保在更改代码时进行干净的测试。

我希望这些会有所帮助。

于 2012-11-04T12:16:16.840 回答
0

我不确定是这种情况还是什么(因为我不知道里面有什么config.php),但在我看来,您在“PHP 登录后端”文件中使用它之前忘记启动会话了!

于 2012-11-04T08:46:35.557 回答