我想将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"]
。