使用AJAX/jQuery设置$| PHP会话不起作用?

使用AJAX/jQuery设置$| PHP会话不起作用?,php,jquery,ajax,Php,Jquery,Ajax,我正在为我的网站编写登录脚本。我已经编写了登录脚本,并且通过jQuery通过AJAX调用将表单绑定到它 以下是表单正在调用的php: <?PHP # Make sure form data was passed to the script IF (isset($_POST) && isset($_POST['username']) && isset($_POST['password'])){ # Connect to t

我正在为我的网站编写登录脚本。我已经编写了登录脚本,并且通过jQuery通过AJAX调用将表单绑定到它

以下是表单正在调用的php:

<?PHP   
    # Make sure form data was passed to the script
    IF (isset($_POST) && isset($_POST['username']) && isset($_POST['password'])){
        # Connect to the database
        REQUIRE('../../../../my_db.php');

        # Define variables
        $given_username = $_POST['username'];
        $given_password = $_POST['password'];
        $hashed_password = md5($given_password);
        $matched_username = "";
        $matched_password = "";


        # See if there is matching info in the database
        $sql = 'SELECT username, pass FROM users WHERE username="'.$given_username.'" AND pass = "'.$hashed_password.'"';
        $result = mysql_query($sql);
        WHILE($row = mysql_fetch_assoc($result)){
            $matched_username = $row['username'];
            $matched_password = $row['pass'];
        };


        # If there was a match
        IF ($matched_username != "" && $matched_password != ""){

            # Double check the values match
            IF ($given_username == $matched_username && $hashed_password == $matched_password){

                # If there is only one result returned
                $session_sql = 'SELECT * FROM users WHERE username="'.$matched_username.'" AND pass = "'.$matched_password.'"';
                $session_result = mysql_query($session_sql);
                IF(count(mysql_fetch_assoc($session_result)) != 0  &&  count(mysql_fetch_assoc($session_result)) < 2){

                    # If they do, start a session
                    if(!isset($_SESSION)) {
                     session_start();
                     session_regenerate_id();
                    };

                    # Set our session values
                    WHILE($session_row = mysql_fetch_assoc($session_result)){
                        $_SESSION['id'] = $session_row['id'];
                        $_SESSION['last_login'] = $session_row['last_login'];
                        $_SESSION['username'] = $session_row['username'];
                        $_SESSION['signup_date'] = $session_row['signup_date']; 
                    };

                    # Set users last login date and time to this login
                    $update_sql = 'UPDATE users SET last_login = NOW WHERE username="'.$matched_username.'" AND pass = "'.$matched_password.'"';
                    $update = mysql_query($update_sql);

                    echo json_encode(array("success"=>"user logged in", "session"=>$_SESSION));
                }ELSE 
                    echo json_encode(array("error"=>"More than one user with the same information.  What did you do?!"));
            }ELSE
                echo json_encode(array("error"=>"invalid login provided"));
        }ELSE
            echo json_encode(array("error"=>"invalid login provided"));
    }ELSE
        echo json_encode(array("error"=>"you must supply a username and password"));
?>

确保脚本开头有
会话\u start()
。如果在进入
session\u start()
之前抛出任何通知或任何内容,则会出现如下错误:

警告:session_start():无法发送会话cookie-标头已由发送(输出从


另外,您的脚本可以进行SQL注入。请确保正确转义用户名和密码!注意:您最好的选择是使用。

我已经离开PHP一段时间了,所以我可能是从我的基本知识出发,但我认为您需要使用
会话\u开始()
会话\u编写\u关闭()

在对$\u会话数组执行任何操作之前,应调用
session\u start()
。修改完$\u会话后,应调用
session\u write\u close()

有关详细信息,请参阅

如果您的主机提供商尚未修改php.ini,您可能还需要修改它。请参阅


希望这对您有所帮助。

关于您的php脚本的一些提示:

  • 确保在php标记后的第一行代码中启动了会话

    会话_start();
    //这里有其他代码

注意:您还可以使用会话id()检查会话是否已启动

  • 首先单独测试Ajax调用的php脚本(将一些有效的$\u POST数据作为代码条目),确保在返回json字符串之前没有回显任何内容,并且没有收到警告(这将被视为类似于屏幕输出)

  • 您还可以声明正确的标题,因为它们在此处看起来缺失:

    标题('Content-type:application/json')

  • 不要忘记javascript回调来读取请求答案:-)


亲爱的@StephenRios特别感谢您的回答,我确实在代码中应用了提到的设置,但实际上问题是关于CORS跨来源资源共享,我被这个问题困扰并问了一个问题亲爱的@StephenRios特别感谢您的回答,我确实在代码中应用了提到的设置,但实际上问题是关于CORS的跨来源资源共享,我被这个问题困住了,我在发言中问了一个问题,我的朋友Milano Fili可以解决这个问题

我在angularJS中使用了一个设置:

$httpProvider.defaults.withCredentials = true;
还有我的web服务器中的一个设置(这里是apache)


非常感谢您的回复,我刚刚在这里分享了我的案例,因为我在谷歌上搜索了3天多,希望能有所帮助。

所以我需要在javascript开始时使用session_start()?我们不是只想在用户成功登录后启动会话吗?或者我们只是检查会话,看看他们是否已经登录并一直运行它?不,不是在javascript的开头,不是在PHP脚本的开头。不,您只想在用户登录时将数据存储在会话中,您仍然需要在开始时启动它以避免错误。将会话_start()移到开始处,添加了ini _set以尝试设置某些会话设置。两方面都不走运。感谢您提供有关会话和SQL注入的信息。我想我必须与我的主机提供商联系。我试着用ini_设置这些东西,但即使这样也没用。嗨@StephenRios,我也有同样的问题,你是怎么解决的?谢谢你advance@Ebrahim检查我在下面选择的答案。这就解决了我的问题。
Header add Access-Control-Allow-Credentials "true"