PHP 即使在同一页面上,会话变量也不会更新
PHP Session Variables not updating even on same page
我想从我的网页写入(通过 ajax 异步)到 SQL table,使用生成的值作为唯一键。稍后(可能是 1 分钟或 1 天,但在同一浏览器会话中)从另一个页面,我希望能够更新该 SQL 记录。我可以在 url 中传递键值,但更喜欢使用会话变量。为了避免另一个网页破坏会话的可能性,我尝试使用自定义 cookie(不是 PHPSESSID),但会话变量没有更新。
为了简化,我从 ajax 和 运行 直接从我的浏览器中取出了代码。没有错误或消息。
下面是两段代码:page1.php
<?php
if(isset($_COOKIE["gcpp_imp"])){$impressionId=$_COOKIE["gcpp_imp"];}
else{$impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7);
setcookie("gcpp_imp", $impressionId, 0, "/");}
session_name("gcpp_imp");
session_id($impressionId);
session_start();
$_SESSION["Test"] = "Hello";
if(isset($_SESSION["Number"])){
$_SESSION["Number"] = $_SESSION["Number"]+1;
}
else{
$_SESSION["Number"] = 1;
}
echo "PAGE 1<br>";
echo "session_save_path = ".session_save_path()."<br>";
if (is_writable(session_save_path())) {
echo "Session path '".session_save_path()."' is writable for PHP!<br>";
}
else {
echo "Session path '".session_save_path()."' is not writable for PHP!<br>";
}
echo "session_name = ".session_name()."<br>";
echo "session_id = ".session_id()."<br>";
echo "session_status = ".session_status()."<br>";
echo "session_Test = ".$_SESSION["Test"]."<br>";
echo "session_Number = ".$_SESSION["Number"]."<br>";
?>
和page2.php
<?php
session_name("gcpp_imp");
session_id($_COOKIE["gcpp_imp"]);
session_start();
echo "PAGE 2<br>";
echo "session_save_path = ".session_save_path()."<br>";
if (is_writable(session_save_path())) {
echo "Session path '".session_save_path()."' is writable for PHP!<br>";
}
else {
echo "Session path '".session_save_path()."' is not writable for PHP!<br>";
}
echo "session_name = ".session_name()."<br>";
echo "session_id = ".session_id()."<br>";
echo "session_status = ".session_status()."<br>";
echo "session_Test = ".$_SESSION["Test"]."<br>";
echo "session_Number = ".$_SESSION["Number"]."<br>";
?>
来自 page1.php
的输出
PAGE 1
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test = Hello
session_Number = 1
来自 page2.php
的输出
PAGE 2
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test =
session_Number =
这些页面都是 运行 来自 https,没有子域,来自同一文件夹。我的服务器是 Hostiso 的 VPS 共享主机,运行ning PHP 版本 5.6.40。
phpinfo.php 显示 session.gc_divisor = 0,session.gc_maxlifetime = 2880(我想增加这个)和 session.gc_probability = 0.
当我刷新 page1.php 时,输出保持不变。所以 cookie gcpp_imp 只设置一次,key/session_id $impressionId 只生成一次,我可以在浏览器中看到 cookie 和值。但是 $_SESSION["Number"] 没有在 page1.php 中更新并且会话变量也没有在 page2.php.
中显示
我错过了什么?
改变session_start()的位置;
它应该是任何页面的第一行。
第 1 页
session_start(); <-----
session_name("gcpp_imp");
session_id($impressionId);
第 2 页
session_start(); <-----
session_name("gcpp_imp");
session_id($_COOKIE["gcpp_imp"]);
答案是"the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!":见https://www.php.net/manual/en/function.session-id.php
我正在用 $impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7) 生成我的 session_id()
产生格式为 Imp1568485583.309708 的字符串
一旦我删除了小数点,它就起作用了!
我花了 3 天的时间来解决这个问题,我一发帖就得到了答案。
我想从我的网页写入(通过 ajax 异步)到 SQL table,使用生成的值作为唯一键。稍后(可能是 1 分钟或 1 天,但在同一浏览器会话中)从另一个页面,我希望能够更新该 SQL 记录。我可以在 url 中传递键值,但更喜欢使用会话变量。为了避免另一个网页破坏会话的可能性,我尝试使用自定义 cookie(不是 PHPSESSID),但会话变量没有更新。
为了简化,我从 ajax 和 运行 直接从我的浏览器中取出了代码。没有错误或消息。
下面是两段代码:page1.php
<?php
if(isset($_COOKIE["gcpp_imp"])){$impressionId=$_COOKIE["gcpp_imp"];}
else{$impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7);
setcookie("gcpp_imp", $impressionId, 0, "/");}
session_name("gcpp_imp");
session_id($impressionId);
session_start();
$_SESSION["Test"] = "Hello";
if(isset($_SESSION["Number"])){
$_SESSION["Number"] = $_SESSION["Number"]+1;
}
else{
$_SESSION["Number"] = 1;
}
echo "PAGE 1<br>";
echo "session_save_path = ".session_save_path()."<br>";
if (is_writable(session_save_path())) {
echo "Session path '".session_save_path()."' is writable for PHP!<br>";
}
else {
echo "Session path '".session_save_path()."' is not writable for PHP!<br>";
}
echo "session_name = ".session_name()."<br>";
echo "session_id = ".session_id()."<br>";
echo "session_status = ".session_status()."<br>";
echo "session_Test = ".$_SESSION["Test"]."<br>";
echo "session_Number = ".$_SESSION["Number"]."<br>";
?>
和page2.php
<?php
session_name("gcpp_imp");
session_id($_COOKIE["gcpp_imp"]);
session_start();
echo "PAGE 2<br>";
echo "session_save_path = ".session_save_path()."<br>";
if (is_writable(session_save_path())) {
echo "Session path '".session_save_path()."' is writable for PHP!<br>";
}
else {
echo "Session path '".session_save_path()."' is not writable for PHP!<br>";
}
echo "session_name = ".session_name()."<br>";
echo "session_id = ".session_id()."<br>";
echo "session_status = ".session_status()."<br>";
echo "session_Test = ".$_SESSION["Test"]."<br>";
echo "session_Number = ".$_SESSION["Number"]."<br>";
?>
来自 page1.php
的输出PAGE 1
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test = Hello
session_Number = 1
来自 page2.php
的输出PAGE 2
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test =
session_Number =
这些页面都是 运行 来自 https,没有子域,来自同一文件夹。我的服务器是 Hostiso 的 VPS 共享主机,运行ning PHP 版本 5.6.40。
phpinfo.php 显示 session.gc_divisor = 0,session.gc_maxlifetime = 2880(我想增加这个)和 session.gc_probability = 0.
当我刷新 page1.php 时,输出保持不变。所以 cookie gcpp_imp 只设置一次,key/session_id $impressionId 只生成一次,我可以在浏览器中看到 cookie 和值。但是 $_SESSION["Number"] 没有在 page1.php 中更新并且会话变量也没有在 page2.php.
中显示我错过了什么?
改变session_start()的位置; 它应该是任何页面的第一行。
第 1 页
session_start(); <-----
session_name("gcpp_imp");
session_id($impressionId);
第 2 页
session_start(); <-----
session_name("gcpp_imp");
session_id($_COOKIE["gcpp_imp"]);
答案是"the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!":见https://www.php.net/manual/en/function.session-id.php 我正在用 $impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7) 生成我的 session_id() 产生格式为 Imp1568485583.309708 的字符串 一旦我删除了小数点,它就起作用了!
我花了 3 天的时间来解决这个问题,我一发帖就得到了答案。