Reader's Digest

Digest your Internet

PHP 应用技巧七则

Written By: dch1 - May• 01•08
PHP (Hypertext Preprocessor)是一种 HTML 内嵌式的语言,也是目前比较流行的网页编程语言。它支持的后端数据库种类凡多,几乎含盖了当前的所有数据库系统。同时它包含了一般语言有的数学运算、时间处理、文件系统、字符串处理、行程处理等功能,再加上它是免费的系统,使得成本与效益比,几乎等于无限大。
下面是我在用PHP做网站时,总结出一些小技巧,拿出来飨以大家。

1、判断某个函数是否被支持

由于在PHP中我们可以灵活的使用增加或者减少php支持的模块,所以有的时候我们在使用PHP之前,总是会首先确定某个模块是否被加载,比如,看看GD图形模块是否被支持,可以用下面的这段代码:

if(!function_exists(‘imagecreate’)) {
die(‘这个主机目前不支持GD图形模块’);
}
?>

同样的道理,我们可以利用类似的代码,测试 MSSQL,OCI等模块是否被支持。

2、在字符串中把网址改成超级链接

在网页中提交表单时,经常在提交的说明文本中出现一些网址,比如个人主页等信息,如果在显示时自动将其转为超级链接,那将是一件很惬意的事,就像用WORD编辑文档时自动出现超级链接一样。下面这段代码就很好的实现了其功能。

