speedphp在控制器的动作里可以用setcookie()么?
发布于:2022-01-17 09:50:54
#1 jy00504445
speedphp在控制器的动作里可以用setcookie()么?用的话要怎么使用?
我的代码是这样的,但完全没有效果。
class login extends spController
{
function index(){
setcookie("TestCookie","test");
dump($_COOKIE);
}
}
输出结果是
Array
(
)
2010-12-16 01:11:39
#2 jake
你的setcookie已经使用正确了,不过在同一个页面,不能setcookie然后就用,因为setcookie是会发送cookie到浏览器,而使用cookie($_COOKIE)是需要再一次从浏览器中读取到COOKIE之后再用的。
所以你测试COOKIE的时候,有两个方法:
1. A页面setcookie,链接到B页面,然后B页面使用cookie($_COOKIE)
2. 用chrome或者firefox,都可以查看cookie存储的。
2010-12-16 08:46:20
#3 jy00504445
回复 2 jake 谢谢!
不过,貌似问题不在这,因为如果是操作成功的话,至少我刷新页面以后,上一次设置的值应该是能读出来的,可是还是为空的。
我的这个问题是在使用session的时候发现每次都会生成新的session,然后查询cookie的值才发现完全没有在cookie中储存session的ID。
我后来又专门做了个测试页,是不在speedphp框架下的独立php页面,然后设置cookie的值,是能正常修改的。
2010-12-16 10:27:09
#4 jake
回复 jake
谢谢!
不过,貌似问题不在这,因为如果是操作成功的话,至少我刷新页面以后,上一次设置的值 ...
jy00504445 发表于 2010-12-16 10:27 
按照你上面的代码,刷新页面后(这是同一个页面),又是执行了一次setcookie("TestCookie","test");,所以cookie值被清空了,建议你“严格”按照我说的方法,在A页面setcookie,B页面读取COOKIE。或者使用浏览器调试功能来查看COOKIE的情况。
2010-12-16 12:11:14
#5 jy00504445
回复 4 jake 你所说的方法我也尝试过了,也是一样的。另外我做了另外一种测试方式:
1、在入口文件中运行setcookie("TestCookie","test1");
2、在控制器的动作中
setcookie("TestCookie","test");
echo $_COOKIE["TestCookie"];
输出结果是test1,也就是说在执行
require(SP_PATH."/SpeedPHP.php");
spRun();
之前的setcookie操作是会生效的,而之后的就没有任何反应
2010-12-16 12:30:45
#6 jake
setcookie的失效,有另外一种可能是在setcookie之前就有输出了。所以你在控制器内可以先用ob_clean();然后再setcookie看看。
ob_clean();
setcookie("TestCookie","test");
当然,这还是要分开两个页面来测试。
2010-12-16 12:38:29
#7 jy00504445
回复 4 jake 问题解决了,谢谢你!
不过,还是不是很明白出什么问题了。
我的spconfig信息是写在一个spConfig.inc.php文件中的,所以在入口中要require("./spConfig.inc.php");
我在测试的php文件中如果加载了这个文件,然后把setcookie写在后面就会出现
Cannot modify header information - headers already sent by (output started at 错误
检查了好久都没找到任何问题,然后重新用记事本新建了个php文件,把spConfig.inc.php里的代码完全复制到这个文件里面,再require这个文件,不知道为什么就不会报错了。然后问题就解决了.....
是文件的编码问题么?
我原本的php文件是用DW新建的
2010-12-16 12:47:12
#8 jake
Cannot modify header information - headers already sent by
这个错误表明了在setcookie之前有什么东西已经发送到浏览器了。
DW新建的文件,可能是UTF8带BOM,而BOM就是文件中多余的东西,它会最早输出到浏览器导致setcookie或者header等函数失败的。你可以用编辑器或记事本另存一下文件变成UTF8不带BOM的就可以。
2010-12-16 12:53:54