是否可以使用Javascript设置PHP会话变量?
答案 0 :(得分:27)
在JavaScript中:
jQuery('#div_session_write').load('session_write.php?session_name=new_value');
在session_write.php文件中:
<?
session_start();
if (isset($_GET['session_name'])) {$_SESSION['session_name'] = $_GET['session_name'];}
?>
在HTML中:
<div id='div_session_write'> </div>
答案 1 :(得分:19)
会话存储在服务器端,因此您无法从JavaScript添加值。您获得客户端的所有内容都是包含id的会话cookie。一种可能性是将AJAX请求发送到服务器端脚本,该脚本将设置会话变量。 jQuery的.post()
方法示例:
$.post('/setsessionvariable.php', { name: 'value' });
当然,你应该对暴露这样的剧本保持谨慎。
答案 2 :(得分:7)
如果您想允许客户端操纵持久性数据,那么最好只使用cookie。这就是Cookie的设计目标。
答案 3 :(得分:3)
或纯js,另请参阅StackOverflow: JavaScript post request like a form submit
但为什么要尝试用js设置$ _session?任何JS变量都可以由玩家修改 一些第三方工具(firebug),因此任何玩家都可以修改$ _session []!并且PHP无法给js任何密码(甚至[滚动]加密)返回,它都是可见的。 Jquery或AJAX无法帮助,它最终都是js。
这在网络游戏设计中经常发生。 (也许有点博弈论?请原谅我,我有一个主人并且喜欢把理论用到:))就像在crimegameonline.com,我 使用PHP初始化一个小游戏难题,将初始板保存在$ _SESSION ['foo']中。 然后,我使用PHP [make html]显示最初的拼图开始。然后,当玩家移动时,js接管,观看按钮和修改元素xy。我不想玩客户服务器(比如WOW)并问服务器'嘿,我的播放器想要转移到xy,我该怎么办?'。这是很多带宽,我不想要涉及的服务器。
每次玩家出错(或死亡)时我都可以发送POST。播放器可以阻止传出的POST(并更改本地JS变量以使其忘记输出计数)或只是修改传出的POST数据。是的,人们会这样做,特别是如果涉及真钱的话。
如果游戏很小,您可以发送更新每次移动(按钮点击),单向,以及最后两次移动的后期变量。然后,服务器完整性检查$ _SESSION ['allMoves']中的last和cats new。如果游戏规模庞大,您可以发送所有先前移动的“中途”更新,并查看它是否与最终更新列表中的匹配。
然后,在js认为我们获胜后,添加或修改按钮以更改页面:
document.getElementById('but1').onclick=Function("leave()");
...
function leave() {
var line='crimegameonline-p9b.php';
top.location.href=line;
}
然后新页面的PHP查看$ _SESSION ['init']并播放每个 $ _SESSION ['allMoves']看看它是否真的是赢家。服务器(PHP)必须确定它是否真的是赢家,而不是客户端(js)。
答案 4 :(得分:1)
您无法直接操作Javascript中的会话值 - 它们只存在于服务器上。
您可以通过使用AJAX调用让Javascript在会话中获取和设置值。
另见
答案 5 :(得分:1)
设置会话变量的一种简单方法是将请求发送到另一个PHP文件。这里不需要使用Jquery或任何其他库。
考虑我有 index.php 文件我正在创建SESSION
变量(比如说$_SESSION['v']=0
)如果没有创建SESSION
,否则我会加载其他文件
代码是这样的:
session_start();
if(!isset($_SESSION['v']))
{
$_SESSION['v']=0;
}
else
{
header("Location:connect.php");
}
现在在 count.html 我想将此会话变量设置为1。
count.html
中的内容function doneHandler(result) {
window.location="setSession.php";
}
在 count.html javascript部分,将请求发送到另一个PHP文件(例如setSession.php
),我可以访问会话变量。
所以在 setSession.php 中会写
session_start();
$_SESSION['v']=1;
header('Location:index.php');
答案 6 :(得分:0)
不可能。因为JavaScript是客户端而会话是服务器端。要执行与PHP会话相关的任何操作,您必须转到服务器。
答案 7 :(得分:0)
这是一个你不想做的代码示例..
<input type="hidden" value="..." name="putIntoSession">
..
<?php
$_SESSION["somekey"] = $_POST["putIntoSession"]
?>
现在攻击者只需更改putIntoSession的值并提交表单十亿次。繁荣!
如果您采用创建AJAX服务的方法来执行此操作,您将需要确保强制执行安全性以确保无法重复请求,您正在截断接收的值,并执行某些操作基本数据验证。
答案 8 :(得分:0)
我使用 Ajax 解决了这个问题。我要做的是对PHP页面进行ajax调用,传递的值将保存在会话中。
我要向您展示的示例,我要做的是,当您更改要在数据表中显示的项目数的值时,该值将保存在会话中。
$('#table-campus').on( 'length.dt', function ( e, settings, len ) {
$.ajax ({
data: {"numElems": len},
url: '../../Utiles/GuardarNumElems.php',
type: 'post'
});
});
GuardarNumElems.php 如下:
<?php
session_start();
if(isset ($_POST['numElems'] )){
$numElems = $_POST['numElems'];
$_SESSION['elems_table'] = $numElems;
}else{
$_SESSION['elems_table'] = 25;
}
?>