是否可以使用 ajax 直接发送 php 会话变量?
Posted
技术标签:
【中文标题】是否可以使用 ajax 直接发送 php 会话变量?【英文标题】:Is it possible to send a php session variable directy with ajax? 【发布时间】:2011-10-13 12:21:10 【问题描述】:我在 index.php 中有这个
<?php
include_once '..\connect.php';
session_start();
if (isset($_SESSION['username']))
$player_name = $_SESSION['username'];
else
header( 'Location: http://localhost/Inventory/index.php' ) ;
exit;
?>
我正在向 request.php 发出 ajax 请求
<?php
//connect to databate and check for errors
$con = mysql_connect ("localhost","root","");
if (!$con)
die ('Could not connect to database: ' . mysql_error());
//select database and check selection
if (!mysql_select_db ("GotA", $con))
die ('Could not select database: ' . mysql_error());
//I have to create this if not it doesnt find the sessions $player_name variable
$player_name = $_POST['name'];
//***Create Player Array**//
$player_info = "SELECT * from players where id = $player_name";
$player_info2 = mysql_query($player_info) or die ('Couldnt get players name');
$player_info3 = mysql_fetch_array($player_info2);
好吧,使用 javascript 发送的变量从数据库中检索数据似乎不安全,难道没有办法直接使用 index.php(会话部分)中的变量吗? 还是仅使用 javascript 传递信息是否安全?
【问题讨论】:
请仔细阅读this question 及其接受的答案。明白它。使用它。 谢谢你们所有的 cmets 和答案,我将通读它们,当我找到解决方案时链接会报告错误 【参考方案1】:为什么不在 request.php 中再次检索会话?
代替:
$player_name = $_POST['name'];
用途:
$player_name = $_SESSION['username'];
还要确保在此之前使用session_start()
。
【讨论】:
对,但我这里不讨论任何 JS,只讨论 PHP。 JS 只是调用一个 PHP 页面,可以访问会话。 Jason,正确的,它可以如果它知道会话 ID 并且您调用session_id(hash)
。只是调用session_start
不会恢复会话,因为 PHP 将 AJAX 视为它自己的唯一会话。
我从来没有为这样的事情使用过 session_id。在过去无数次中,我所说的方式对我来说都很好。
那我可能不正确,我的用法也可能不正确。我很抱歉。
只是为了向这些 cmets 的任何未来读者澄清这一点:用户通过键入 URL 或单击链接发起的 GET
/POST
与 GET
/ 没有什么不同POST
由 XmlHttpRequest 发起。 HTTP是HTTP。 PHP 不会为 AJAX 请求分配自己的会话,因为它不知道请求来自脚本(除非您在 PHP 和 JS 代码中构建了这样做的逻辑)。【参考方案2】:
根据我之前使用 jQuery 的经验,会话仍然适用于 ajax 请求,只要您在被调用脚本的顶部session_start()
应该能够访问会话变量。
【讨论】:
很确定你错了...我 90% 确定我已经能够使用 AJAX 设置/获取会话变量***.com/questions/607673/…【参考方案3】:您的 AJAX 请求虽然来自 JavaScript,但仍然可以访问浏览器的会话状态。你也可以回退到一个 POSTed 变量:
request.php:
<?php
session_start();
// Set $dbuser and $dbpass in a secure configuration file
$dbh = new PDO('mysql:host=localhost;dbname=GotA', $dbuser, $dbpass);
if (isset($_SESSION['username']))
$player_name = $_SESSION['username'];
else
$player_name = $_POST['name'];
$stmt = $dbh->prepare('SELECT * from players where id = :playername');
$stmt->execute(array(':playername' => $player_name));
$result = $stmt->fetchAll();
另一件事是,如果您正在运行多个异步请求,则具有异步会话感知请求可能会导致竞争条件。有关信息,请参阅this article。只要您只读取会话变量而不写入它们(或显式结束会话),那么您应该没问题。 (如果有人对前面的说法有明确的答案,请在 cmets 分享)
【讨论】:
以上是关于是否可以使用 ajax 直接发送 php 会话变量?的主要内容,如果未能解决你的问题,请参考以下文章
会话不适用于 ajaxRequest [如何使用会话变量计算 ajax 请求]