Die*_*rro 12 php ajax session session-variables
我在调试这个特殊问题时遇到了一些麻烦,我希望有人知道我做错了什么.
我有一个自定义CMS系统工作,它使用Paragraph作为构建块,使用Ajax(prototypejs)调用和按预定顺序解析HTML块的函数进行更新,清理它们并将这些数据保存在Session变量的关联数组中.用户登录,会话已创建,我可以在我需要的每个页面中检查此会话而不会出现问题.该系统直接在最终网站上运行,因此用户可以实时查看他的更新并按照普通用户的方式浏览网站,但需要进行编辑.所以,这里没什么新鲜的.但这是奇怪的事情.
编辑模式下的最终用户站点(管理员用户已登录):路径"/"
验证记录状态后,函数处理可编辑内容并将关联数组保存到会话中,它还会启动一些javascript对象以编辑每个段落.数据实际上已保存,我可以使用外部脚本检查这个PHP脚本结束后是否存在.如果我加载新页面(新内容),会话更新新数据)
管理员用户使用Inplaceeditor修改段落,此HTML块通过Ajax发送到启动命名会话的php脚本,读取当前会话数据,检查是否应修改,附加或删除段落,并将值重新分配给现有数组键在$_SESSION.如果我在分配新数据之后创建了一个var_dump()o print_r.$_SESSION之后脚本回显处理过的html,ajax更新调用页面上的原始段落.
此脚本位于/admin/cms/...etc中,这意味着站点根目录中至少有4个目录.
当脚本结束时,我检查使用相同的会话转储脚本来查看数据是否真的被写入/提交,但是没有,$_SESSION只有来自调用页面的原始数据.相同的ID,相同的会话名称,相同session_start()但没有数据写入.这整个操作非常快,所以我可能会遇到速度问题,脚本会在session_write_close可以完成之前结束.
但是,如果我向$_SESSION数组添加一个新密钥并在其中放入一些数据,则会更新和写入数据.如果我没有在这个脚本上输出任何内容,只是处理数据和设置会话变量,它也会得到更新和编写.
就像$_SESSION数组的某些成员被阻止更新一样.
我做了什么来跟踪这个错误,我确定我没有做错.
register_globals当然没有了session_name()并且session_start()始终以给定的session_start()在同一页面session_write_close()在会话数据处理后使用.也最奇怪的是,当我只处理没有输出的数据时,$_SESSION可以更新.但是如果我之后通过添加输出并再次尝试来修改此脚本,而不是仅仅显示新的(最后一个)值,我将获得原始值,即在第一个位置由调用页面创建的值,有时在玩了几个之后倍!PHP无法缓存脚本之间的值或?我没有全局化.
我真的很无能为力.这个系统在PHP4.3上运行完美,因为我使用5.3.3两个飞蛾我的用户在哪里调用数据混淆,所以我检查了,是的,有严重的问题.今天我更新到(5.3.6)并且我无法提交此会话值.
通过Ajax调用的脚本代码:
<?
session_cache_limiter('nocache');
session_name("CMS_ses");
session_start();
include('../htmLawed/htmLawed.php');
include("utils_cms.php");
include("../../../php/utils_array.php");
$value=$_POST['value'];
$editorId=$_POST['editorId'];
$clase=$_POST['clase'];
$editorId=str_replace("pre","",$editorId);
$value=html_entity_decode(stripslashes($value),ENT_QUOTES);
if (strlen(trim($value))==0)
{
die();
}
$value="<div id=\"$editorId\" class=\"$clase\">$value</div>";
$newXHTML=$value;
$retorno=CMS_nuevoBloque($newXHTML,$editorId);
$_SESSION['data']['CMSeditores']=$retorno[1];
$_SESSION['data']['CMScont']=$retorno[2];
session_write_close();
print_r($retorno[0]); //Offending part...without everything works
?>
Run Code Online (Sandbox Code Playgroud)
这里真的没什么奇怪的....主页面代码更简单,没有奇怪的php指令等.
这是调用者页面的标题
include 'php/db.php';
$len=$_GET['len'];
$sec=$_GET['sec'];
$cont=$_GET['cont'];
$admfin=$_GET['admfin'];
$fecha=$_GET['fecha'];
$token=$_GET['token'];
$cur=$_GET['cur'];
$PHP_SELF=$_SERVER['PHP_SELF'];
session_cache_limiter('nocache');
session_name("CMS_ses");
session_start();
$passvar='';
unset($adm);
if ((!empty($_SESSION['cms_logged'])) and (!isset($admfin)) )
{
$nivelpermisos=$_SESSION['cms_logged_group'];
$useractual=$_SESSION['cms_logged'];
$adm=1;
}
elseif (empty($_SESSION['cms_logged']))
{
unset($useractual);
}
//.........rest of the code
Run Code Online (Sandbox Code Playgroud)
更新:我做了深夜测试并找到了一些我不理解的东西.请说:它不仅与Sessions有关,还与Mysql Querys有关.相同的代码,但不是尝试写入$_SESSION数组,而是使用session_id对Innodb表进行了简单的更新.当我输出一些代码时,更新确实执行,(我可以输出查询字符串,没有mysql_error()或没有通知)问题,但检查数据库行不会更新.如果脚本和Query确实被提交,则输出输出.只有常见的事情是会话开始并输出.
我重启Apache等等(谁知道)但没有运气.然后我做了一些非常愚蠢的事情,因为这是服务器方面的事情.我将浏览器更改为Firefox(使用safari),一切正常!好的,重新检查,回到野生动物园,没有任何作用.两者并排,同样的问题.PHP是服务器端,不同的浏览器如何处理不同的代码,浏览器可以说是apache回滚,请求没有处理或调用相同的脚本两次而不通知(检查过safaris开发人员控制台并且脚本只调用一次)?safari可以静默地重新提交数据,因为它"认为"ajax失败了吗?我使用firebug和Safaris开发人员工具检查了标题,没什么奇怪的,但每当我使用safari进行Ajax调用时,调用者页面重新加载数据(Aka连接到服务器......).
我什么都不懂.
小智 0
我也遇到过类似的问题,但几年前就出现在 ie 中。IE 以自己的方式操作标头,这会导致奇怪的 php 错误,您可以在 php.net 档案中找到这些错误。
@Diego Pino Navarro,请参阅此帮助页面并找到 Safari 及其 php 问题。
我还发现“Safari“忘记”http 身份验证的登录信息”。