mac,mamp,php,setcookie,cookie读不出,写不住,写入失败,读出失败,失效。等的问题。可能的解决办法。
前一段时间,有朋友让我帮他改php的一个项目。本人小白一个,在本地运行的时候,碰到用ajax调用写入setcookie失败。一般的代码在服务器上运行正常。
到处搜索,未果。
有人说setcookie前不能有输入,解决 :把setcookie之前的程序检查一下,是否在PHP代码<?php 之前有回车或者空格。或者:在程序的最开头执行一次 ob_start();
我检查了一遍,没看到问题。
问朋友,他说可能是本地host需要修改。我用的是mamp环境,按理是傻瓜式的,根本就不用在环境搭建上废脑的。后来还是设置了一个两个字母的域名,还是不行。
(注:mac系统下,host的修改路径是双击Macintosh HD,找到.etc文件夹,就看到host了。)
浏览器端也看到没有限制cookie写入。
还是说重点吧,没有写过博客,不擅长写文章。
是文件头bom引起的,我把整站都刷了一遍。去除了所有文件的bom头,然后,然后,就好了。
<?php
$auto = 1;
checkdir('项目地址');
function checkdir($basedir){
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if($file{0} == '.')
{
continue;
}
if ($file != '.' && $file != '..'){
if (!is_dir($basedir."/".$file)) {
echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
}else{
$dirname = $basedir."/".$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("<font color=red>BOM found, automatically removed.</font>");
} else {
return ("<font color=red>BOM found.</font>");
}
}
else return ("BOM Not Found.");
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
这段不是我写的,不知道是哪位大神写的,忘了是在哪复制来的。想也不是没有公德心,哈哈,人家帮了我,应该第一时间感谢。或许我已经留了感激之语了。不过确实想不起来在哪翻到了。谢谢代码的原作者。
反馈给你们,希望能帮你们解决问题。我那会用了整整三天。你们懂的,头很大。要疯的感觉。