【问题标题】:session_start returns true but does not work when session_name contains spacesession_start 返回 true 但当 session_name 包含空格时不起作用
【发布时间】:2013-09-08 22:11:30
【问题描述】:

谁能解释这是否是 PHP 的正确行为,我期待 session_start() 返回 false 并收到警告说 session_name 包含非法字符。

要重现的代码:

<?php
session_name('m m');
var_dump(session_start());

if(!isset($_SESSION['count'])) {
     $_SESSION['count'] = 0;
}
else {
     $_SESSION['count']++;
}

echo session_name();
echo $_SESSION['count'];

运行一次:

bool(true) m m0

重新加载页面:

bool(true) m m0

应该是(如果会话正常):

bool(true) m m1

session_start() 返回 true,表示会话已开始。 $_SESSION['count'] 表示不起作用。会话名称中的非法字符没有警告。

我在手册页上找不到任何提示,也找不到会话有效字符的定义。

【问题讨论】:

  • var_dump(session_start());放在最上面
  • 你必须在session_start()之前调用session_name()

标签: php session


【解决方案1】:

PHP 生成如下内容:

Set-Cookie: m+m=unttot9siteipcsrc0r064hn37; path=/

...浏览器 (Firefox/23) 将其发回:

Cookie: m+m=unttot9siteipcsrc0r064hn37

到目前为止一切顺利。但随后 PHP 会生成一个新的会话 ID:

Set-Cookie: m+m=7tmi7kd8n27ef3qdk5q706gk85; path=/

这是一个错误吗?我会说不是因为your session name is clearly invalid

会话名称引用会话的名称,该名称用于 cookie 和 URL(例如 PHPSESSID)。 它应该只包含 字母数字字符;它应该简短且具有描述性(即 对于启用了 cookie 警告的用户)。如果指定了名称,则 当前会话的名称更改为其值。

警告

会话名称不能仅由数字组成,必须至少包含一个字母。否则每次都会生成一个新的会话 ID。

如果你遵守规则,它会按预期工作:

session_name('mxm');

总结一下:

  • 别猜了,使用浏览器开发者控制台和其他工具
  • 阅读文档 ;-)

编辑:刚刚注意到你这样说:

我在手册页上找不到任何提示,也找不到会话有效字符的定义。

我在session_name() 的手册页中找到了该信息。

【讨论】:

  • 是的。我阅读了手册页,但显然不够好...thanx。我也期待一个警告,指出“session_name 中的无效字符,仅使用 [a-z09-]”,但我没有得到,也无法弄清楚原因。无论如何,很好的答案。
  • @MikaelRoos 能够确定session_name() 是否成功是有意义的。更有意义的是,PHP 不会以无效的会话名称正常进行。但这就是我们又爱又恨的 PHP ;-)
【解决方案2】:

session_name() 中的空白将不起作用。

session_name('m m');

session_name('mm');

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2018-10-10
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多