PHP会话未写入输出(echo或print_r在外部ajax调用)
我有一些严重的问题调试这个特殊的问题,我希望有人有一个线索,我做错了什么.
我有一个自定义CMS系统工作,使用段落作为构建块,使用Ajax(prototypejs)调用和功能,以给定的顺序解析HTML块,清理它们并将该数据保存在会话变量中的关联数组中. Enduser站点在编辑模式(admin用户登录):路径“/” 在记录状态被验证之后,一个函数处理可编辑的内容并将关联数组保存到会话中,它还启动一些javascript对象来编辑每个段落.数据实际上被保存,我可以使用一个外部脚本来检查这个php脚本是否结束.如果我加载一个新的页面(新的内容),会话被更新为新的数据) 管理员用户使用Inplaceeditor修改段落,此HTML块通过Ajax发送到启动命名会话的php脚本,读取当前会话数据,检查是否应修改,附加或删除段落,并将值重新分配给现有的数组键在$_SESSION.如果我在分配新数据之后将var_dump()o print_r设置为$_SESSION.之后,脚本将回显处理后的html,并且ajax更新调用页面上的原始段落. 此脚本位于/admin/cms/…etc中,表示站点根目录中至少有4个目录. 当脚本结束时,我检查使用相同的会话转储脚本来查看数据是否真的写/提交,但是$_SESSION只有来自调用页面的原始数据. 但是,如果我在$_SESSION数组中添加一个新的键,并在其中放置一些数据,则数据将被更新和写入.如果我不输出这个脚本的东西,只是处理数据和设置会话变量,它也得到更新和写入. 它像$_SESSION数组的一些成员被阻止更新. 我做了什么跟踪这个错误,我确信我没有做错. > 1.- register_globals当然是 最奇怪的是,当我只是处理数据而不输出$_SESSION得到更新好的.但是,如果我以后通过添加输出来修改这个脚本,再试一次,而不是仅仅提供新的(最后)值,我会得到原来的值,首先由调用页面创建的值,有时候在几个倍! PHP不能在脚本之间缓存值,还是没有globlals. 我真的很无知这个系统在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 ?> 真的没什么奇怪的这里….主页代码更简单,没有奇怪的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 更新:我做了深夜测试,发现有些我不明白.请问: 我重新启动了Apache等(谁知道),但没有运气.然后我做了一些非常愚蠢的事情,因为这是一个服务器端的事情.我将浏览器更改为Firefox(使用safari),一切正常!好的,重新检查,回到野生动物园,没有任何作用.两者并肩运行,同样的问题. PHP是服务器端,不同浏览器如何处理代码不同,浏览器可以对apache回滚,请求没有处理或者调用相同的脚本两次,而不通知(检查safaris开发者控制台,脚本只调用一次)?可以safari重新提交数据,因为它“认为”ajax失败?我使用firebug和Safaris开发工具检查标题,没有什么奇怪的,但是当我用safari进行Ajax调用时,调用者页面重新加载数据(Aka conection to server …). 我真的不明白什么
我有一个类似的问题(如果我已经正确理解).脚本运行完毕后,我需要强制会话数据(用于自定义会话驱动程序).可以注册一个关机功能,该功能在脚本完成后运行.
也许这将解决(或帮助你解决)你的问题. http://php.net/manual/en/function.register-shutdown-function.php (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |