网站后台的服务器信息

没有评论

2010 年 10 月 27 日 at 上午 9:57分类:PHP

$array['osinfo'] = PHP_OS;
当前的操作系统:$array['osinfo'] .= @ini_get(‘safe_mode’) ? ‘ Safe Mode’ : NULL;
当前的运行环境:$array['serverinfo'] = $_SERVER["SERVER_SOFTWARE"];
当前数据库的版本:$sqlinfo = $mysql->query(“SELECT VERSION()”);
$array['sqlinfo'] = $sqlinfo[0]['VERSION()'];
当前的域名和ip:$array['serverip'] = $_SERVER['SERVER_NAME'].’ [ ‘.gethostbyname($_SERVER['SERVER_NAME']).’ ]’;
服务器当前的时间:$array['servertime'] = date(“Y年n月j日 H:i:s”);
获取允许上传最大信息:if(@ini_get(‘file_uploads’)) {
$upload = ini_get(‘upload_max_filesize’);
} else {
$upload = ‘<font color=”red”>’.不支持上传.’</font>’;
}

设置网站404页面的正确做法

没有评论

2010 年 10 月 21 日 at 上午 10:17分类:WEB开发

什么是404错误

http://bbs.code-down.com/redirect.php?fid=14&tid=58422&goto=nextnewset

HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache还是IIS,均十分简陋、呆板且对用户不友好,无法给用户提供必要的信息以获取更多线索,无疑这会造成用户的流失。

404页面的作用

搜索引擎通过HTTP状态码来识别网页的状态。当搜索引擎获得了一个错误链接时,网站应该返回404状态码,告诉搜索引擎放弃对该链接的索引。而如果返回200或302状态码,搜索引擎就会为该链接建立索引,这导致大量不同的链接指向了相同的网页内容。结果是,搜索引擎对该网站的信任度大幅降低。

如何检查自定义404页面能够返回“404”状态码

在自定义404错误页面设置完毕后,一定要检查一下其是不是能够正确地返回“404”状态码。检查的方法也相当简单,输入一个网站内不存在网页的url,查看一下HTTP Header的返回情况,确信其返回的是“404”状态码。

404页面的正确做法

1、Apache服务器404页面的设置方法

在.htaccess 文件中加入代码:ErrorDocument 404 /Error.html

建立一个简单的html404页面命名 Error.html

把 Error.html放置在网站根目录即可。

2、IIS/ASP.net下设置404错误页面

首先,修改应用程序根目录的设置,打开 “web.config” 文件编辑,在其中加入如下内容:

<configuration>
<system.web>
<customErrors mode=”On” defaultRedirect=”error.asp”>
<error statusCode=”404″ redirect=”notfound.asp” />
</customErrors>
</system.web>
</configuration>

此例中“error.asp”为系统默认的404页面,“notfound.asp”为自定义的404页面,使用时请修改相应文件名。

然后,在自定义的404页面“notfound.asp”中加入:

<%
Response.Status = “404 Not Found”
%>

这样,便可以保证IIS能够正确地返回“404”状态码

在设置完404页面之后,一定要查看一下无效页面是否正确返回404状态,可以利用Firefox的Firefug这个插件来查看页面返回状态。如果404设置之后,返回的是200状态,就会使搜索引擎判断该网站存在大量重复页面,影响收录。

上面这个404页面返回状态是200,有问题了。对于IIS来说,404页面是通过IIS来反馈的,所以要加NTFS权限。

改过之后,一定要是这个404状态才对。

对于Apache服务器,正确建立404页面的方法是:

在.htaccess 文件中加入代码: ErrorDocument 404 /Error.html

建立一个简单的html404页面命名 Error.html

把 Error.html放置在网站根目录

友情提醒

1、一定不要将404错误直接转向到网站首页,这将可能导致你的网站首页不被收录;

2、/Error.html 前面请不要带主域名(错误的写法:yzznl.cn/error.html,正确的写法:/error.html),否者返回的状态码是302或200状态码。

Google排名优化-面向Google(Search Engine Friendly)的URL设计

没有评论

2010 年 10 月 15 日 at 下午 6:32分类:WEB开发

Google排名优化-面向Google(Search Engine Friendly)的URL设计
作者:车东 发表于:2003-05-10 18:05 最后更新于:2007-04-12 11:04
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。

http://www.chedong.com/tech/google_url.html

内容摘要:不得不承认,将动态网页链接rewriting成静态链接是最保险和稳定的面向搜索引擎优化方式

