用JavaScript读取PHP会话变量


Read PHP session variables in JavaScript

我想将PHP会话变量的值发送到同一文件中的JavaScript。我试过这个代码,但它不起作用。请帮我解决这个问题。

这是我正在尝试的:

<?php
session_start();
?>
<h2>
<?php
echo "Welcome, " .$_SESSION["name"];
?>
</h2>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="chat.js"></script>
</head>
<body onload="init();">
<noscript>
Your browser does not support Javascript!!
</noscript>
<!-- Some HTML Code -->
<div>
    <a href="../index.php">Go back</a>
    <a href="../home.php?SignOut" id= "left">Sign Out</a>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#left").click(function() {
                //remove user_name. Set action: left
                var user_name = <?php echo json_encode($_SESSION["name"]) ?>;
                $.post('php/users.php', {user_name: user_name, action: 'left' });
            });
});
</script>
</div>  
</body>
</html>

这是我的users.php文件

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];
    if($action == 'joined') {
        user_joined($user_name);
    }
}

else if(isset($_POST['action'])) {
    $action = $_POST['action'];
    if($action == 'list') {
        foreach(user_list() as $user) {
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }
}
function user_left() {
    $servername = "";
    $username = "";
    $password = "";
    $dbname = "";
    //Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }
    $user_name = $_SESSION["name"];

    $sql = "DELETE FROM online_users WHERE user_name = '$user_name'";
    $query = "DELETE FROM chat WHERE to_user = '$user_name'";
    $result = $conn->query($query);
    if($conn->query($sql) === TRUE) {
        echo "Record deleted successfully";
    } else {
        echo "Error in deleting: " . $sql. "<br>" . $conn->error;
    }

    $conn->close();
}

首先,您必须查看调试控制台的错误(通常可以用F12键打开)。我在你的代码中看到一个问题:php echo语句必须在外部引号中,因为它在JS中被解释为字符串:

var user_name = "<?php echo $_SESSION["name"] ?>";

打开控制台,您将看到错误所在的确切行和字符。

将变量从PHP传递到JS的另一种方式是cookie。

原来是一个愚蠢的错误。抱歉打扰你们了。

我发现了错误。我能够在JS中阅读php会话(当我在chrome上检查元素时发现)。但是,我想这不是必需的,我只是使用了

$.post('php/users.php', { action: 'left' }); 

我没有信任用户名的post参数,而是使用了会话变量。主要问题是我无法删除user。php文件中的用户名这是因为我使用了

$.post('php/users.php', { action: 'left' }), 

我实际上没有在post参数中发送任何user_name。我对user_left函数的调用是在if条件下,我检查

if (isset $_POST[user_name] && $_POST[action]), 

,因此,我不能调用user_left函数

这是我之前的代码

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];
    if($action == 'joined') {
        user_joined($user_name);
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }
}
else if(isset($_POST['action'])) {
    $action = $_POST['action'];
    if($action == 'list') {
        foreach(user_list() as $user) {
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
}

我把它改成:

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];
    if($action == 'joined') {
        user_joined($user_name);
    }
}

else if(isset($_POST['action'])) {
    $action = $_POST['action'];
    if($action == 'list') {
        foreach(user_list() as $user) {
            //echo $user, '<br />';
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }
}

在主PHP中,修改:

var user_name = <?php echo json_encode($_SESSION["name"]) ?>;
$.post('php/users.php', {user_name: user_name, action: 'left' });

:

$.post('php/users.php', { action: 'left' });

然后在users.php中修改:

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];
    if($action == 'joined') {
        user_joined($user_name);
    }
}

:

session_start();
if(isset($_SESSION['name'], $_POST['action'])) {
    $user_name = $_SESSION['name'];
    $action = $_POST['action'];
    if($action == 'joined') {
        user_joined($user_name);
    }
}

为什么?因为已经有一个用户登录的会话,所以user_name在会话中。获取它最安全的地方永远是会话。如果您将会话中的user_name打印到HTML/Javascript代码中,并通过POST参数将其发送回服务器,并且信任该参数,那么用户可以在浏览器的开发人员工具(或其他方式)中将用户名更改为其他人的user_name以注销他们(甚至可以通过user_joined方法在聊天中模拟他们)。你会制造一个安全漏洞。因此,不要发送user_name往返:只需从服务器端的会话中读取它。

同时,要确保是$_SESSION["name"]还是$_SESSION["user_name"]