Php $\u会话变量未在AJAX调用中设置

Php $\u会话变量未在AJAX调用中设置,php,jquery,session-variables,Php,Jquery,Session Variables,我编写了此用户身份验证调用: $( '.sign-in' ).click( function(e) { e.preventDefault(); var logincall = $.ajax({ type: "POST", url: "../snippets/auth.php", data: { username: $('#id_email').val(), password: $('#id_password').val() }

我编写了此用户身份验证调用:

$( '.sign-in' ).click( function(e) {
    e.preventDefault();
    var logincall = $.ajax({
        type: "POST",
        url: "../snippets/auth.php",
        data: { username: $('#id_email').val(), password:   $('#id_password').val() }
    });
    logincall.done(function( result ) {
        alert( 'finished: ' + result );
        if( result == 'valid' ) {
            location.reload();
        } else {
            $( '.warning' ).toggleClass('hidden');
        }
    });
    logincall.fail(function( jqXHR, textStatus ) {
      alert( "Request failed: " + textStatus );
    });
});
下面是auth.php函数

if( isset($_POST['username']) && isset($_POST['password']) ) {

    $username = $_POST['username'];
    $password = md5($_POST['password']);
    $query = "SELECT COUNT(*) FROM member WHERE username='$username' AND password='$password';";
    $result = $mysqli->query($query);
    $result = $result->fetch_array(MYSQLI_ASSOC);

    if( $result['COUNT(*)'] !== 0 ) {
        $_SESSION['logged'] = true; //this sets
        $query = "SELECT id, level FROM member WHERE username='$username' AND password='$password';";
        $result = $mysqli->query($query);
        $result = $result->fetch_array(MYSQLI_ASSOC);
        $_SESSION['uid'] = $result['id']; //this DOES NOT set
        $_SESSION['lvl'] = $result['level']; //this DOES NOT set
        echo json_encode('valid');
    } else {
        echo json_encode('invalid');
    }
}
奇怪的是,如果我直接导航到

myurl.com/snippets/auth.php?username=myusername&password=mypassword
它确实设置了另外两个会话变量,但我永远无法使用
index.php
来获取它们


我甚至向它添加了刷新行,以确保它能够拾取它们,并且它得到了
$\u会话['logged']
很好,但不是
['uid']
['level']

您不应该在$\u GET中发送身份验证详细信息。改用$\u POST。您不应该使用md5散列密码。改为使用密码\u散列。另外,在查询中使用绑定参数也是一种很好的做法。您是否记得在任何地方都
session\u start()
登录代码都应该使用POST never GETT?这并不能回答问题,我只有一些提示。a) 不要通过URL查询(GET)发送密码,b)您可以在
$.ajax
中为
数据使用对象,如下所示:
$.ajax({data:{username:''})。还有一些提示:c)您的PHP代码非常不安全。永远不要假设用户输入的数据是安全的,永远不要将变量连接到SQL查询中。如果我决定以
admin'和1=1;的身份登录,会发生什么?您应该使用准备好的语句,请参见:,d)虽然可以使用对字符串进行编码,但实际上应该是对数组或对象进行编码<代码>json编码(数组('status'=>'valid'))
。然后在AJAX回调中执行:
if(result.status==“valid”)
。不应在$\u GET中发送身份验证详细信息。改用$\u POST。您不应该使用md5散列密码。改为使用密码\u散列。另外,在查询中使用绑定参数也是一种很好的做法。您是否记得在任何地方都
session\u start()
登录代码都应该使用POST never GETT?这并不能回答问题,我只有一些提示。a) 不要通过URL查询(GET)发送密码,b)您可以在
$.ajax
中为
数据使用对象,如下所示:
$.ajax({data:{username:''})。还有一些提示:c)您的PHP代码非常不安全。永远不要假设用户输入的数据是安全的,永远不要将变量连接到SQL查询中。如果我决定以
admin'和1=1;的身份登录,会发生什么?您应该使用准备好的语句,请参见:,d)虽然可以使用对字符串进行编码,但实际上应该是对数组或对象进行编码<代码>json编码(数组('status'=>'valid'))
。然后在AJAX回调中执行:
if(result.status=='valid')