此外随着互联网上的内容以惊人速度的增长也越来越突出了搜索引擎的重要性,如果网站想更好地被搜索引擎收录,网站设计除了面向用户友好(User Friendly)外,搜索引擎友好(Search Engine Friendly)的设计也是非常重要的。进入搜索引擎的页面内容越多,则被用户用不同的关键词找到的几率越大。在Google的算法调查一文中提到一个站点被Google索引页面的数量其实对PageRank也是有一定影响的。由于Google 突出的是整个网络中相对静态的部分(动态网页索引量比较小),链接地址相对固定的静态网页比较适合被Google索引(怪不得很多大网站的邮件列表归档和BLOG按日期归档的文档很容被搜的到),因此很多关于面向搜索引擎 URL设计优化(URI Pretty)的文章中提到了很多利用一定机制将动态网页参数变成像静态网页的形式:
比如可以将:

http://phpunixman.sourceforge.net/index.php?mode=man¶meter=ls

变成:http://phpunixman.sourceforge.net/index.php/man/ls

实现方式主要有2种:

* 基于url rewrite
IIS的ISAPI REWRITE下载(免费)
* 基于path_info

把URI地址用作参数传递:URL REWRITE

最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换:
这样几乎可以不修改程序的实现将 news.asp?id=234 这样的链接映射成 news/234.html,从外面看上去和静态链接一样。Apache服务器上有一个模块(非缺省):mod_rewrite:URL REWRITE功能之强大足够写上一本书。

当我需要将将news.asp?id=234的映射成news/234.html时,只需设置:
RewriteRule /news/(\d+)\.html /news\.asp\?id=$1 [N,I]
这样就把 /news/234.html 这样的请求映射成了 /news.asp?id=234
当有对/news/234.html的请求时:web服务器会把实际请求转发给/news.asp?id=234

而在IIS也有相应的REWRITE模块:比如ISAPI REWRITE和IIS REWRITE,语法都是基于正则表达式,因此配置几乎和apache的mod_rewrite是相同的:

比对于某一个简单应用可以是:
RewriteRule /news/(\d+)\.html /news/news\.php\?id=$1 [N,I]
这样就把 http://www.chedong.com/news/234.html 映射到了 http://www.chedong.com/news/news.php?id=234

一个更通用的能够将所有的动态页面进行参数映射的表达式是:
把 http://www.myhost.com/foo.php?a=A&b=B&c=C
表现成 http://www.myhost.com/foo.php/a/A/b/B/c/C。
RewriteRule (.*?\.php)(\?[^/]*)?/([^/]*)/([^/]*)(.+?)?$1(?2$2&:\?)$3=$4?5$5: [N,I]

以下是针对phpBB的一个Apache mod_rewrite配置样例:

RewriteEngine On
RewriteRule /forum/topic_(.+)\.html$ /forum/viewtopic.php?t=$1 [L]
RewriteRule /forum/forum_(.+)\.html$ /forum/viewforum.php?f=$1 [L]
RewriteRule /forum/user_(.+)\.html$ /forum/profile.php?mode=viewprofile&u=$1 [L]

这样设置后就可以通过topic_1234.html forum_2.html user_34.html这样的链接访问原来的动态页面了。

通过URL REWRITE还有一些好处:
mod_rewrite和isapirewrite基本兼容,但是还是有些不同,比如:isapirewrite中”?”需要转义成”\?”,mod_rewrite不用,isapirewrite支持 “\d+” (全部数字),mod_rewrite不支持

* 隐藏后台实现:这在后台应用平台的迁移时非常有用:当从asp迁移到java平台时,对于前台用户来说,根本感受不到后台应用的变化;
* 简化数据校验:因为像(\d+)这样的参数,可以有效的控制数字的格式甚至位数;

比如我们需要将应用从news.asp?id=234迁移成news.php?query=234时,前台的表现可以一直保持为 news/234.html。从实现应用和前台表现的分离:保持了URL的稳定性,而使用mod_rewrite甚至可以把请求转发到其他后台服务器上。
基于PATH_INFO的URL美化

Url美化的另外一个方式就是基于PATH_INFO:
PATH_INFO是一个CGI 1.1的标准,经常发现很多跟在CGI后面的”/value_1/value_2″就是PATH_INFO参数:
比如:http://phpunixman.sourceforge.net/index.php/man/ls 中:$PATH_INFO = “/man/ls”

PATH_INFO是CGI标准,因此PHP Servlet等都有的支持。比如Servlet中就有request.getPathInfo()方法。
注意:/myapp/servlet/Hello/foo的 getPathInfo()返回的是/foo,而/myapp/dir/hello.jsp/foo的getPathInfo()将返回的 /hello.jsp,从这里你也可以知道jsp其实就是一个Servlet的PATH_INFO参数。ASP不支持PATH_INFO
PHP中基于PATH_INFO的参数解析的例子如下:
//注意:参数按”/”分割,第一个参数是空的:从/param1/param2中解析出$param1 $param2这2个参数
if ( isset($_SERVER["PATH_INFO"]) ) {
list($nothing, $param1, $param2) = explode(‘/’, $_SERVER["PATH_INFO"]);
}

