phpphp 浏览器器输出问题?

我用php输出了这两个完全一样的html文件,可是在浏览器中的表现却完全不一样,救命!!
[问题点数:50分,结帖人yelosheng]
我用php输出了这两个完全一样的html文件,可是在浏览器中的表现却完全不一样,救命!!
[问题点数:50分,结帖人yelosheng]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2009年7月 PHP大版内专家分月排行榜第三
2009年10月 PHP大版内专家分月排行榜第二2009年9月 PHP大版内专家分月排行榜第二2009年7月 PHP大版内专家分月排行榜第二2008年1月 PHP大版内专家分月排行榜第二2007年8月 PHP大版内专家分月排行榜第二2007年5月 PHP大版内专家分月排行榜第二2007年3月 PHP大版内专家分月排行榜第二
2009年11月 PHP大版内专家分月排行榜第三2007年7月 PHP大版内专家分月排行榜第三2007年4月 PHP大版内专家分月排行榜第三2007年1月 PHP大版内专家分月排行榜第三
2009年10月 PHP大版内专家分月排行榜第二2009年9月 PHP大版内专家分月排行榜第二2009年7月 PHP大版内专家分月排行榜第二2008年1月 PHP大版内专家分月排行榜第二2007年8月 PHP大版内专家分月排行榜第二2007年5月 PHP大版内专家分月排行榜第二2007年3月 PHP大版内专家分月排行榜第二
2009年11月 PHP大版内专家分月排行榜第三2007年7月 PHP大版内专家分月排行榜第三2007年4月 PHP大版内专家分月排行榜第三2007年1月 PHP大版内专家分月排行榜第三
2009年4月 总版技术专家分月排行榜第一
2009年11月 Linux/Unix社区大版内专家分月排行榜第一2009年6月 Linux/Unix社区大版内专家分月排行榜第一2009年4月 C/C++大版内专家分月排行榜第一2009年3月 C/C++大版内专家分月排行榜第一2009年3月 Linux/Unix社区大版内专家分月排行榜第一2009年2月 Linux/Unix社区大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。解决跨浏览器下PHP下载文件名中的中文乱码问题
浏览量:3430
分类:PHP | 发布日期:
PHP下载中文文件名文件,兼容各浏览器的方法
通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本上,下载程序都是这么写的:
$filename = &document.txt&;
header('Content-Type: application/octet-stream');
header('Content-Disposition: filename=' . $filename);
print &Hello!&;
这样用浏览器打开之后,就可以下载document.txt。
但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下:
$filename = &中文 文件名.txt&;
header('Content-Type: application/octet-stream');
header('Content-Disposition: filename=' . $filename);
print &Hello!&;
这样用浏览器打开之后,就可以下载document.txt。
把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有&中文&两个字。Opera 9下一切正常。
输出的header实际上是这样子:
Content-Disposition: filename=中文 文件名.txt其实按照RFC2231的定义, 多语言编码的Content-Disposition应该这么定义:
Content-Disposition: filename*=&utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt&即:
filename后面的等号之前要加 *
filename的值用单引号分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。
最好加上双引号,否则文件名中空格后面的部分在Firefox中显示不出来
注意urlencode的结果与php的urlencode函数结果不太相同,php的urlencode会把空格替换成+,而这里需要替换成%20
经过试验,发现几种主流浏览器的支持情况如下:
IE6 filename=&
最终解决办法:
$ua = $_SERVER[&HTTP_USER_AGENT&];
$filename = &中文 文件名.txt&;
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace(&+&, &%20&, $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match(&/MSIE/&, $ua)) {
header('Content-Disposition: filename=&' . $encoded_filename . '&');
} else if (preg_match(&/Firefox/&, $ua)) {
header('Content-Disposition: filename*=&utf8\'\'' . $filename . '&');
header('Content-Disposition: filename=&' . $filename . '&');
print 'ABC';关于php字符串输出多了一个0x20的问题请教大家
[问题点数:20分,结帖人inraining]
关于php字符串输出多了一个0x20的问题请教大家
[问题点数:20分,结帖人inraining]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&&>>&&>>&正文
基于PHP导出Excel的小经验 完美解决乱码问题
我在PHP项目里要求把数据导出为Excel,并且数据中包含中文.网上大概了解一下可是使用PHPExcel,可是相对我的需求,这个框架太复杂了.于是还是想找找简单做法.网上发现其实最简单可以这样写,但问题是这种做法中文的编码不可靠... 代码如下:&?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=export_data.xls");
"姓名"."\t";
"繁w"."\t";
"博客"."\t";
"jason"."\t";
"javaeye"."\t";
?& 有些同学会想到header加入字符集. 代码如下:header("Content-type:application/vnd.ms-charset=UTF-8");问题: 这里只是告诉浏览器要选什么字符集查看,最终我的需求还是要生成xls文件.当然.有些同学还会想到用iconv转码.. 代码如下:echo iconv("当前编码","GB18030","此博客来源于javaeye,by jason");问题: 这样文件里的汉字编码就GB18030,可是Excel这么知道用什么编码打开呢?只能完全依赖OS默认.可是如果碰到繁体BIG5这么办,还是会乱码. 所以还是不靠谱.最后我采用phpMyAdmin的做法.用HTMLExcel, HTML我们比较熟悉,格式如下.. 代码如下:&html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40"&
&!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&
&meta http-equiv="Content-type" content="text/charset=UTF-8" /&
&style id="Classeur1_16681_Styles"&&/style&
&div id="Classeur1_16681" align=center x:publishsource="Excel"&
&table x:str border=0 cellpadding=0 cellspacing=0 width=100% style="border-collapse: collapse"&
&tr&&td class=xl2216681 nowrap&1234&/td&&td class=xl2216681 nowrap&Robbin会吐口水&/td&&/tr&
&tr&&td class=xl2216681 nowrap&5678&/td&&td class=xl2216681 nowrap&javaeye网站&/td&&/tr&
&/html& 这下可以直接echo了,又不需要iconv转码,只要设置好HTML里的Content-type(这里用的是UTF-8),是不是有舒服的感觉呢? 当然header还是要加上. 代码如下:header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=export_data.xls"); 一点小经验和各位同学分享一下..
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:
[][][][][][][][][][]1212人阅读
1、中函数前面的@是什么意思?
答:@的作用是忽略调用该函数时产生的错误信息。
2、为什么出现&.EXE: cannot determine local host name.&?
答:由于Windows版本的Apache默认情况下不指定ServerName,所以运行时会出错。 解决的办法是修改Apache安装目录下的conf目录下的httpd.conf: - 搜索ServerName - 去掉前面的#号 - 把ServerName后面的值换成你自己的设置,如localhost之类的 - 保存,重新启动Apache
3、在Windows NT/9x,为什么会出现&Can't connect to
server on 'localhost' &10061&&?
答:MySQL虽然小巧,但毕竟不同于一般的文件,而是一个应用服务器,所以在使用客户程序如mysql之前,必须启动MySQL服务器。是在MySQL的bin目录下运行(哪个文件存在就运行哪个): mysqld.exe 或 mysqld-shareware.exe
4、关于PHP与Sybase数据库的连接与使用
很高兴看到大家在使用Sybase,在使用本站php_sybct.dll模块时,不少网友遇到问题, 现将网友们的问题解释如下:
1.注意你的PHP版本,我只使用PHP官方源代码(http://php.net)编译PHP.而且,在PHP4里,我发现 每一个版本都稍有区别(主要与ZEND有关),因此PHP4的模块严格区分PHP版本,PHP4RC1的模块不 可能在PHP4.0.0中使用.有网友使用公司的PHP编译版,我不能保证你一定能使用本 模块. 2.正确配置你的PHP,保证你的机器在系统可遍历的路径里只有一个php.ini,并配置正确,建议的 做法: 将php_sybct.dll拷至php4所在目录,如c:/php4,修改php.ini(一般位于Windows目录或 WinNT目录)中extension_dir=c:/php4 增加 extension=php_sybct.dll 注意=号两边不要有空 格;运行php_info();,查看PHP输出信息,若找到sybase_ct信息,证明模块加载成功.否则,就是 你的PHP版本与本模块不匹配.其实最简单办法是看有没有什么 'X-Powered By...' 信息,若有, 则模块肯定与PHP版本不匹配! 3.正确安装并配置好Sybase Client端,PHP连接Sybase数据库不是凭空的,它需要Sybase Client DLL的支持.使用SQLEDIT为Web数据库增加一个数据服务(当然,这不是必须的,你可以使用现有 的数据服务)SybWeb,正确填写配置参数后,存盘退出. 使用SybasePing工具,确保SybWeb服务能 ing通Sybase Server. 4.编写PHP代码,连接数据库,使用sybase_pconnect(&SybWeb&,&sa&,&sapass&);//sapass为sa用 户的连接密码.Sybase会提示诸如&changed database to master...&等信息,若想屏蔽这些信 息,可在函数前加'@',sybase_select_db(&Your DataBase Name&)函数前也应加'@'. 5.其它问题: *关于非法操作 其一可能与本机有关,如Sybase Client安装不正确,或Win9x系统有问题.你可以移植到WinNT 试试; 其二可能与Sybase Client版本有关,我使用SybaseCT Version 11.0.2编译的本模块,后来有网 友提供了Version 11.9.2,我将在PHP4.0.1(含)以后的版本中使用.就像MSSQL有65与70一 样,Sybase也会有版本区分.此模块我发给过不少国外的网友,他们使用都很正常.我想是因 为老外不像国人那么时髦,什么都用最新的缘故. *关于或UNIX下Sybase的连接 我没有使用两种系统下的Sybase,因此无法测试,但国内外都有网友使用本模块成功的建立了与 Sybase for Lunix的连接.我想都是基于TCP/IP的,并不奇怪.不过,应注意,此时的SybWeb服务应 基于TCP/IP(NLWNSCK)而不是命名管道(NLMSNMP). *关于Sybase SQL Any Where 有网友使用本模块连接 Sybase SQL Any Where,这是Sybase的一种小型化的基于桌面的数据库 系统,可能无法使用本模块.
我使用Win98+Apache1.3.12+Sybase system 11(Client)+PHP4.0.0作开发; 数据库为 WinNT4+Sybase system11; Web Server为Apache1.3.12(运行于WinNT)+PHP4.0.0,暂时与数据库 Server 同机; 使用一直正常. (由Sunny Wang提供)
5、为什么在WINDOWS下使用PHP4的SESSION功能老是报路径出错?
答:这个可能是PHP4.0在WINDOWS下的一个BUG,希望能在以后的版本里得到彻底解决。目前的解决办法是把保存SESSION的路径设为当前路径(只有这样,才不会包错)。
方法是修改php.ini,把 ession.save_path 的值设为 ./
6、如何在WIN2K下把MYSQL安装成自动的服务?
答:MYSQL在WINDOWS NT 4下很容易被安装成自动启动的服务,但WINDOWS 2000下却要出错?为什么呢?经过查找终于发现了问题所在: 执行mysqld-shareware --install后,将在WINDOWS的服务里增加一项,但这项的执行文件却是mysqld.exe,而不是mysqld- shareware.exe,所以,我的解决办法是把mysqld-shareware.exe复制为mysqld.exe。再启动WINDOWS 2000,一切OK!
7、运行PHP4出现X-Powered-By和Content-type: text/html问题的解决
答:这两条信息本来是HTTP协议头的一部分,也就是说它们是不应该出现在浏览器里的,但为何却出现了呢?
原因是在PHP输出这两条信息之前已经有过浏览器不认识(不是HTTP协议头)的内容,最大的可能就是PHP本身出错,比如调用某个DLL时。
解决的办法是在DOS提示符下运行: C:/PHP/PHP.EXE (注意要换成你自己的PHP目录) 看看是否有什么不正常的信息,然后看情况休整错误即可。
8、如何从Linux下访问Microsoft SQL Server?
答:Bill Gates肯定不会提供Linux下的MS SQL驱动程序,那么如何从Linux下访问MS SQL呢?请看:
确认能够通过TCP/IP PING通MS SQL服务器的那台机器
确认MS SQL上建立了基于TCP/IP的连接方式,默认情况下是命名管道的
对于MS SQL 6.5及更低版本,用Sybase CT库就足够了;对于MS SQL 7及以上版本,要用到TDS。要得到Sybase CT库,有两个办法:到这里下载SYBASE ASE 11.0.3(几十M),或到这里下载SYBASE CT库(几M)。至于TDS,可以到其官方站点去下载。
设置指向MS SQL服务器的interface文件,这里有个例子: -------------------------------------- t master tcp ether 192.168.0.1 1443 query tcp ether 192.168.0.1 1443 -------------------------------------- 其中1443是MS SQL服务器的默认端口号
以SYBASE的用户登陆到Linux,测试和MS SQL之间的连接: isql -U -P -S 如: isql -Uhunte -Pmypass -Snt 看能够执行一些查询。
参考PHP/TDS的编译指南,把所需的库编译进PHP: ./configure --with-sybase=/path/to/sybase
###################################################################################
###################################################################################
###################################################################################
1、关于PHP重定向 方法一:header(&Location: index.php&); 方法二:echo &&script&window.location =/&$PHP_SELF/&;&/script&&; 方法三:echo &&META HTTP-EQUIV=&Refresh& CONTENT=&0; URL=index.php&&&;
####################################################################################
PHP常见问题汇总
【1】页面之间无法传递变量
get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。
【2】Win32下apache2 用get方法传递中文参数会出错
test.php?a=你好&b=你也好 [中国站长站]
传递参数是会导致一个内部错误 中.国站长站
解决办法:&test.php?a=&.urlencode(你好).&&b=&.urlencode(你也好) [中国站长站]
【3】win32下的session不能正常工作 中.国.站.长.站
php.ini默认的session.save_path = /tmp
这显然是Linux下的配置,win32下php无法读写session文件导致session无法使用
把它改成一个绝对路径就可以了,例如session.save_path = c:/windows/temp
【4】显示错误信息 中国站长.站
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽 中国.站长站
例如显示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo 中国.站长站
【5】Win32下mail()不能发送电子邮件
在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) Chinaz_com
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器
【6】初装的mysql如果没有设置密码,应该使用
update mysql.user set password=&yourpassword& where user=&root& Www~Chinaz~com
修改密码 中.国.站长站
【7】header already sent 字串4
这个错误通常在你使用HEADER的时候出现,他可能是几种原因:1,你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。
【8】更改php.ini后没有变化
重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置
【9】php在2003上面安装
PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装
步骤一,先下在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站--&应用程序配置&&
步骤二:点击 web服务扩展 --&新建web服务扩展
步骤三: 扩展名--&php,然后添加
步骤四:到php.exe的路径添加上去。
步骤五: 确定就可以了! 中国站长_站,为中文网站提供动力
步骤六: 选择php的服务扩展,然后点击允许。
有时候sql语句不起作用,对数据库操作失败
最简便的调试方法,echo那句sql,看看变量的值能得到不
【11】include和require的区别
两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出 Chinaz~com
据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许*nux下情况不同,暂时还没测试 [中国站长站]
如果一个文件不想被包含多次可以使用include_once或require_once## 读取,写入文档数据 中国.站长站 以下为引用的内容:function r($file_name) { &); @flock($filenum,LOCK_SH); )); @fclose($filenum); return $file_ } function w($file_name,$data,$method=&w&){ ); flock($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); return $file_ }
【12】isset()和empty()的区别 站.长.站
两者都是测试变量用的 中国站长.站
但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示
如果一个变量被赋空值,$foo=&&或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。 Chinaz~com
要注销一个变量,可以用 unset($foo)或者$foo=NULL 站.长.站
【13】mysql查询语句包含有关键字
php查询mysql的时候,有时候mysql表名或者列名会有关键字 Chinaz_com
这时候查询会有错误。例如表名是order,查询时候会出错 Chinaz^com
简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别
例如select * from `order` Chinaz~com
【14】通过HTTP协议一次上传多个文件的方法
有两个思路,是同一个方法的两种实现。具体程序还需自己去设计
在form中设置多个文件输入框,用数组命名他们的名字,如下: 以下为引用的内容:&form action=&& method=post& &input type=file name=usefile[]& &input type=file name=usefile[]& &input type=file name=usefile[]& &/form&
这样,在服务器端做以下测试 以下为引用的内容:echo &&pre&&; print_r($_FILES); echo &&/pre&&;
在form中设置多个文件输入框,但名字不同,如下: Chinaz^com 以下为引用的内容:&form action=&& method=post& &input type=file name=usefile_a& &input type=file name=usefile_b& &input type=file name=usefile_c& &/form&
在服务器端做同样测试:
以下为引用的内容:
echo &&pre&&; print_r($_FILES); echo &&/pre&&; Www~Chinaz~com
###############################################################################
LAMP 架构的网站,我以前注重的多是安装/配置方面的,讲述开发的相对较少,因为自己从事开发也少。本文的原文当然也来自:
Published on The O'Reilly Network (/) /pub/a/onlamp//webdb.html
看了以后,颇有启发,以前开发中遇到的一些问题,迎刃而解。所以翻译出来和大家共享。
1. PHP 中数组的使用 在操作时,使用关联数组(associatively-indexed arrays)十分有帮助,下面我们看一个基本的数字格式的数组遍历:
$temp[0] = &richmond&; $temp[1] = &tigers&; $temp[2] = &premiers&;
for($x=0;$x { echo $temp[$x]; echo & &; } ?&
然而另外一种更加节省代码的方式是:
$temp = array(&richmond&, &tigers&, &premiers&); foreach ($temp as $element) echo &$element &; ?&
foreach 还能输出文字下标:
$temp = array(&club& =& &richmond&, &nickname& =&&tigers&, &aim& =& &premiers&);
foreach ($temp as $key =& $value) echo &$key : $value &; ?& PHP 手册中描述了大约 50 个用于处理数组的函数。
2. 在 PHP 字符串中加入变量
这个很简单的:
$temp = &hello& echo &$temp world&; ?&
但是需要说明的是,尽管下面的例子没有错误: $temp = array(&one& =& 1, &two& =& 2); // 输出:: The first element is 1 echo &The first element is $temp[one].&; ?&
但是如果后面那个 echo 语句没有双引号引起来的话,就要报错,因此建议使用花括号:
$temp = array(&one& =& 1, &two& =& 2); echo &The first element is {$temp[&one&]}.&; ?&
3. 采用关联数组存取查询结果 看下面的例子:
$connection = mysql_connect(&localhost&, &albert&, &shhh&); mysql_select_db(&winestore&, $connection);
$result = mysql_query(&SELECT cust_id, surname, firstname FROM customer&, $connection);
while ($row = mysql_fetch_array($result)) { echo &ID:/t{$row[&cust_id&]}/n&; echo &Surname/t{$row[&surname&]}/n&; echo &First name:/t{$row[&firstname&]}/n/n&; } ?&
函数 mysql_fetch_array() 把查询结果的一行放入数组,可以同时用两种方式引用,例如 cust_id 可以同时用下面两种方式:$row[&cust_id&] 或者$row[0] 。显然,前者的可读性要比后者好多了。
在多表连查中,如果两个列名字一样,最好用别名分开:
SELECT winery.name AS wname, region.name AS rname, FROM winery, region WHERE winery.region_id = region.region_
列名的引用为:$row[&wname&] 和 $row[&rname&]。
在指定表名和列名的情况下,只引用列名:
SELECT winery.region_id FROM winery
列名的引用为: $row[&region_id&]。
聚集函数的引用就是引用名:
SELECT count(*) FROM
列名的引用为: $row[&count(*)&]。
4. 注意常见的 PHP bug
常见的 PHP 纠错问题是:
No page rendered by the Web browser when much more is expected A pop-up dialog stating that the &Document Contains No Data& A partial page when more is expected
出现这些情况的大多数原因并不在于脚本的逻辑,而是 HTML 中存在的 bug 或者脚本生成的 HTML 的 bug 。例如缺少类似 , , 之类的关闭 Tag,页面就不能刷新。解决这个问题的办法就是,查看 HTML 的源代码。
对于复杂的,不能查到原因的页面,可以通过 W3C 的页面校验程序 http://validator.w3.org/ 来分析。
如果没有定义变量,或者变量定义错误也会让程序变得古怪。例如下面的死循环:
for($counter=0; $counter&10; $Counter++) myFunction(); ?&
变量 $Counter 在增加,而 $counter 永远小于 10。这类错误一般都能通过设置较高的错误报告级别来找到:
error_reporting(E_ALL);
for($counter=0; $counter&10; $Counter++) myFunction(); ?&
5. 采用 header() 函数处理单部件查询
在很多 Web 应用中,一些功能往往让用户点击一个连接后,继续停留在当前页面,这样的工作我叫它&单部件查询&。
下面是一个叫做 calling.php 的脚本:
&-//W3C//DTD HTML 4.0 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd& &
当用户点击上面的连接时,就去调用 action.php。下面是 action.php 的源码:
// 重定向 header(&Location: $HTTP_REFERER&);
这里有两个常见的错误需要提醒一下: 调用 header() 函数后要包含一个 exit 语句让脚本停止,否则后续的脚本可能会在头发送前输出。
header() 函数常见的一个错误是:
Warning: Cannot add header information - headers already sent...
header() 函数只能在 HTML 输出之前被调用,因此你需要检查 php 前面可能存在的空行,空格等等。
6. reload 的问题及其解决 我以前在写 PHP 程序时,经常碰到页面刷新时,多处理一次的情况。 我们来看 addcust.php:
$query = &INSERT INTO customer SET surname = $surname, firstname = $firstname&; $connection = mysql_connect(&localhost&, &fred&, &shhh&); mysql_select_db(&winestore&, $connection); $result = mysql_query($query, $connection); ?&
&-//W3C//DTD HTML 4.0 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd& &
I've inserted the customer for you. ?& 假设我们用下面的连接使用这个程序:
/addcust.php?surname=Smith&firstname=Fred
如果这个请求只提交一次,OK ,不会有问题,但是如果多次刷新,你就会有多条记录插入。 这个问题可以通过 header() 函数解决:下面是新版本的 addcust.php:
$query = &INSERT INTO customer SET surname = $surname, firstname = $firstname&; $connection = mysql_connect(&localhost&, &fred&, &shhh&); mysql_select_db(&winestore&, $connection); $result = mysql_query($query, $connection); header(&Location: cust_receipt.php&); ?& 这个脚本把浏览器重定向到一个新的页面:cust_receipt.php:
&-//W3C//DTD HTML 4.0 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd& &
I've inserted the customer for you.
这样,原来的页面继续刷新也没有副作用了。
7. 巧用锁机制来提高应用性能 如果我们要紧急运行一个报表,那么,我们可以对表加写锁,防治别人读写,来提高对这个表的处理速度。
8. 用 mysql_unbuffered_query() 开发快速的脚本 这个函数能用来替换 mysql_query() 函数,主要的区别就是 mysql_unbuffered_query() 执行完查询后马上返回,不需要等待或者对加锁。
但是返回的行数不能用mysql_num_rows() 函数来检查,因为输出的结果集大小未知。
##################################################################
1:为什么我得不到变量
我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值?
在PHP4.2以后的版本中register_global默认为off若想取得从另一页面提交的变量:
方法一:在PHP.ini中找到register_global,并把它设置为on.方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).方法三:一个一个读取变量$a=$_GET[&a&];$b=$_POST[&b&]等,这种方法虽然麻烦,但比较安全.
2:调试你的程序
在运行时必须知道某个变量为何值。我是这样做的,建立一文件debug.php,其内容如下:
PHP代码:--------------------------------------------------------------------------------
&?PHPOb_Start();Session_Start();Echo &&pre&&;
Echo &本页得到的_GET变量有:&;Print_R($_GET);
Echo &本页得到的_POST变量有:&;Print_R($_POST);
Echo &本页得到的_COOKIE变量有:&;Print_R($_COOKIE);
Echo &本页得到的_SESSION变量有:&;Print_R($_SESSION);Echo &&/pre&&;?&
--------------------------------------------------------------------------------
然后在php.ini中设置:include_path = &c:/php&,并将debug.php放在此文件夹,以后就可以在每个网页里包含此文件,查看得到的变量名和值.
3:如何使用session
凡是与session有关的,之前必须调用函数session_start();
为session付值很简单,如:
PHP代码:--------------------------------------------------------------------------------
&?phpSession_start();$Name = &这是一个Session例子&;Session_Register(&Name&);//注意,不要写成:Session_Register(&$Name&);Echo $_SESSION[&Name&];//之后$_SESSION[&Name&]为&这是一个Session例子&?&
--------------------------------------------------------------------------------
在php4.2之后,可以为session直接付值:
PHP代码:--------------------------------------------------------------------------------
&?PHPSession_Start();$_SESSION[&name&]=&value&;?&
--------------------------------------------------------------------------------
取消session可以这样:
PHP代码:--------------------------------------------------------------------------------
&?phpsession_start();session_unset();session_destroy();?&
--------------------------------------------------------------------------------
取消某个session变量在php4.2以上还有BUG.
1:在调用Session_Start()之前不能有任何输出.例如下面是错误的.==========================================1行2行 &?PHP3行 Session_Start();//之前在第一行已经有输出4行 .....5行 ?&==========================================
凡是出现&........headers already sent..........&,就是Session_Start()之前向浏览器输出信息.去掉输出就正常,(COOKIE也会出现这种错误,错误原因一样)
如果你的Session_Start()放在循环语句里,并且很难确定之前哪里向浏览器输出信息,可以用下面这种方法:1行 &?PHP Ob_Start(); ?&........这里是你的程序......
2:这是什么错误
Warning: session_start(): open(/tmp/sess_7d190aa36b4c5ec13a5cf, O_RDWR) failed:....因为你没有指定session文件的存放路径.
解决方法:(1)在c盘建立文件夹tmp(2)打开php.ini,找到session.save_path,修改为session.save_path= &c:/tmp&
4:为什么我向另一网页传送变量时,只得到前半部分,以空格开头的则全部丢失
PHP代码:--------------------------------------------------------------------------------
&?php$Var=&hello php&;//修改为$Var=&&&&& hello php&;试试得到什么结果$post= &receive.php?Name=&.$Vheader(&location:$post&);?&
--------------------------------------------------------------------------------
receive.php的内容:
PHP代码:--------------------------------------------------------------------------------
&?PHPEcho &&pre&&;Echo&& $_GET[&Name&];Echo &&/pre&&;?&
--------------------------------------------------------------------------------
正确的方法是:
PHP代码:--------------------------------------------------------------------------------
&?php$Var=&hello php&;$post= &receive.php?Name=&.urlencode($Var);header(&location:$post&);?&
--------------------------------------------------------------------------------
在接收页面你不需要使用Urldecode(),变量会自动编码.
5:如何截取指定长度汉字而不会出现以&?&&结尾,超出部分以&...&代替
一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字,包括标点.
PHP代码:--------------------------------------------------------------------------------
&?PHP$str=&这个字符好长呀,^_^&;$Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符...Echo&& &$Short_Str&;Function csubstr($str,$start,$len) { $strlen=strlen($str); $clen=0; for($i=0;$i&$$i++,$clen++) { if ($clen&=$start+$len)
if(ord(substr($str,$i,1))&0xa0) { if ($clen&=$start) $tmpstr.=substr($str,$i,2); $i++; } else { if ($clen&=$start) $tmpstr.=substr($str,$i,1); } }
return $ } Function showShort($str,$len) { $tempstr = csubstr($str,0,$len); if ($str&&$tempstr) $tempstr .= &...&; //要以什么结尾,修改这里就可以.
return $ }
--------------------------------------------------------------------------------
6:规范你的SQL语句
在表格,字段前面加上&`&,这样就不会因为误用关键字而出现错误,当然我并不推荐你使用关键字.
例如$Sql=&INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', ' 00:00:00')&
&`&怎么输入? 在TAB键上面.
7:如何使Html/PHP格式的字符串不被解释,而是照原样显示
PHP代码:--------------------------------------------------------------------------------
&?PHP$str=&&h1&PHP&/h1&&;Echo &被解释过的: &.$str.&&br&经过处理的:&;Echo&& htmlentities(nl2br($str));?&
--------------------------------------------------------------------------------
8:怎么在函数里取得函数外的变量值
PHP代码:--------------------------------------------------------------------------------
&?PHP$a=&PHP&;foo();Function foo(){& global $a;//删除这里看看是什么结果& Echo &$a&;}?&
--------------------------------------------------------------------------------
9:我怎么知道系统默认支持什么函数
PHP代码:--------------------------------------------------------------------------------
&?php $arr = get_defined_functions(); Function php() {}echo&& &&pre&&; Echo&& &这里显示系统所支持的所有函数,和自定以函数php/n&;print_r($arr); echo&& &&/pre&&; ?& --------------------------------------------------------------------------------
10:如何比较两个日期相差几天
PHP代码:--------------------------------------------------------------------------------
&?PHP$Date_1=&&;//也可以是:$Date_1=& 23:29:14&;$Date_2=&&;$Date_List_1=explode(&-&,$Date_1);$Date_List_2=explode(&-&,$Date_2);$d1=mktime(0,0,0,$Date_List_1[1],$Date_List_1[2],$Date_List_1[0]);$d2=mktime(0,0,0,$Date_List_2[1],$Date_List_2[2],$Date_List_2[0]);$Days=round(($d1-$d2)/3600/24);Echo&& &偶已经奋斗了 $Days 天^_^&;?&
--------------------------------------------------------------------------------
11:为什么我升级PHP后,原来的程序出现满屏的 Notice: Undefined variable:
这是警告的意思,由于变量未定义引起的.打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL & ~E_NOTICE
对于Parse error错误error_reporting(0)无法关闭.如果你想关闭任何错误提示,打开php.ini,找到display_errors,设置为display_errors = Off.以后任何错误都不会提示.
那什么是error_reporting?
12:我想在每个文件最前,最后面都加上一文件.但一个一个添加很麻烦
1:打开php.ini文件设置 include_path= &c:&
2:写两个文件 auto_prepend_file.php 和 auto_append_file.php 保存在c盘,他们将自动依附在每个php文件的头部和尾部.
3:在php.ini中找到:Automatically add files before or after any PHP document.auto_prepend_file = auto_prepend_file.依附在头部auto_append_file = auto_append_file.依附在尾部
以后你每个php文件就相当于
PHP代码:--------------------------------------------------------------------------------
&?php Include &auto_prepend_file.php& ;
.......//这里是你的程序
Include &auto_append_file.php&;?&
--------------------------------------------------------------------------------
13:如何利用PHP上传文件
PHP代码:--------------------------------------------------------------------------------
&html&&head&&title&上载文件表单&/title&&/head& &body& &form enctype=&multipart/form-data& action=&& method=&post&& 请选择文件: &br&&input name=&upload_file& type=&file&&&br&&input type=&submit& value=&上传文件&& &/form& &/body&&/html&
&?$upload_file=$_FILES['upload_file']['tmp_name'];$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){$file_size_max = ;// 1M限制文件上传最大容量(bytes)$store_dir = &d:/&;// 上传文件的储存位置$accept_overwrite = 1;//是否允许覆盖相同文件// 检查文件大小if ($upload_file_size & $file_size_max) {echo &对不起,你的文件容量大于规定&;}
// 检查读写文件if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {Echo&& &存在相同文件名的文件&;}
//复制文件到指定目录if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {echo &复制文件失败&;}
Echo&& &&p&你上传了文件:&;echo& $_FILES['upload_file']['name'];echo &&br&&;//客户端机器文件的原名称。
Echo&& &文件的 MIME 类型为:&;echo $_FILES['upload_file']['type'];//文件的 MIME 类型,需要浏览器提供该信息的支持,例如&image/gif&。 echo &&br&&;
Echo&& &上传文件大小:&;echo $_FILES['upload_file']['size'];//已上传文件的大小,单位为字节。 echo &&br&&;
Echo&& &文件上传后被临时储存为:&;echo $_FILES['upload_file']['tmp_name'];//文件被上传后在服务端储存的临时文件名。 echo &&br&&;
$Erroe=$_FILES['upload_file']['error'];switch($Erroe){&&&&&&& case 0:&&&&&&&&&&& Echo&& &上传成功&;&&&&&&& case 1:&&&&&&&&&&& Echo&& &上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值.&;&&&&&&& case 2:&&&&&&&&&&& Echo&& &上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。&;&&&&&&&&&& case 3:&&&&&&&&&&& Echo&& &文件只有部分被上传&;&&&&&&& case 4:&&&&&&&&&&& Echo&& &没有文件被上传&;}?&
--------------------------------------------------------------------------------
14:如何配置GD库
下面是我的配置过程1:用dos命令(也可以手动操作,拷贝dlls文件夹里所有dll文件到system32目录下) copy c:/php/dlls/*.dll c:/windows/system32/ 2:打开php.ini设置extension_dir = &c:/php/extensions/&;3:extension=php_gd2.把extension前面的逗号去掉,如果没有php_gd2.dll,php_gd.dll也一样,保证确实存在这一文件c:/php/extensions/php_gd2.dll4:运行下面程序进行测试
PHP代码:--------------------------------------------------------------------------------
&?phpOb_end_flush();//注意,在此之前不能向浏览器输出任何信息,要注意是否设置了 auto_prepend_file.header (&Content-type: image/png&);$im = @imagecreate (200, 100)&&& or die (&无法创建图像&);$background_color = imagecolorallocate ($im, 0,0, 0);$text_color = imagecolorallocate ($im, 230, 140, 150);imagestring ($im, 3, 30, 50,& &A Simple Text String&, $text_color);imagepng ($im);?&
--------------------------------------------------------------------------------
点击这里查看结果
15:什么是UBB代码
UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序,国内也有不少地方使用这个程序)采用的一种特殊的TAG.即使禁止使用 HTML,你也可以用 UBBCode? 来实现.也许你更希望使用 UBBCode? 而不是 HTML, 即使论坛允许使用 HTML, 因为使用起来代码较少也更安全.
Q3boy的UBB里面付有例子,可以直接运行测试
16:我想修改MySQL的用户,密码
首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的, 所以一般用户无法更改密码,除非请求管理员.
方法一   使用phpmyadmin,这是最简单的了,修改mysql库的user表,   不过别忘了使用PASSWORD函数。
方法二   使用mysqladmin,这是前面声明的一个特例。   mysqladmin -u root -p password mypasswd   输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。   把命令里的root改为你的用户名,你就可以改你自己的密码了。   当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,   那么这种方法就是无效的。   而且mysqladmin无法把密码清空。
下面的方法都在mysql提示符下使用,且必须有mysql的root权限:   方法三   mysql& INSERT INTO mysql.user (Host,User,Password)   VALUES('%','jeffrey',PASSWORD('biscuit'));   mysql& FLUSH PRIVILEGES   确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。   在《mysql中文参考手册》里有这个例子,所以我也就写出来了。   注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。
方法四   和方法三一样,只是使用了REPLACE语句   mysql& REPLACE INTO mysql.user (Host,User,Password)   VALUES('%','jeffrey',PASSWORD('biscuit'));   mysql& FLUSH PRIVILEGES
方法五   使用SET PASSWORD语句,   mysql& SET PASSWORD FOR & = PASSWORD('biscuit');   你也必须使用PASSWORD()函数,   但是不需要使用FLUSH PRIVILEGES。
方法六   使用GRANT ... IDENTIFIED BY语句   mysql& GRANT USAGE ON *.* TO & IDENTIFIED BY 'biscuit';   这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。
注意: PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。
17:我想知道他是通过哪个网站连接到本页
PHP代码:--------------------------------------------------------------------------------
&?php//必须通过超级连接进入才有输出Echo $_SERVER['HTTP_REFERER'];?&
--------------------------------------------------------------------------------
18:数据放入数据库和取出来显示在页面需要注意什么
入库时$str=addslashes($str);$sql=&insert into `tab` (`content`) values('$str')&;出库时$str=stripslashes($str);显示时$str=htmlspecialchars(nl2br($str)) ;
19:如何读取当前地址栏信息
PHP代码:--------------------------------------------------------------------------------
&?php $s=&]}&; $se=''; foreach ($_GET as $key =& $value) {&&&& $se.=$key.&=&.$value.&&&;&&&& }&& $se=Preg_Replace(&/(.*)&$/&,&$1&,$se); $se?$se=&?&.$se:&&;echo&& $s.&?$se&; ?& --------------------------------------------------------------------------------
20:我点击后退按钮,为什么之前填写的东西不见
这是因为你使用了session.解决办法:
PHP代码:--------------------------------------------------------------------------------
&?php session_cache_limiter('private, must-revalidate');session_start(); .....................?&
--------------------------------------------------------------------------------
21:怎么在图片里显示IP地址
PHP代码:--------------------------------------------------------------------------------
&?& Header(&Content-type: image/png&);& $img = ImageCreate(180,50);& $ip = $_SERVER['REMOTE_ADDR'];& ImageColorTransparent($img,$bgcolor);& $bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景颜色& $shadow = ImageColorAllocate($img, 250,0,0);&&& // 阴影颜色& $textColor = ImageColorAllocate($img, oxff,oxff,oxff);&&&&&& // 字体颜色& ImageTTFText($img,10,0,78,30,$shadow,&d:/windows/fonts/Tahoma.ttf&,$ip); //显示背景& ImageTTFText($img,10,0,25,28,$textColor,&d:/windows/fonts/Tahoma.ttf&,&your ip is&.$ip); // 显示IP& ImagePng($img);& imagecreatefrompng($img);& ImageDestroy($img);?&
--------------------------------------------------------------------------------
22:如何取得用户的真实IP
PHP代码:--------------------------------------------------------------------------------
&? function iptype1 () { if (getenv(&HTTP_CLIENT_IP&)) { && return getenv(&HTTP_CLIENT_IP&); } else { && return &none&; } } function iptype2 () { if (getenv(&HTTP_X_FORWARDED_FOR&)) { && return getenv(&HTTP_X_FORWARDED_FOR&); } else { && return &none&; } } function iptype3 () { if (getenv(&REMOTE_ADDR&)) { && return getenv(&REMOTE_ADDR&); } else { && return &none&; } } function ip() { $ip1 = iptype1(); & $ip2 = iptype2(); $ip3 = iptype3(); if (isset($ip1) && $ip1 != &none& && $ip1 != &unknown&) { && return $ip1; } elseif (isset($ip2) && $ip2 != &none& && $ip2 != &unknown&) { && return $ip2; } elseif (isset($ip3) && $ip3 != &none& && $ip3 != &unknown&) { && return $ip3; }&& & else { & return &none&; } }
Echo ip(); ?& --------------------------------------------------------------------------------
23:如何从数据库读取三天内的所有记录
首先表格里要有一个DATETIME字段记录时间,格式为' 16:50:00'
SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) &= 3;
24:如何远程链接Mysql数据库
在增加用户的mysql表里有一个host字段,修改为&%&,或者指定允许连接的ip地址,这样,你就可以远程调用了。
$link=mysql_connect(&192.168.1.80:3306&,&root&,&&);
25:正则到底怎么用
点击这里正则表达式中的特殊字符
26:用Apache后,主页出现乱码
方法一: AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off
方法二: AddDefaultCharset GB2312========================================================tip:大家贴代码时GB2312会被解释成??????
改成这样就不会[color=#000000]GB[/color]2312
10:如何比较两个日期相差几天,(更简单的算法)
PHP代码:--------------------------------------------------------------------------------
&?PHP$Date_1=&&;//也可以是:$Date_1=& 23:29:14&;$Date_2=&&;$d1=strtotime($Date_1);$d2=strtotime($Date_2);$Days=round(($d1-$d2)/3600/24);Echo&& &偶已经奋斗了 $Days 天^_^&;?&
--------------------------------------------------------------------------------
27:为什么单引号,双引号在接受页面变成(/'/&)
解决方法:方法一:在php.ini中设置:magic_quotes_gpc = Off方法二: $str=stripcslashes($str)
28:怎么让程序一直运行下去,而不是超过30秒就停止
set_time_limit(60)//最长运行时间一分钟set_time_limit(0)//运行到程序自己结束,或手动停止
29:计算当前在线人数
例子一:用文本实现
PHP代码:--------------------------------------------------------------------------------
&?php //首先你要有读写文件的权限//本程序可以直接运行,第一次报错,以后就可以& $online_log = &count.dat&; //保存人数的文件,& $timeout = 30;//30秒内没动作者,认为掉线 & $entries = file($online_log);
& $temp = array(); & & for ($i=0;$i&count($entries);$i++) { && $entry = explode(&,&,trim($entries[$i])); && if (($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] & time())) { &&& array_push($temp,$entry[0].&,&.$entry[1].&/n&); //取出其他浏览者的信息,并去掉超时者,保存进$temp&& } & }
&& array_push($temp,getenv('REMOTE_ADDR').&,&.(time() + ($timeout)).&/n&); //更新浏览者的时间& $users_online = count($temp); //计算在线人数
& $entries = implode(&&,$temp); & //写入文件& $fp = fopen($online_log,&w&); && flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作&& fputs($fp,$entries); && flock($fp,LOCK_UN); && fclose($fp);
&& echo &当前有&.$users_online.&人在线&;
?& --------------------------------------------------------------------------------
例子二:用数据库实现在线用户
30:什么是模板,怎么用
这里有几篇关于模板的文章
我用的是phplib模板下面是其中几个函数的使用
$T-&Set_File(&随便定义&,&模板文件.tpl&);
$T-&Set_Block(&在set_file中定义的&,&&!-- 来自模板 --&&,&随便定义&);
$T-&Parse(&在Set_Block中定义的&,&&!-- 来自模板 --&&,true);
$T-&Parse(&随便输出结果&,&在Set_File中定义的&);
设置循环格式为:
&!--(多于一个空格) BEGIN $handle(多于一个空格)--&
如何将模板生成静态网页
PHP代码:--------------------------------------------------------------------------------
&?php//这里使用phplib模板&&& ............&&& ............&&& $tpl-&parse(&output&,&html&);&&& $output = $tpl-&get(&output&);// $output 为整个网页内容
&&& function wfile($file,$content,$mode='w') {&&& $oldmask = umask(0);&&& $fp = fopen($file, $mode);&&& if (!$fp)&&& fwrite($fp,$content);&&& fclose($fp);&&& umask($oldmask);&&&}&& // 写到文件里&&& Wfile($FILE,$output);&&& header(&location:$FILE&);//重定向到生成的网页}?& --------------------------------------------------------------------------------
phplib下载地址 smarty下载地址
31:怎么用php解释字符
比如:输入2+2*(1+2),自动输出8可以用eval函数
PHP代码:--------------------------------------------------------------------------------
&form method=post action=&&&&input type=&text& name=&str&&&input type=&submit&&&/form&&?php$str=$_POST['str'];eval(&/$o=$&);Echo&& &$o&;?&
--------------------------------------------------------------------------------
另外,用此函数必须特别小心!!如果有人输入format: d:会是什么结果?
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15283次
排名:千里之外
原创:13篇
(1)(10)(6)

我要回帖

更多关于 php 浏览器 的文章

 

随机推荐