2017-04-26 75 views
0

我很困惑,并希望得到一些帮助。我有一个index.php,它从一开始就开始会话(session_start();)。从浏览器中,我看到一个cookie PHPSESSID是使用会话的ID创建的。PHP会话似乎只能被称为两次后才工作

但是,在文件夹/ var/lib/php/sessions(session.save_path)中,没有任何内容。

如果我在index.php中声明任何会话变量,它们不会通过session_start()传递给其他php脚本(甚至不会使用session_id(the-whatever-PHPSESSID); session_start();)。但是,如果我再次调用session_start(),我得到的会话功能正如我以为它应该(并在session.save_path中,我可以找到创建的会话ID的引用)。

这对我来说是相当困惑的,也许是因为错误,我可能不会解释发生了什么。如果您需要更多信息,请让我知道!

以下是我有:

的index.php

<?php 
session_start(); 
$_SESSION['sessionid'] = session_id(); 
$sessionid = "'".$_SESSION['sessionid']."'"; 
$_SESSION['maxQueries'] = 1883; //11*171 + 2 
$_SESSION['cCount'] = 0; 
$_SESSION['queries'] = 0; 
?> 

有没有一种形式(的index.php),其中有一个PHP文件(captcha code by Simon Jarvis)创建的验证码键也开始这用session_start()。该验证码可以是这样产生的:

(的index.php)

<div class="field"> 
<input type="checkbox" id="human" name="human" onclick="captcha();"/> 
<label for="human" class="humancb">I am human</label> 
</div> 
<div id = "captcha"></div> 

(JavaScript)的

if(document.getElementById("human").checked){ 
document.getElementById("captcha").innerHTML = "<img src='./assets 
/php/captcha_code_file.php?rand="+ Math.random() +"' id='captchaimg' > 
</img>";} 

当我加载的index.php我看到一个PHPSESSID - 没有在/ var/lib中/ PHP /会话。当我点击验证码复选框(并且调用了captcha_code_file.php)时,会话正常工作。我究竟做错了什么?我非常失望的是什么?

谢谢!

编辑1:我想我设法查明了这个问题。正如@Hans指出的,罪魁祸首是$ sessionid变量。当我提交表单时,我正在使用它将其作为输入传递给javascript函数。然后,我在xhr post请求中使用javascript var'sessionid'到一个php页面。所有的PHP页面都有session_start(),并且它们的session_id也通过了javascript。回想起来,我一点也不确定我可以提供一个理由说明为什么我这样做,但无论如何,当我省略了那部分,并且javascript在xhr中发送了与会话无关的所有变量时,问题似乎走开。再次,我不知道我说的这句话很好,我想我应该开始在脸上拍几下自己:D ...

Edit2:如果我可以选择两个答案,我都会很喜欢这个答案。这将反映真相。然而,汉斯,请理解,即使你在某种意义上更接近(显示罪魁祸首在这里),但这一切都是完全发生的 - 或者我认为 - 不同的原因。这就是我选择Walther的答案的原因。如果可以的话,我会选择两者。

非常感谢您的帮助!!!!!!

回答

1

从官方文档:

会议遵循一个简单的工作流程。当会话开始时,PHP将 使用传递的ID(通常从 会话cookie)检索现有会话,或者如果没有会话通过,它将创建新的 会话。 PHP会在会话启动后用任何会话 数据填充超全局$ _SESSION。当PHP关闭时, 会自动将超级全局$ _SESSION的内容, 序列化,并使用会话保存处理程序将其发送到存储器。

=>在完成执行当前脚本而不是第一次session_start调用时,保存到文件发生在请求之间。

http://php.net/manual/en/session.examples.basic.php

+0

非常感谢@walther!然而,你能向我解释为什么我在index.php中声明的会话变量没有传递给其他脚本? – moijoune

+1

@moijoune,基于你的描述,没有。会话对我来说没有任何问题,所以它对你的服务器设置或者你的代码来说肯定是一些小问题。有时检查变量的正确拼写可以解决长达一小时的头痛问题。你可以发布一个最小的可执行代码,清楚地显示你的问题,所以我们可以重现它吗? – walther

+0

谢谢!!!当然!请稍等一下!! – moijoune

1

$的sessionid = $ _SESSION [ '的sessionid'];是正确的说法不是

$ sessionid =“'”。$ _ SESSION ['sessionid']。“'”;

试试这个调整,看看会发生什么

+0

非常感谢@Hans!这是用于别的东西,但我明确表达你的观点。 – moijoune

相关问题