如何隐蔽应用:例如 .php,的扩展名:
在APACHE中这样配置:

ForceType application/x-httpd-php

如何更像静态页面:app_name/my/app.html
解析的PATH_INFO参数的时候,把最后一个参数的最后5个字符“.html”截断即可。
注意:APACHE2中缺省是不允许PATH_INFO的,需要设置 AcceptPathInfo on

特别是针对使用虚拟主机用户,无权安装和配置mod_rewrite的时候,PATH_INFO往往就成了唯一的选择。

OK,这样以后看见类似于http://www.example.com/article/234这样的网页你就知道可能是 article/show.php?id=234这个php程序生成的动态网页,很多站点表面看上去可能有很多静态目录,其实很有可能都是使用1,2个程序实现的内容发布。比如很多WIKIWIKI系统都使用了这个机制:整个系统就一个简单的wiki程序,而看上去的目录其实都是这个应用拿后面的地址作为参数的查询结果。

利用基于MOD_REWRITE/PATH_INFO + CACHE服务器的解决方案对原有的动态发布系统进行改造,也可以大大降低旧有系统升级到新的内容管理系统的成本。并且方便了搜索引擎收录入索引。
附:如何在IIS上利用PHP支持PATH_INFO

PHP的ISAPI模式安装备忘:只试成 php-4.2.3-Win32

解包目录
========
php-4.2.3-Win32.zip c:\php

PHP.INI初始化文件
=================
复制:c:\php\php.ini-dist 到 c:\winnt\php.ini

配置文件关联
============
按照install.txt中的说明配置文件关联

运行库文件
==========
复制 c:\php\php4ts.dll 到 c:\winnt\system32\php4ts.dll

这样运行后:会发现php把PATH_INFO映射到了物理路径上
Warning: Unknown(C:\CheDong\Downloads\ariadne\www\test.php\path): failed to create stream: No such file or directory in Unknown on line 0

Warning: Unknown(): Failed opening ‘C:\CheDong\Downloads\ariadne\www\test.php\path’ for inclusion (include_path=’.;c:\php4\pear’) in Unknown on line 0

安装ariadne的PATCH
==================
停止IIS服务
net stop iisadmin
ftp://ftp.muze.nl/pub/ariadne/win/iis/php-4.2.3/php4isapi.dll
覆盖原有的c:\php\sapi\php4isapi.dll

注:
ariadne是一个基于PATH_INFO的内容发布系统,
PHP 4.3.2 RC2中CGI模式的PATH_INFO已经修正,照常安装即可。

jQuery Sizzle

没有评论

2010 年 10 月 15 日 at 下午 1:35分类:JavaScript | jQuery

