【问题标题】:Can't get php to set sessions无法让 php 设置会话
【发布时间】:2012-05-27 19:29:46
【问题描述】:

我就是无法在 php 中设置会话,也找不到原因。

希望你能给我一个线索,我可能做错了什么!

index.php

<?php
    // Inialize session
    session_start();

    include_once("commons/config.php");
    $authenticated = checkLoggedIn("yes", FALSE);
    //flushMemberSession();

    var_dump($authenticated);

    echo "<pre>";
    var_dump($_SESSION);
    echo "</pre>";
?>
... followed by html and some php ifs

jquery ajax 调用返回 TRUEFALSE,应该从 checkPass() 内部 actions.php

$('#login').click(function(){
    var data = $('#login-form').serialize();
    $.post('commons/actions.php', data, function(result){
        if(result == true){
            console.log(result);
            //location.reload();
        }else{
            console.log('not authenthicated');
        }
    },'json');
    return false;
});

actions.php

session_start();
if (!$_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']){
    header('HTTP/1.0 400 Unauthorized', true, 400);
    exit;
} else {

    include('config.php');

    $user = mysql_real_escape_string(stripslashes($_POST['username']));
    $pass = mysql_real_escape_string(stripslashes($_POST['password']));

    $response = checkPass($user, $pass); // false or

    $debug = array('user'=>$user, 'pass'=>$pass, 'response'=>$response);

    print_r(json_encode($response));

}

功能:

function checkLoggedIn($status, $redirect=TRUE){
    switch($status){
        case "yes":
            if(!isset($_SESSION["loggedIn"])){
                if($redirect) {
                    header("Location: login.php");
                    exit;
                } else {
                    $authenticated = false;
                    return $authenticated;
                }
            } else {
                checkLoggedIn("no");
            }
        break;
        case "no":
            if(isset($_SESSION["loggedIn"]) && $_SESSION["loggedIn"] === true ){
                //header("Location: members.php");
                $authenticated = true;
                return $authenticated;
            }
        break;
    }   
    return true;
}

function checkPass($username, $password) {
    $query="SELECT username, password FROM users WHERE username='$username' and password='$password'";
    $result=mysql_query($query, $link) or die("checkPass fatal error: ".mysql_error());

// Check exactly one row is found:
if(mysql_num_rows($result)==1) {
    cleanMemberSession($username);
    return true;
    /*$row=mysql_fetch_array($result);
    return $row;*/
}
//Bad username:
return false;
}

function cleanMemberSession($username) {
session_regenerate_id();
$_SESSION["username"]=$username;
$_SESSION["loggedIn"]=true;
session_write_close();
}

更新

AJAX 标头

Response Headers
Connection  Keep-Alive
Content-Length  4
Content-Type    text/html
Date    Sun, 27 May 2012 19:36:54 GMT
Keep-Alive  timeout=5, max=100
Server  Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By    PHP/5.3.8
Request Headers
Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Content-Length  31
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie  PHPSESSID=qhbjq76f4np7iug09jrnl4j5j1
Host    localhost
Referer http://localhost/tw/Tevienes/web/
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
X-Requested-With    XMLHttpRequest

更新2

顺便说一句,var_dump($_SESSION); 的回复是array(0) { }

更新3

我刚刚在index.php中session_start();之后添加了$_SESSION['test'] = 'alex';,并且会话变量已经设置......所以它必须是设置变量的函数......或者谁知道还有什么

【问题讨论】:

  • 您忘记描述您的预期和得到的结果(错误消息、错误结果等)
  • 我希望它设置 SESSION 变量,但什么也没有
  • 请发布 ajax POST 标头和数据以及 ajax 响应。
  • @Quassnoi,我刚刚用标题更新了我的问题,它接缝没问题,不是吗?
  • 顺便说一句,ajax 响应标头是在我使用正确的凭据单击登录之后

标签: php mysql session http-post session-variables


【解决方案1】:

将 session_start() 放入所有调用的 .php 文件中,也包括从 ajax 调用的文件。 同样在actions.php 的开头,在比较中加上括号。 !运算符的优先级高于 。

改变

 if (!$_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']){

 if (!($_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR'])){

【讨论】:

  • 我相信你知道这一点,但对于其他读者来说,如果会话已经开始,调用 session_start 只会恢复之前启动的会话。
  • @w0rldart 我在 actions.php 中没有看到 session_start()
  • @sivann,您的编辑没有任何逻辑......这不是问题......无论如何谢谢......我想我已经解决了这个问题。您的编辑无可比拟,应该是:if (!(x)==(y))
  • 那是什么?我认为你真的需要括号。否则就像 if ( (!x) == (y) )
【解决方案2】:

远射和愚蠢,但请检查服务器和客户端上的日期和时间设置是否正确。如果其中任何一个设置不正确,会话 cookie 将/可能不会设置。

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多