$string = “连接赛迪网http://www.ccidnet.com 站点”;
//注意:连接后需要有个空格或回车。
$string = eregi_replace(“http://([^ ,rn]*)”,”<a href={CONTENT} tarrget=_blank>{CONTENT}</a>”,$string);
$string = eregi_replace(“ftp://([^ ,rn]*)”,”<a href={CONTENT} target=_blank>{CONTENT}</a>”,$string);
print $string;
?>

3、用PHP处理多个同名复选框

如果一个表单中有多个同名复选框,在提交到php时却只有一个值,而并不像asp那样是一串用逗号分割的值。解决的方法是利用数组。将复选框的name后面加上[],例如: 改为:。这样php将得到一个叫pp的阵列。在提交的表单中先用Count(pp)来判断数组的个数即选中的个数,然后对数组进行分别处理就行了。

同样的道理也适应于处理下拉框的多选问题。

4、利用static实现表格的颜色隔行显示

我们用PHP从数据库查询数据,并将结果输出到浏览器上,如果结果有很多行,表格的bgcolor(背景色)如果全是单色的,浏览者会感觉不太舒服。那么怎样做使表格各行的颜色不同呢?请看下面代码:

function getcolor()
{
static $colorvalue;//定义一个静态变量
if($colorvalue==”#eeeeee”)
$colorvalue=”#F5F5F5″;
else $colorvalue=”#eeeeee”;
return($colorvalue);
}
print(“<table border=1>n”);//下面输出10行
for($i=0;$i<10;$i++)
{
$bcolor=getcolor();//换背景颜色
print(“<tr bgcolor=$bcolor>n”);
print(“<td>$i</td>n”);
print(“</tr>”);
}
print(“</table>n”);
?>

说明:

此程序中定义了一个静态变量static $colorvalue意思是在函数调用结束后,此变量$colorvalue还保留值,没有消失。当再次调用getcolor()函数时,变量$colorvalue的值是上次函数调用结束时$colorvalue的值。

5、在php中避免重复引用的办法

大家知道,在C语言中,我们可以用#define来定义一个MACRO名字,通过检查是否该MACRO名字定义过来决定该头文件是否被引用。在PHP中也有同样的问题,比如:A引用B,C, B引用C,如果不采取措施,C将被引用2次。这样可能会导致一些奇怪的问题。解决办法:定义一个全局变量,并且通过检查该变量是否定义过来解决这个问题.办法很简单,类似C。 只是这个全局变量我建议都用[‘user_packages’] [‘headfilename’]的命名规则。

if (!empty($GLOBALS[‘FOODTAILS’][‘GLOBALDEFINE’])) return;
$GLOBALS[‘FOODTAILS’][‘GLOBALDEFINE’] = true;
class FOODTAILS {…
};
?>

另外,在主程序中尽量采用require_once “headfiles.php”; 以避免重复引用。

6、如何避免表单的重复提交

我们在做网站时,常常为一些灌水文章而烦恼。有时,由于网络状况等原因用户不知道提交是否成功,也会再次提交同一份表单,这就造成了表单的重复提交不起。有一个简单的方法可以避免同一表单的重复提交。 首先,先定义一个session变量用来保存一个表单的提交序列号。这里我定义为“$userLastAction”。然后在表单里加入一个hidden变量,把值设为$userLastAction+1:> 最后,在处理提交之前判断表单是否已被提交过。

if($lastAction>$userLastAction){
$userLastAction++; // 序列号加1
// 处理表单数据
}
?>

这个技巧的主要原理是不允许用户回退后再次提交,也就是说回退后修改再提交也是不允许的,但是还是不能避免Ctrl-C/Ctrl-V的灌水办法。

7、下载文件的下载次数回填

我们在下载软件时,经常会看到此软件的下载统计次数,而这些统计数给网站管理员分析软件的受欢迎程度带来了方便。其实现原理是:在后端数据库中存放软件的唯一标识和下载数,在用户下载软件时,首先更新对应软件的下载次数即下载次数加1,然后再到下载文件上正式开始下载。请看下面的实现代码:

a、先建一数据表download (后端用MySql)

download表中含有下列两个字段:

id    下载的文件的唯一标识

downnum 下载次数,默认值为0

b、实现

假设已经从数据库取出:描述文件名 五笔字型 ;下载文件名:wbzx.zip ;标识号id值为2

处理后生成的超级链接代码为:

五笔字型

下面的代码download.php处理下载次数累计及根据传递的文件名定位下载文件。

//连接Mysql数据库代码略
$res=mysql_query(“update download set downnum=(downnum+1) where id=’$id'” ,$db);
header(“locationfilename”);
?>

PHP比ASP优秀的七个理由

Written By: dch1 - May• 01•08
ASP是微软公司实现动态网页的一种技术。ASP支持一些脚本语言,主要以VBScripp为主。与ASP相比较,你还可以选择另一中开放源代码编程语言——PHP,PHP可以运行在多种操作系统下,其中包括Linux和windows。
虽然ASP是一种不错的技术,但从长远考虑我相信PHP在将来的技术领域里会有不凡的表现。

我认为有七个理由可以说明PHP比ASP更优秀:

1、速度、速度、速度
当我第一次运行PHP脚本程序时,我不禁对自己说:“太快了”,当时我是在仪态166MHZ的机器上运行我的程序的,但运行的速度仍然很快。
ASP是永远也不会象PHP这样快的,因为ASP是建立在COM体系结构之上的。当用VBScript写ASP脚本时,实际上实在使用COM的对象,当向用户浏览器发送信息时,它用的是Response对象的write方法,当它访问数据库和文件系统的时候,它用的是其他的COM对象。这些COM对象的使用使运行速度下降。
在PHP代码中,所有的工作都运行在PHP的内存空间中,也就是说PHP不是基于COM对象的,所以的他的运行速度会快一些。
下面是我们在MSSQL7 40次运行一个查询语句的执行时间统计:
PHP Querying MSSQL7 时间(秒)
用 MSSQL extension 01.88
用 ODBC extension 09.54
用 ODBC via COM (ADO) 17.28
用OLEDB via COM 06.19
当我们使用PHP.ODBC,访问数据库用了9.54秒,而用COM接口去连接数据库需要比PHP所用的时间高80%。
OLEDB是微软的一种高速访问数据库的技术,他比ODBC要快。但当我们所PHP和OLEDB的效率实验时,结果是PHP的整体性能比OLEDB高200%,如此的出一个结论,如果不采用COM可以获得较快的执行速度。
当然PHP的执行速度还不是最快的,但我们才刚刚开始起步,我们会逐步的完善他,而且PHP是一种开放源代码编程语言,世界上许多程序员在不断的完善他的技术,相信他一定会比非开放源代码系统获得更高的执行速度的。

2、高级内存管理
在IIS4下,一个ASP脚本header.asp,如果被20个页面所包含,那么运行的时候,在内存当中会保留这20个header.asp的编译副本,IIS5解决了这个问题,但只有windows2000才支持IIS5,由于这种IIS5的不能向下兼容的原因,许多服务器仍然要使用IIS4下的低级的内存管理。
而在PHP中,不会存在这种问题,只有当require时,才会调用某个include文件。

3、没有后顾之忧
我非常憎恨的一件事情就是会买到一件不放心的产品,比如当你买了一辆汽车,但由于发动机是坏的,你需要更换他;当你买了一栋房子的时候,你要去修补漏雨的屋顶。
那么ASP旧乡这些产品一样,当你买了ASP之后,如果你需要加密技术,你就要买ASPEncrypt;当你需要Email管理时,你就要买ServerObjets Qmail;当你需要文件上传时,你还要买Artisans SA-FileUp.

4、MySQL使PHP更精彩
PHP与MySQL的组合既简单又精彩。PHP有许多管理和维护MySQL的工具,对MySQk的支持是最全面的。许多有用的函数如mysql_insert_id和mysql_affected_rows等,其他的数据库则没有。
ASP和PHP都是中型网站的较理想的解决方案,但PHP与MySQL的紧密结合使PHP更加优越。
MySQL的虚度比Microsoft Access速度快,Mssql和Oracle速度比MySQL要快,可是费用较高。

5、Java和C++的变成风格
这个优点只是一个看法。
我知道你不会相信一个Visual Basic程序员会因为PHP有Java和C++的编程风格而转向使用PHP,但你会相信有许多人还是喜欢Java和C++的,PHP是一种具有这两种语言的编程风格的较容易学习的语言。
PHP支持结构化编程,在VB因为他的继承性使用类还是较少的。而PHP的象Java和C++一样的继承性使一个大型的程序中到处都充满了类的影子。

6、Bug的处理。
你是否曾经要求Microsoft修改ASP的一些Bug呢?如果你不是一个象Boeing一样的组织,你无法获得迅速而恰当的修改,把么当你遇到Bug而停止工作时,如果这个Bug不修改,你将无法继续你的工作的。
PHP,当你发现Bug时,你可以修改他,如果你没有专家的水平,你可以请专家修改,并且你的修改会得到开放代码组织的接受和认可。

7、移植性
Microsoft经常修改ASP,下一版本叫ASP+,现在已经开始测试。我相信他们会修改许多我曾经提到过的问题。但也无庸质疑的,Microsoft会将你限制在他们的产品范围之内的。
我曾经是一个苹果机的程序员,当windows95问世后,我开始转变,但许多原来的代码都无法在windows95下运行,这些代码现在被放在一边,我非常的遗憾。所以我不希望在windows下再出现这样的悲剧。
不要忘记Novell曾经也象Microsoft的网络操作系统一样热及一时,但现在已经没有许多人用了,那么Microsoft也会这样的。
我找到了PHP,我仍旧在windows下工作,但我知道PHP代码可以运行在Solaris、Linux和许多其他的操作系统中,我的心里感到安慰。

介绍几本 PHP 书籍和一些 PHP 相关资源链接

Written By: dch1 - May• 01•08
相关链接:
http://www.php.net PHP 官方站点,包含非常全面的 PHP 信息,能够从这里获得帮助。
http://pear.php.net PEAR 官方主页。
http://smarty.php.net 官方 Smarty 模板引擎主页。
http://news.php.net 热闹非凡的 PHP 讨论社区。
http://bugs.php.net 在这里报告你发现的 PHP 的 BUG 。
http://snaps.php.net/ 在这里总能找到最新版本的 PHP 源代码和压缩包。
http://cvs.php.net
http://qa.php.net
http://www.zend.com Zend 公司官方站点。
http://www.mysql.com MySQL 公司官方网站
http://www.apache.org Apache 的官方站点
http://www.phpe.net 超越 PHP,里面有很多经典文章和 PHP Class 下载。
http://expert.csdn.net 有一个人气不错的 PHP 讨论板块,我也在那受益不浅。
http://blog.csdn.net/countstars/ 我的 Blog,如果有任何问题或者建议等,可以到这里和我交流。
http://www.openphp.cn 最后这个,是我正在写的一个 PHP 技术站点,希望不久的将来能够完成它,并为喜欢 PHP 的朋友提供更多的 PHP 资源。

下面推荐我所看过的,认为很不错的,和 PHP 相关的一些书目,这些书都放在我的电脑旁边,学习 PHP 准备一些学习书籍是很必要的,即使 Internet 上面已经提供能很多 PHP 的极其相关资源。:
1.《PHP 程序设计》:
Programming PHP
出版社:中国电力出版社
原出版社:O’Reilly&Associates,Inc
译作者:[美]Rasmus Lerdorf &Kevin Tatroe著 邓云佳等译
出版日期:2003年7月
定价:68¥
字数:519千字 页数:544
说明:该书编写者之一是 PHP 的创造者 Rasmus Lerdorf,本书深入浅出,有很多不错的建议和技巧,融合了作者多年 PHP 开发的井眼,非常不错的一本 PHP 书籍。我感叹一句:里面一些经验和技巧总结真是太棒了。
2.《PHP & MYSQL Web数据库应用开发指南》
原书名:Web Database Applications with PHP&MySQL
出版社:中国电力出版社
原出版社:O’Reilly&Associates,Inc
译作者:Hugh E.Williams等著 谢君英 欧阳宇译
出版日期:2003年5月
定价:69.00¥
字数:570千字 页数:599
说明:该书通过一个很好的例子来说明 PHP 和 MySQL 的交互,包括数据库的正规化设计等,推荐这本书的原因是他将程序实例化,并且使用各种技巧来解决 PHP 和 MySQL 数据库的交互,不过阅读该书的时候要有一定的 PHP 基础,该书在亚马逊上是五星级图书。第二版也出来了。值的一读,当你跟着作者做完那套系统后,你会发现你的 PHP 水平真的提高了非常之多。
3. 《PHP 经典实例》
原书名:PHP Developer’s Cookbook
出版社:中国电力出版社
原出版社:Pearson Education
译作者:STERLING HUGHES等著 徐牧等译
出版日期:2003年4月
定价:39.00¥
字数:536千字 页数:359
说明:该书作者之一也是 PHP 开发组成员。该书不是系统的 PHP 学习书目,该书通过很多非常有用的例子,讲述 PHP 的诸多功能,里面包含了非常多的经验和总结以及技巧。深入的探讨了 PHP 各个方面的内容,不是很厚,但是真的非常有价值。
4. 《MySQL 核心编程》
原书名:Core MySQL:The Serious Developer’s Guide
出版社: 清华大学出版社
原出版社:Pearson Education
译作者: (美)Leon Atkinson 著  周靖 许青松
出版日期: 2003-4-1
定价:69.00¥
页数: 552
说明:一个好的 MySQL 工具是官方的 MySQL 手册,我有几本关于 MySQL 的书,其中一本是 O’reilly 的,不过感觉不是很好,因此又买了这本 MySQL 的系统书。一口气看了一上午,很是通俗易懂,深入浅出,特别是从各个范式讨论数据库设计,详细的内置函数讲解,详细的语句说明,非常不错的一本书,虽然书中有少许错误,呵呵。
5. 《JavaScript 权威指南(第四版)》
原书名:JavaScript:The Definitive Guide,Fourth Edition
出版社:机械工业出版社
原出版社:O’Reilly&Associates,Inc.
译作者:David Flanagan著 张铭泽等译
出版日期:2003年1月
定价:99¥
字数:964千字 页数:1015
说明:一本非常经典 JavaScript 书籍,目前已经到了第四版本,如果你真的要投注 Web 开发的话,一本关于 JavaScript 的系统书籍是必需的。在一些处理中,它能帮你做很多事情,并且让你更容易控制 HTML 代码,特别的,我的正则表达式知识是从这里学到的,很详尽。

PHP Blog
Personal Blog

Aaron Wormus : http://www.wormus.com/aaron/

Adam Trachtenberg : http://www.trachtenberg.com

Andrei Zmievski : http://www.gravitonic.com

Avenger : http://blog.phpe.net

Bitflux : http://blog.bitflux.ch

Binzy Wu : http://0926.net/blog/

Chris Shiflett : http://shiflett.org

David Sklar : http://www.sklar.com/blog/

Derick Rethans : http://derickrethans.nl

George Schlossnagle : http://www.schlossnagle.org/~george/blog/

EasyChen : http://blog.ibkmk.com

Harry Fuecks : http://www.sitepoint.com/blog-view.php?blogid=9

HaoHappy : http://blog.csdn.net/haohappy2004/

Ilia Alshanetsky : http://ilia.ws

James Cox : http://imajes.info

John Coggeshall : http://blog.coggeshall.org

Justin Wu : http://www.phpsalon.com

Marco Tabini : http://blogs.phparch.com/mt/

Martin Fowler : http://martinfowler.com/bliki/

Miguel de Icaza : http://primates.ximian.com/~miguel/activity-log.php

phpComplete : http://phpcomplete.com/

Rasmus Lerdorf : http://lerdorf.com/

sebastian : http://www.sebastian-bergmann.de/blog/

ShenKong : http://blog.csdn.net/countstars/

Sterling Hughes : http://www.edwardbear.org/serendipity/

Wez Furlong : http://netevil.org

PHP Website

PHP Official Site: http://www.php.net

Online Manual: http://www.php.net/manual/zh/

Smarty Template Engine: http://smarty.php.net

PEAR: http://pear.php.net

PECL: http://pecl.php.net

PHP Snapshots: http://snaps.php.net

PHP-GTK: http://gtk.php.net

DataBase Site

MySQL Official Site: http://www.mysql.com

SQLite Official Site: http://www.sqlite.org

PostgreSQL Official Site: http://www.postgresql.com

PostgreSQL Chinese Site: http://www.pgsqldb.org

Scripts Site

PHP Classes: http://www.phpclasses.org

PHP code exchange: http://px.sklar.com

Softwares Download

PHP: http://www.php.net/downloads.php

PHP Manual: http://www.php.net/download-docs.php

Apache: http://httpd.apache.org/download.cgi

MySQL: http://dev.mysql.com/downloads/

SQLite: http://www.sqlite.org/download.html & http://pecl.php.net/package/SQLite

Other Resource

Sitepoint: http://www.sitepoint.com

PHP Hub: http://www.phphub.com

Zend: http://www.zend.com

Open Source Web Development: http://www.devshed.com

PHP Freaks: http://www.phpfreaks.com

PHP Builder: http://www.phpbuilder.com

WeberDev: http://www.weberdev.com

PHP Editor Review: http://www.php-editors.com