jquery1.3将选择器引擎独立,定名为Sizzle,这也是jQuery第一个独立的模块。在Sizzle的介绍里,关于它的首要目的就是在”最常用的选择器使用”比之前版本的引擎更快。(什么是”最常用的选择器使用”,请参见 http://ejohn.org/blog/selectors-that-people-actually-use )
实际上,选择器引擎的运用对于页面性能起了至关重要的作用。使用合适的选择器表达式可以轻易的提高性能、增强语义并简化逻辑,而你所需要做的,不过是培养几个习惯而已。
旧习惯我 们最常用的简单选择器包括”id选择器”、”类选择器”、”标签选择器”,毫无疑问的是id选择器有着最好的速度。这取决于dom内置的函数 getElementById,其次是标签选择器,使用的是dom内置的函数getElementsByTag,最差的是类选择器,其需要通过正则解析 html,并且需要在浏览器内核外递归,这种递归遍历是无法被优化的。就需求来说,css中选择器是为了通过语义来渲染样式,而jQuery中大部分情况只是为了选出一类DOMElement,加以同一逻辑的操作。而在”最常用的选择器使用”中,类选择器以13.082%的使用率排在第二位。也就是说在13.082%的情况下,整个document的html被解析了一遍,并递归到DOM树的叶子节点。这部分无意义的性能损耗令人发指。

使用率 统计数
#id 51.290% 1431
.class 13.082% 365
tag 6.416% 179
tag.class 3.978% 111
#id tag 2.151% 60
tag#id 1.935% 54
#id:visible 1.577% 44
#id .class 1.434% 40
.class .class 1.183% 33
* 0.968% 27
#id tag.class 0.932% 26
#id:hidden 0.789% 22
tag[name=value] 0.645% 18
.class tag 0.573% 16
[name=value] 0.538% 15
tag tag 0.502% 14
#id #id 0.430% 12
#id tag tag 0.358% 10
最重要的四个建议习惯
1.以#id开始
任何情况下,请从id选择器开始,哪怕不存在这个id,也请为选择器操作添加一个id。因为这样选择器会从一个相对末端的DOMNode开始。

2.使用tag.class代替.class

关于选择器性能,jQuery官方文档有这么一段描述:

For example, “.class” is far more popular than “tag.class” even though
the second one is much more performant. What’s especially important
about this is that the degree of performance hit isn’t that much of an
issue. For example, the difference between 4ms and 30ms is virtually
imperceptible.

标签是有限的,而类则可以看作是拓展标签的语义的一种方法,那么大部分情况下,使用同一个类的标签也是相同的。

3.尽可能使用parent>child而非parent child

“>”是child选择器,只从子节点里匹配,不递归。而” “是后代选择器,递归匹配所有子节点及子节点的子节点(后代节点)。
4.缓存选出的jQuery对象
  for (i = 0 ; i < 1000 ; i ++ ) … { 
      var myList = $( ‘ .myList ‘ ); 
     myList.append( ‘ This is list item ‘ + i); 

// case 2 
var myList = $( ‘ .myList ‘ ); 

for (i = 0 ; i < 1000 ; i ++ ) … { 
     myList.append( ‘ This is list item ‘ + i); 
}

如果选出结果不发生变化的话,不妨缓存选出的jQuery对象,哪怕只有一会儿。比如下面的代码里,这种性能差异就被循环放大了,养成缓存jQuery对象的习惯可以让你在不经意间就完成主要的性能优化。其他建议习惯

1.摒除表达式中的冗余部分,类似于#id2 #id1 或者 tag#id1 的表达式中,都存在冗余部分,实际上只要#id1即可。
2.选择特定的表单元素使用[name=x
虽然name选择器写法上属于属性选择器,但是实际上普通的属性选择器使用的是递归遍历子节点来匹配,而name选择器解析优先级更高,并调用DOM内置
函 数getElementsByName。虽然在IE和Opera里,指定了name但未指定id的DOMElement也会可以使用
getElementById得到,但是在jQuery里,为了保证跨浏览器,$(“#id”)会多做一次判断,把这些不一致的结果给过滤掉。所以
name选择器成了jQuery下的唯一选择。

3.选择同一type的input元素使用[:type]

这是唯一符合需要的简单写法。

4.有条件的使用反向选择器,反向选择器是指类似于”:not(exp)”的表达式。反向选择器实际上性能并不比同逻辑的正向选择器差很多。而在一些情况
下,为了达到反向选择器的效果,
我们或许要写出很复杂的表达式,或需要添加额外的类,或需要选出结果后再筛选一遍。这都不如使用反响选择器,无论是在性能上还是在保持逻辑的简单上。而
jQuery 1.3里,反向选择器得到了增强,之前只可以接受简单的反向表达式。关于jQuery 1.3的变化,大家也可以参考( jQuery
1.3 发布

)

5.有条件的使用prev + next,在语义化的DOM里,我们常常使用结构来为两个DOMElement建立关系,以表达它们对应的实体的意义。

请参考下面的html片段

< div id =”entities” > 
< div id =”entityid” class =”entity” > 
< div class =”namelabel” > name </ div > 
< div class =”name” > entityname </ div > 
</ div > 
</ div >
当我们需要对所有.entity的.namelabel进行操作的的时候,我们可以
用$(“#entities>div.entity>div.namelabel”)来选择。这里的关系就是通过.entity
和.namelabel父子节点的结构来建立的。

不过有的时候我们无法选出一个合适的父节点来,例如<dt></dt><dd></dd>,或
是<label></label><input/>。

其实相邻节点也是我们惯用的表达关系的结构,而且这种关系用jQuery选择器效率比父子选择器更好。

prev + next用来表示1对1的关系,在1对多的情况下,可以考虑使用prev ~ siblings

结论:jQuery的选择器引擎非常强大,正因为如此,我们才更应该谨慎的并充分的使用它。

来源:http://space.cnblogs.com/group/topic/9737

在”最常用的选择器使用”比之前版本的引擎更快。(什么是”最常用的选择器使用”,请参见 http://ejohn.org/blog/selectors-that-people-actually-use
)

实际上,选择器引擎的运用对于页面性能起了至关重要的作用。使用合适的选择器表达式可以轻易的提高性能、增强语义并简化逻辑,而你所需要做的,不过是培养几个习惯而已

jQuery.noConflict()

没有评论

2010 年 10 月 13 日 at 下午 2:33分类:jQuery

运行这个函数将变量$的控制权让渡给第一个实现它的那个库。
这有助于确保jQuery不会与其他库的$对象发生冲突。在运行这个函数后,就只能使用jQuery变量访问jQuery对象。例如,在要用到$(“div p”)的地方,就必须换成jQuery(“div p”)。

Run this function to give control of the $ variable back to whichever library first implemented it.
This helps to make sure that jQuery doesn’t conflict with the $ object of other libraries. By using this function, you will only be able to access jQuery using the ‘jQuery’ variable. For example, where you used to do $(“div p”), you now must do jQuery(“div p”).

返回值

jQuery

示例

将$引用的对象映射回原始的对象。

jQuery 代码
  • jQuery.noConflict();  
  • // 使用 jQuery  
  • jQuery(“div p”).hide();  
  • // 使用其他库的 $()  
  • $(“content”).style.display = ‘none’;   

  • 恢复使用别名$,然后创建并执行一个函数,在这个函数的作用域中仍然将$作为jQuery的别名来使用。在这个函数中,原来的$对象是无效的。这个函数对于大多数不依赖于其他库的插件都十分有效。

    jQuery 代码
  • jQuery.noConflict();  
  • (function($) {  
  •    $(function() {  
  •     // 使用 $ 作为 jQuery 别名的代码  
  •    });  
  • })(jQuery);  
  • // 其他用 $ 作为别名的库的代码  

  • 创建一个新的别名用以在接下来的库中使用jQuery对象。

    jQuery 代码
  • var j = jQuery.noConflict();  
  • // 基于 jQuery 的代码  
  • j(“div p”).hide();  
  • // 基于其他库的 $() 代码  
  • $(“content”).style.display = ‘none’;  
  • jquery.fn.extend与jquery.extend的区别和使用

    没有评论

    2010 年 10 月 12 日 at 下午 7:46分类:JavaScript

    jQuery为开发插件提拱了两个方法,分别是:

    JavaScript代码

  • jQuery.fn.extend(object);   
  • jQuery.extend(object);   
  • jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。

    jQuery.fn.extend(object);给jQuery对象添加方法。

    fn 是什么东西呢。查看jQuery代码,就不难发现。

     JavaScript代码

  • jQuery.fn = jQuery.prototype = {      
  •    init: function( selector, context ) {//….    
  •   
  •    //……   
  •   
  • };   
  • 原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。

    虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。

    jQuery便是一个封装得非常好的类,比如我们用 语句 $(“#btn1″) 会生成一个 jQuery类的实例。

    jQuery.extend(object); 为jQuery类添加添加类方法,可以理解为添加静态方法。如:

     XML/HTML代码

  • $.extend({   
  •   
  •   add:function(a,b){return a+b;}   
  •   
  • });   
  • 便为 jQuery 添加一个为 add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,

    JavaScript代码
  • $.add(3,4); //return 7  
  • jQuery.fn.extend(object); 对jQuery.prototype进得扩展,就是为jQuery类添加“成员函数”。jQuery类的实例可以使用这个“成员函数”。

    比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:

    JavaScript代码
  • $.fn.extend({        
  •         
  •      alertWhileClick:function(){        
  •        
  •          $(this).click(function(){        
  •        
  •               alert($(this).val());        
  •           });        
  •         
  •       }        
  •         
  • });        
  •         
  • $(“#input1″).alertWhileClick(); //页面上为:<input id=”input1″ type=”text”/>    
  • $(“#input1″) 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。

     真实的开发过程中,当然不会做这么小白的插件,事实上jQuery提拱了丰富的操作文档,事件,CSS ,Ajax、效果的方法,结合这些方法,便可以开发出更加 Niubility 的插件。

    自己写的练习:

    $(function(){
     $.extend({bin:function(a,b){
      return  a+b;
     }})
     var x = $.bin(3,4);
     //alert(x);
     $.fn.extend({
      yan:function(){
       $(this).click(function(){
        alert($(this).val());
       })
      }
     })
     $(“#button”).yan();
     //var b = $.browser;alert(b.opera); //返回浏览器的类型
     $.each( [0,1,2], function(i, n){ //遍历对象或者是数组或者是json数据:$.each( { name: “John”, lang: “JS” }, function(i, n){alert( “Name: ” + i + “, Value: ” + n ); });
      //alert( “Item #” + i + “: “+ n );
     });
     $.extend({change:function(array){ //自己写的一个让数组的组倒着显示的插件
      var arr = array;
      var ar  = new Array;
      for(var i = arr.length;i >= 0;i–){
       ar[i] = arr[arr.length - i];
      }
      return ar;
     }
     })
     var tempArr=[0,1,2];
     var b = $.change(tempArr);alert(b);
    })

    用PHP实现文件下载

    没有评论

    2010 年 10 月 12 日 at 下午 2:03分类:PHP | WEB开发

    //简单的用header头实现文件下载的例子:

    <?php
    // We’ll be outputting a PDF
    header(‘Content-type: application/pdf’);

    // It will be called downloaded.pdf
    //header(‘Content-Disposition: attachment; filename=”downloaded.pdf”‘);

    // The PDF source is in original.pdf
    readfile(‘original.pdf’);
    ?>

    //将整个过程写成一个函数如下:

    <?php
    function dl_file($file,$tag = true){
    if (!is_file($file) ) { die(“404 File not found!”); }
    $way = $tag ? ‘attachment’ : ‘inline’; //attachment就是以附件的方式打开,inline就是在线打开
    $len = filesize($file);
    $filename = basename($file);
    $file_extension = strtolower(substr(strrchr($filename,”.”),1));

    switch( $file_extension ) {
    case “pdf”: $ctype=”application/pdf”; break;
    case “exe”: $ctype=”application/octet-stream”; break;
    case “zip”: $ctype=”application/zip”; break;
    case “doc”: $ctype=”application/msword”; break;
    case “xls”: $ctype=”application/vnd.ms-excel”; break;
    case “ppt”: $ctype=”application/vnd.ms-powerpoint”; break;
    case “gif”: $ctype=”image/gif”; break;
    case “png”: $ctype=”image/png”; break;
    case “jpeg”:
    case “jpg”: $ctype=”image/jpg”; break;
    case “mp3″: $ctype=”audio/mpeg”; break;
    case “wav”: $ctype=”audio/x-wav”; break;
    case “mpeg”:
    case “mpg”:
    case “mpe”: $ctype=”video/mpeg”; break;
    case “mov”: $ctype=”video/quicktime”; break;
    case “avi”: $ctype=”video/x-msvideo”; break;

    //The following are for extensions that shouldn’t be downloaded (sensitive stuff, like php files)
    case “php”:
    case “htm”:
    case “html”:
    case “txt”: die(“Cannot be used for “. $file_extension .” files!”); break;

    default: $ctype=”application/force-download”;
    }
    //Begin writing headers
    header(“Pragma: public”);
    header(“Expires: 0″);
    header(“Cache-Control: must-revalidate, post-check=0, pre-check=0″);
    header(“Cache-Control: public”);
    header(“Content-Description: File Transfer”);

    //Use the switch-generated Content-Type
    header(“Content-Type: $ctype”);

    //Force the download
    //关键的参数就是Content-Disposition:$way
    //$way的值为attachment就是以附件的方式打开
    //$way的值为inline就是在线打开
    $header=”Content-Disposition: “.$way.”; filename=”.$filename.”;”;
    header($header );
    header(“Content-Transfer-Encoding: binary”);
    header(“Content-Length: “.$len);
    @readfile($file);
    exit;
    }
    dl_file(“original.pdf”);
    ?>

    header的用法

    没有评论

    2010 年 10 月 12 日 at 下午 1:22分类:PHP | WEB开发

    原文地址:http://hi.baidu.com/zhj2011/blog/item/14da6e1a356065d8ac6e7503.html

    标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头
      与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件
      (http://www.w3.org/Protocols/rfc2068/rfc2068)。在 PHP 中送回 HTML 资料前,需先
      传完所有的标头。
      
      注意: 传统的标头一定包含下面三种标头之一,并只能出现一次。
      
      Content-Type: xxxx/yyyy
      Location: xxxx:yyyy/zzzz
      Status: nnn xxxxxx
      
      在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。
      
      使用范例
      
      范例一: 本例使浏览器重定向到 PHP 的官方网站。
        Header(“Location: http://www.php.net“;);
      exit;
      >?
      
      范例二: 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头
      header(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
      header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . “GMT”);
      header(“Cache-Control: no-cache, must-revalidate”);
      header(“Pragma: no-cache”);
      >?
      
      范例三: 让使用者的浏览器出现找不到档案的信息。
        header(“Status: 404 Not Found”);
      >?
      
      范例四:让使用者下载档案。
      
      header(“Content-type: application/x-gzip”);
      header(“Content-Disposition: attachment; filename=文件名\”);
      header(“Content-Description: PHP3 Generated Data”);
      ?>

    // fix 404 pages:
    header(‘HTTP/1.1 200 OK’);

    // set 404 header:
    header(‘HTTP/1.1 404 Not Found’);

    // set Moved Permanently header (good for redrictions)
    // use with location header
    header(‘HTTP/1.1 301 Moved Permanently’);

    // redirect to a new location:
    header(‘Location: http://www.example.org/’);

    // redrict with delay:
    header(‘Refresh: 10; url=http://www.example.org/’);
    print ‘You will be redirected in 10 seconds’;

    // you could also use the HTML syntax:// <meta http-equiv=”refresh” content=”10;http://www.example.org/ />

    // override X-Powered-By: PHP:
    header(‘X-Powered-By: PHP/4.4.0′);
    header(‘X-Powered-By: Brain/0.6b’);

    // content language (en = English)
    header(‘Content-language: en’);

    // last modified (good for caching)
    $time = time() – 60; // or filemtime($fn), etc
    header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s’, $time).’ GMT’);

    // header for telling the browser that the content
    // did not get changed
    header(‘HTTP/1.1 304 Not Modified’);

    // set content length (good for caching):
    header(‘Content-Length: 1234′);

    // Headers for an download:
    header(‘Content-Type: application/octet-stream’);
    header(‘Content-Disposition: attachment; filename=”example.zip”‘);
    header(‘Content-Transfer-Encoding: binary’);

    // load the file to send:readfile(‘example.zip’);
    // Disable caching of the current document:
    header(‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’);
    header(‘Expires: Mon, 26 Jul 1997 05:00:00 GMT’);

    // Date in the pastheader(‘Pragma: no-cache’);
    // set content type:
    header(‘Content-Type: text/html; charset=iso-8859-1′);
    header(‘Content-Type: text/html; charset=utf-8′);
    header(‘Content-Type: text/plain’);

    // plain text file
    header(‘Content-Type: image/jpeg’);

    // JPG picture
    header(‘Content-Type: application/zip’);

    // ZIP file
    header(‘Content-Type: application/pdf’);

    // PDF file
    header(‘Content-Type: audio/mpeg’);

    // Audio MPEG (MP3,…) file
    header(‘Content-Type: application/x-shockwave-flash’);

    // Flash animation// show sign in box
    header(‘HTTP/1.1 401 Unauthorized’);
    header(‘WWW-Authenticate: Basic realm=”Top Secret”‘);

    print ‘Text that will be displayed if the user hits cancel or ‘;
    print ‘enters wrong login data’;?>[/codes]

    global和$GLOBALS[]的区别

    没有评论

    2010 年 10 月 12 日 at 上午 9:19分类:PHP

    转自:http://blog.csdn.net/wangking717/archive/2009/10/10/4648769.aspx

    很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。

    根据官方的解释是

    1.$GLOBALS['var']是外部的全局变量本身

    2.global $var是外部$var的同名引用或者指针。

    举例说明一下:

    1. <?php  
    2. $var1 = 1;  
    3. $var2 = 2;  
    4. function test(){  
    5.     $GLOBALS['var2'] = &$GLOBALS['var1'];  
    6. }  
    7. test();  
    8. echo $var2;  
    9. ?>  

    正常打印结果为1

    1. <?php  
    2. $var1 = 1;  
    3. $var2 = 2;  
    4. function test(){  
    5.     global $var1,$var2;  
    6.     $var2 = &$var1;  
    7. }  
    8. test();  
    9. echo $var2;  
    10. ?>  

    意外打印结果为2

    为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。

    我们再来看一个例子吧。

    1. <?php  
    2. $var1 = 1;  
    3. function test(){  
    4.     unset($GLOBALS['var1']);  
    5. }  
    6. test();  
    7. echo $var1;  
    8. ?>  

    因为$var1被删除了,所以什么东西都没有打印。

    1. <?php  
    2. $var1 = 1;  
    3. function test(){  
    4.     global  $var1;  
    5.     unset($var1);  
    6. }  
    7. test();  
    8. echo $var1;  
    9. ?>  

    意外的打印了1。证明删除的只是别名|引用,起本身的值没有受到任何的改变。

    明白了吧?

    也就是说global $var其实就是$var = &$GLOBALS['var']。调用外部变量的一个别名而已

    jQuery技巧收集

    没有评论

    2010 年 10 月 11 日 at 下午 8:54分类:jQuery

    1、关于页面元素的引用
    通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

     

    2、jQuery对象与dom对象的转换
    只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。
    普通的dom对象一般可以通过$()转换成jquery对象。
    如:$(document.getElementById(“msg”))则为jquery对象,可以使用jquery的方法。
    由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
    如:$(“#msg”)[0],$(“div”).eq(1)[0],$(“div”).get()[1],$(“td”)[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
    以下几种写法都是正确的:
    $(“#msg”).html();
    $(“#msg”)[0].innerHTML;
    $(“#msg”).eq(0)[0].innerHTML;
    $(“#msg”).get(0).innerHTML;

    3、如何获取jQuery集合的某一项
    对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。有如下两种方法:
    $(“div”).eq(2).html();    //调用jquery对象的方法
    $(“div”).get(2).innerHTML; //调用dom的方法属性

    4、同一函数实现set和get
    Jquery中的很多方法都是如此,主要包括如下几个:
    $(“#msg”).html();    //返回id为msg的元素节点的html内容。
    $(“#msg”).html(“<b>new content</b>”);
    //将“<b>new content</b>” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content

    $(“#msg”).text();    //返回id为msg的元素节点的文本内容。
    $(“#msg”).text(“<b>new content</b>”);
    //将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中,页面显示<b>new content</b>

    $(“#msg”).height();    //返回id为msg的元素的高度
    $(“#msg”).height(“300″);//将id为msg的元素的高度设为300
    $(“#msg”).width();    //返回id为msg的元素的宽度
    $(“#msg”).width(“300″); //将id为msg的元素的宽度设为300

    $(“input”).val(“); //返回表单输入框的value值
    $(“input”).val(“test”); //将表单输入框的value值设为test

    $(“#msg”).click(); //触发id为msg的元素的单击事件
    $(“#msg”).click(fn); //为id为msg的元素单击事件添加函数
    同样blur,focus,select,submit事件都可以有着两种调用方法

    5、集合处理功能
    对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
    包括两种形式:
    $(“p”).each(function(i){this.style.color=['#f00','#0f0','#00f'][ i]})
    //为索引分别为0,1,2的p元素分别设定不同的字体颜色。

    $(“tr”).each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
    //实现表格的隔行换色效果

    $(“p”).click(function(){alert($(this).html())})   
    //为每个p元素增加了click事件,单击某个p元素则弹出其内容

    6、扩展我们需要的功能
    $.extend({
    min: function(a, b){return a < b?a:b; },
    max: function(a, b){return a > b?a:b; }
    }); //为jquery扩展了min,max两个方法
    使用扩展的方法(通过“$.方法名”调用):
    alert(“a=10,b=20,max=”+$.max(10,20)+”,min=”+$.min(10,20));

    7、支持方法的连写
    所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
    例如:
    $(“p”).click(function(){alert($(this).html())})
    .mouseover(function(){alert(‘mouse over event’)})
    .each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]});

    8、操作元素的样式
    主要包括以下几种方式:
    $(“#msg”).css(“background”);    //返回元素的背景颜色
    $(“#msg”).css(“background”,”#ccc”) //设定元素背景为灰色
    $(“#msg”).height(300); $(“#msg”).width(“200″); //设定宽高
    $(“#msg”).css({ color:”red”, background: “blue” });//以名值对的形式设定样式
    $(“#msg”).addClass(“select”); //为元素增加名称为select的class
    $(“#msg”).removeClass(“select”); //删除元素名称为select的class
    $(“#msg”).toggleClass(“select”); //如果存在(不存在)就删除(添加)名称为select的class

    9、完善的事件处理功能

    Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
    如:
    $(“#msg”).click(function(){alert(“good”)}) //为元素添加了单击事件
    $(“p”).click(function(i){this.style.color=['#f00','#0f0','#00f'][ i]})
    //为三个不同的p元素单击事件分别设定不同的处理
    jQuery中几个自定义的事件:
    (1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
    //当鼠标放在表格的某行上时将class置为over,离开时置为out。
    $(“tr”).hover(function(){
    $(this).addClass(“over”);
    },
    function(){
    $(this).addClass(“out”);
    });
    (2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
    $(document).ready(function(){alert(“Load Success”)})
    //页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价
    (3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
    //每次点击时轮换添加和删除名为selected的class。
    $(“p”).toggle(function(){
       $(this).addClass(“selected”);
    },function(){
       $(this).removeClass(“selected”);
    });
    (4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
    例如:
    $(“p”).trigger(“click”);    //触发所有p元素的click事件
    (5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
    从每一个匹配的元素中(添加)删除绑定的事件。
    例如:
    $(“p”).bind(“click”, function(){alert($(this).text());});//为每个p元素添加单击事件
    $(“p”).unbind();//删除所有p元素上的所有事件
    $(“p”).unbind(“click”) //删除所有p元素上的单击事件

     10、几个实用特效功能
    其中toggle()和slidetoggle()方法提供了状态切换功能。
    如toggle()方法包括了hide()和show()方法。
    slideToggle()方法包括了slideDown()和slideUp方法。

    11、几个有用的jQuery方法
    $.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
    $.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。

    $.each( [0,1,2], function(i, n){ alert( “Item #” + i + “: “+ n ); });
    等价于:
    var tempArr=[0,1,2];
    for(var i=0;i<tempArr.length;i++){
    alert(“Item #”+i+”: “+tempArr[ i ]);
    }
    也可以处理json数据,如
    $.each( { name: “John”, lang: “JS” }, function(i, n){alert( “Name: ” + i + “, Value: ” + n ); });
    结果为:
    Name:name, Value:John
    Name:lang, Value:JS
    $.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
    如:
    $.extend(settings, options);
    //合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在setting中。
    var settings = $.extend({}, defaults, options);
    //合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
    可以有多个参数(合并多项并返回)
    $.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
    如:
    var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
    tempArr内容为:[4,5,6]
    var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
    tempArr内容为:[2,3]
    $.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
    如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
    $.trim(str):删除字符串两端的空白字符。
    如:$.trim(“   hello, how are you? “);//返回”hello,how are you? ”

    12、解决自定义方法或其他类库与jQuery的冲突
    很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
    使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$(“#msg”)改为jQuery(“#msg”)。
    如:
    jQuery.noConflict();
    // 开始使用jQuery
    jQuery(“div p”).hide();
    // 使用其他库的 $()
    $(“content”).style.display = ‘none’;