暂时不搞.net,对PHP有兴趣了,开始边学PHP边搞. 入门阶段匪夷所思的事情真多,还好我有心理准备. 昨天夜里遇到个问题,在PHP里session_start() 总是报错:
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at D:wwwrootEZineTest.php:1) in D:wwwrootEZineTest.php on line 1
上网搜寻N多,发现关于其解释和解决之道有三种:
- 在session_start(); 语句之前不能有其他输出 (这个主要状况是报:Cannot send session cache limiter headers already sent)
- 没有设置session 保存路径,需要修改php.ini中的session.save_path = “C:/phpsession” [后边的路径自己设置,并且要保证存在。php.ini 文件一般应位于系统盘/Windows 目录下面]
- 修改php.ini中的session.auto_start = 0 为 session.auto_start = 1
我那个郁闷的,第一条,我的session_start();语句是写在第一行;
第二条,也有设置
第三条,这个我不想设置为自动.
我就郁闷了,由于我是在家里的服务器机器上测试的,所以怀疑是配置的问题,把它的PHP.INI和机房的配置对比了一下,发现没有可疑之处. 最后把写的另一个有session的PHP拿来测试了下,居然可用! 证明不是配置问题了,最终索性把出问题的文件删的只剩一行,测试,居然还报错. 嘿嘿,范围缩小到这里,我突然想到,莫非是文件基因问题?! 检查一下,果然——UTF8编码的PHP源文件,无法session_start(); 而ANSI的就可以session_start();
嘿嘿,问题可以解决了:
方法1.把所有文件全部用非UTF8编码;
方法2.让PHP引擎支持UTF8编码的源文件(一下资料引自:http://phorum.study-area.org/index.php/topic,36484.html)
****** 網 站 全 面 採 用 UTF-8 方法. ******
1. 用 vi /etc/httpd/conf/httpd.conf 設定Apache中的語系為:( (記得restart)
AddDefaultCharset UTF-82. 用 vi /etc/php.ini 設定php中的語系為:( (記得restart)
default_charset = “utf-8”3. 用 vi /etc/my.cnf 設定MySQL中的語系為:( (記得restart)
[mysqld]
init_connect=’SET NAMES utf8′
default-character-set=utf8
[client]
default-character-set = utf84. 建立資料庫時選擇語系: (記得清除DB Cache)
DROP DATABASE IF EXISTSaa
;
CREATE DATABASEaa
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USEaa
;CREATE TABLE IF NOT EXISTS
aat
(
id
char(1) NOT NULL default ‘1’,
myStr
varchar(200) default NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;5. 用UltraEdit(v11.20a版) 轉換所有ANSI格式的php檔案轉化為UTF-8格式:
File –> Conversions –> ASCII to UTF-8 (Unicoding Editing)
( 在UltraEdit中按Advanced –> configuration –> File Handling
–> Unicode/UTF-8 Detection –> 剔選Auto detect utf-8 files )
如有需要時,可執行Remove BOM.php. 當用WinXP的Notepad將php檔由ANSI轉為UTF-8時,
因檔頭有BOM,會引起排版問題,故必須移除,執行Remove BOM.php即可自動移除.
Remove BOM.php可由以下網址下載:
http://www.hoyo.idv.tw/hoyoweb/document/view.php?sid=13&author=hoyo&status=view6. 在php檔中必須加入:
- <html><head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- </head><body>
7. 在連接DB的檔中必須加入3行mysql_query才ok:
$host=”localhost”; $DBname=”aa”;
$user= “root”; $passwd = “”;
$link = mysql_connect($host,$user,$passwd) or die (“Fail”);
$db = mysql_select_db($DBname, $link) or die (“Fail”);
// 要在真正query DB取出資料前,加入以下3行
mysql_query(“SET NAMES ‘utf8′”);
mysql_query(“SET CHARACTER_SET_CLIENT=utf8”);
mysql_query(“SET CHARACTER_SET_RESULTS=utf8”);
$sql = “select * from aat where crid=’1′”;
$rows = mysql_query($sql);8. 在php檔中, 如有需要須注意: [Optional]
運用htmlentities和htmlspecialchars時,要似如下:
$chars = htmlentities($chars,ENT_QUOTES,”UTF-8″);
$chars = htmlspecialchars($chars,ENT_QUOTES,”UTF-8″);
並且在顯示前要用
$chars = html_entity_decode($chars,ENT_QUOTES,”UTF8″);
如有用過addslashes()或mysql_real_escape_string()記得用以下:
$chars = stripslashes($chars);
如有需要可以用以下function將不同編碼轉換:
$chars = iconv(‘Big5′,’UTF-8’,$chars); //由Big5轉為UTF-8
后记:如果使用记事本编辑UTF8的文件,保存的时候会自动加上BOM头,这个BOM头是3个字节的不可见字符,会使PHP执行的时候过早输出内容。
解决方案:删除BOM头,可以使用UE这个文本编辑器另存为无BOM头的UTF8文本,也可以创建这样一个专门去BOM头用的PHP,放到网站根目录执行一次:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php //remove the utf-8 boms //by magicbug at gmail dot com if (isset($_GET['dir'])){ //config the basedir $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto = 1; checkdir($basedir); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { 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); } ?> |
你说的很对 是编码问题 有的时候header() 也会 出现这个 问题
不过我记得我使用过UTF-8 也可以 不过瞎乱搞的 一样出错 ANSI 一样的 输出的时候 设置下 utf-8编码就行 那么打开后还是utf-8
你的办法复杂了 没有那么麻烦 学会很好的使用header
header(“content-type:text/html; charset=utf-8”); 这样就行 加一个就行了 下面不用老加
有空也去我站 指点下 我 不过我日记还不多
我现在就用ANSI的搞,把charset设置为GB2312的了.
其实ANSI写PHP源码是不影响输出字符集的,只是,在源码里不能静态地出现中文字符.
鼠标胸能不能提供 这个http://www.mousebomb.org/download/download2.html
这个程序的源程序给我啊…..
@露露:那个源码已经过期了,是FLEX2时代的….