您应该听说过开放源代码软件(oss),除非最近六到八个月来您一直住在火星上。这场运动有着巨大的冲击力,已引起一些大公司的注意。象oralce、informix,还有多家公司都开始把他们的主力数据库产品移植到oss的产物之一 - linux操作系统上。
如果您有足够的技术力量,拥有一个复杂庞大的关系数据库系统(rdbms)则是如虎添翼。但是也许您对数据库还刚刚入门,您刚刚读了jay的文章,决定自己也来搞一个数据驱动的网站。可是您也许会发现您缺乏必要的资源来运行asp服务器或昂贵的数据库系统(您也不需要这些东西)。您需要一些免费的、支持unix的东西。
那么我建议您使用php和mysql。这两样东西加在一起,对于开发数据驱动的网站这项工作而言,真是最佳组合。其实用不着我多费唇舌解释。一项.netcraft组织的非官方调查显示,应用php的主机数目由1998年6月的7,500台跃升至1999年3月的410,000台。不错吧?这两种软件的组合还在webcon98大会上赢得了年度数据库产品大奖,还得了一座漂亮的奖杯。
mysql是一个小巧灵珑的数据库服务器软件,对于小型(当然也不一定很小)应用系统是非常理想的。除了支持标准的ansi sql语句,它还支持多种平台,而在unix系统上该软件支持多线程运行方式,从而能获得相当好的性能。对于不使用unix的用户,它可以在windows nt系统上以系统服务方式运行,或者在windows 95/98系统上以普通进程方式运行。
php是一种服务器端解释的脚本语言。如果你接触过asp的话,那么您对于在html页面中嵌入代码应该是比较熟悉了。php代码在服务器一端被解释转变成普通的html页面内容,送给浏览器一端。这种模式使得我们可以用它来完成相当复杂的功能。
除了免费这一点(当然,mysql也有一些使用许可方面的限制),php-mysql的组合还可以跨平台运行,这意味着您可以在windows上开发,然后在unix平台上运行。另外,php也能作为标准的cgi进程来运行,此时它是一个独立的脚本解释器,或者是apache的一个嵌入模块。
如果您有兴趣使用其他数据库服务器的话,php也支持informix、oracle、sybase、solid和postgresql ,以及通用的odbc。
php支持inte.net开发的一些前沿技术。这些技术包括身份认证、xml、动态图象生成、wddx、共享内存,以及动态pdf文档等等,不一而足。如果您还不满意的话,php是很容易扩展的,所以只要您有编程能力,您尽可以自己大展身手一番。
最后要说的是,两种软件都是大量程序员协同开发的,因此文档及邮件列表等支持方式很多。程序错误的修正很快,而如果您要求加入新功能的话,总会有人考虑您的要求,并且在可行性足够高的前提下加以实现。
说得够多了!我们来看看这篇教程里都有些什么内容吧。
第一课讲的是在unix和windows环境下安装这两个软件。如果您不太关心这个问题(也许您是在isp的服务器上开发),您可以直接跳到第一个示例程序,从那里开始您的奇妙之旅。
在第二课里,我们要学习一些更加复杂的脚本功能,比如循环、处理用户输入,以及与数据库交换数据等等。
第三课要讲的是确认功能,以及如何使您的脚本程序清晰简练。
我们开始吧。>>
二、安装mysql
快点行动,拿到这些软件包,仔细研究一下吧。这可不是件容易的事儿。你从获取软件包、编译软件包到安装软件包的过程中都有不少的选择项。我们先从mysql开始,因为有了它才能运行php。
mysql中央网站是http://www.mysql.com/。为了方便人们下载使用(这软件还是比较大的),全球有许许多多的镜像网站。为更有效地利用因特网,请找一个就近的网站下载。
在这时候你也会有多种选择。如果你是发烧友的话,可以下载源代码;否则,网上也有各种平台上运行的预先编译过的二进制文件可以直接下载。
另外,mysql还为windows用户准备了一个共享软件版本,它的版本号稍低一些。如果你想要最新的版本,得花钱买一个软件许可。mysql还提供了odbc驱动程序,使前端应用程序可以访问mysql数据库。有关其他一些详细信息在它的网站上都有得介绍,您可以去看看。
预先编译过的unix版本和windows版本都很简单,只须解包即可使用,不需要做太多说明了。因此,我们来介绍一下源代码的编译。windows用户请记住,您需要运行mysqld程序,该程序是在mysql/bin目录下。
下载压缩过的软件包文件,放在一个目录下。使用gzip和tar来解压缩和解包。比较快的做法是使用下面这样的命令:
gunzip < mysql-xxxx.tar.gz tar xvf -
其中,xxxx是你自己任取的一个版本标记。上面的命令将创建一个名为mysql-xxxx目录,所有的源程序文件都在这个目录下。通过执行cd mysql-xxxx命令转入该目录,仔细阅读其中的多个readme文件install文件。在遇到某些问题时,这些文件可能会帮上大忙呢。
mysql带有一些便利的配置脚本程序。只须简单地键入./configure,您就可以让这些程序为您完成很多工作。如果您需要明确指定要做的事情,可以使用./configure -help命令,它会给您列出你可以使用的选项。例如,如果您正在一台内存较少的机器上进行编译,那么可以使用--with-low-memory选项。我喜欢把mysql安装在一个总目录下,而不是安装在机器上多个目录下,所以我会指定安装目录,并指定-prefix选项。
您还可以指定许多其他选项,象编译过程中要略掉哪些部分、保留哪些部分等。我们不妨假定要全部安装在服务器的/usr/local/mysql目录下。这意味着我们将键入./configure -prefix=/usr/local/mysql命令。
配置脚本程序运行时会检查您的系统,然后生成一些文件来保证编译的顺利进行。如果该脚本程序失败,它也会显示一些有用的错误信息告诉您失败的原因。大家经常会遇到脚本程序在寻找多线程库文件时失败。此时您应当检查一下系统中是否已经安装了mit-pthreads,如果没有,那么请您安装该软件。linux用户则必须安装linuxthreads。这些库文件对于mysql的多线程运行模式(也就是运行它自己的多个版本〕是非常关键的。
如果一切都顺利进行的话,只须简单键入make命令,然后就可以去泡杯咖啡了。mysql是相当复杂的程序,编译起来得用一段时间。如果发现错误,可以检查文档,看看只否您漏掉了某些与您的操作系统有关的准备工作。
接下来,键入make install命令,所有必需的文件都会安装到相应的目录。您差不多就可以开始使用了!如果您是mysql新手,以前从未安装过mysql,那您得创建默认的许可权限才能安装,因此请键入...scripts/mysql_install_db来进行相应的设置。
就这样。我们的准备工作完成了。再下面所要做的就是在机器启动时自动启动数据库,并在关机时自动关闭数据库。是的,这项工作也有一个专门的脚本程序。mysql.server start命令可以启动数据库,而mysql.server stop可以关闭数据库。实在是再简单不过了。如果您想手动启动数据库(这样就不用重启机器了),你以进到安装mysql的最上层目录(/usr/local/mysql)然后键入bin/safe_mysqld &命令。
我们已经完成了一半了。接下来是php部分。>>
三、安装php
好,看到这里时,希望您已经把mysql安装好并运行起来了。那实在是太有意思了!下面是php...这个过程要容易一些,不过那些大量的选项还是使人眼花缭乱。当然,您大可不必惊慌。您随时可以重头再来,重新编译php,根据需要来加入或去掉某个选项。
php的老家在http://www.php.net/。这个网站信息量极大,从开发项目内容到软件错误报告都有。和mysql一样,您可以选一个离您最近的镜像网站下载。很显然,您得到网站的downloads部分去下载php。
这里您的选择不是很多。有一些预选编译好的二进制文件,但那都是实验性的。如果您不是在windows平台上,那就下载源代码,自己编译一下吧。
但是我们还是先谈谈windows。在使用php时,一般的作法是在windows系统上开发,然后在unix服务器上运行。您最终可能也会选择这种方式,这就需要您对两种平台下的安装都很熟悉才行。
下载windows二进制文件后,您可以用您喜欢的任何一种zip解压缩程序,把软件包中的文件解压到c盘的php3目录下。软件包中的readme文件对安装过程中的细节作了部分说明,但是我们在这里再对这个文件中的关键内容做个读者文摘:如果您不想把php安装在c:\php3目录,而是别的目录,那么您得编辑解压缩出来的文件中那个.inf文件。
在php3目录中,您会发现很多.dll文件。把所有文件名不是以php_开头的那些.dll文件都移到\windows\system目录下。然后,把php.ini-dist文件改一下名,改成php3.ini,并把它移到\windows目录下。如果您打开这个文件,会发现里面有很多有趣的东西可以改。现在,把含有:
内容的那一行的注释去掉。
如果您使用的是win32平台上的apache服务器,那么请设置apache,使其能够识别并解释php文件。您需要在http.conf文件或是srm.conf文件(具体是哪一个文件取决于您使用的apache软件的版本)中加入下一行:
action application/x-httpd-php3 "php3/php.exe"
addtype application/x-httpd-php3 .php3
或者,如果您使用的是iis,那么请用鼠标右键单击php_iis_reg.inf文件,并选择“安装”。您得重新启动系统,才能使刚才所做的改动生效。
ok,说完了windows,再来说说unix。当然,我们要从源代码开始编译。与mysql相似,把源文件下载、解包。php也同样包含一个配置脚本程序,可是您不能完全使用默认设置。运行./configure -help more命令,可以逐页地观看有哪些新的、有趣的选项。您必须选择是把php编译成外部cgi程序还是apache内嵌模块。如果您正在使用apache web服务器,并且您可以对它进行重新编译的话,请选择内嵌模块方式,这种方式运行更快,使用也更简便。否则,您可以选cgi方式。另外,您还得指定将对mysql的支持部分编译进去。
现在我们假定要以内嵌模块方式编译,并带有mysql支持部分。如果随后您需要增加其他选项或库文件的话,可以在以后再加进去。键入下面的命令:
./configure -with-apache=/path/to/apache/dir -with-mysql=/usr/local/mysql
如果您打算以外部cgi程序方式来编译的话,请去掉-with-apache选项。配置程序运行起来后,会创建相应的系统文件。接下来简单地执行make命令就行了。
又可以喝一杯咖啡了。如果您在此时感到坐立不安的话,不必担心。每个人在初次安装php的时候都有一点近不及待的感觉。再多喝点咖啡就是了。
如果您选择cgi程序方式来编译,那么现在可以就可以使用了。只须把产生的可执行文件复制到cgi程序目录下就行了。如果您使用apache内嵌模块方式来编译,要再执行一下make install命令,把有关文件复制到apache目录下。在该目录下,您可以按照apache的文档说明,向其中加入php模块,并重新编译apache。
现在您得告诉web服务器如何通过php程序来处理页面内容。如果您使用的不是apache,那您需要查阅web服务器软件的文档,看看如何让它处理后缀是.php3的文件。apache 1.3.x版本的用户仅须在httpd.conf或srm.conf文件中加入:addtype application/x-httpd-php3 .php3。如果您使用的是cgi程序方式,那您在addtype前面还得加入下面内容:
action application/x-httpd-php3 "php3/php.exe
就是这样。您的运气还不那么差,现在mysql也运行起来了,php也工作正常了。别忘了,在遇到问题时可以去查阅常见问题解答和软件文档。还可以试试电子邮件讨论组。
既然我们已经进行了这么多,下面我们可以实际操练了。>>
四、第一个脚本
如果我告诉您真正难过的一关已经过了,您一定会很高兴。软件的安装过程总是无法预料,因为系统跟系统之间可以说是千差万别。不过您运气不错,数据库运行起来,php也编译安装完毕,web服务器也可以正确处理扩展名为.php3的文件了。
我们下面就开始正式上路,要写第一个脚本程序了。创建一个文本文件,在其中加入下面的内容:
<html>
<body>
<?php
$myvar = "hello world";
echo $myvar;
?>
</body>
</html>
现在,访问相应的url,例如,http://myserver/test.php3。您应该可以看到页面中包含“hello world”的文字。如果您看到的是错误信息,查一下php文档,看看软件设置是否正确无误。
就是这样了!这是您的第一个php程序。如果您查看一下这个页面的html源代码,您会发现里面只有hello world 这样的文字。
那是因为php引擎过滤了文件内容,对其中的代码作了处理,转换成了标准的html。
在上面的程序中您最先注意到的可能是定界符,也就是?lt;?php开始的那几行。这个标记说明后面是php代码,而?>表示代码结束。php的强大之处在于,这些代码可以以多种不同方式放在任意位置 - 我是说任意位置。后面我们会看到一些很有趣的例子,现在我们还是从最简单的开始。如果您愿意,也可以设置php,让它使用短标记,<?和?>,但这与xml会发生冲突,所以要小心使用。如果您是从asp转向php,您甚至可以让php使用<%和%>作为定界符。
您还会注意到每行后面的分号。这些分号称为分隔符,用于分隔不同的指令。您可以把所有的php代码写在一行里,用分隔符把命令分开。但是那样看起来很乱,所以我们在每个分号后面都另起一行。记住,每行最后都要以分号结束。
最后,您会注意到myvar这个字以$符号开头。这个符号告诉php,这是一个变量。我们把“hello world”赋给变量$myvar。一个变量可以是数字,也可以是数组。不管怎样,所有的变量都是以$符开头。
php真正强大之处来源于它的函数。函数,基本上是处理指令序列。如果您把所有的选件都编译进php,总共会有超过700个函数。这些函数可以让您做很多事情。
现在我们再加进一些mysql的内容进去。>>
五、装载数据库
现在,我们要加入mysql的内容了。要想知道php中包含哪些选项,或服务器方面的一些情况,一种简便的方法是使用函数phpinfo()。创建一个象下面这样的程序:
<html>
<body>
<?php
phpinfo();
?>
</body>
</html>
保存这个程序,在浏览器中访问这个文件。您会看到网页中包含了一些有趣的、有用的信息,象这样。这些信息是有关服务器、web服务器内部环境变量、php中包含的选项,等等。在第一段extensions中,找到以mysql开头的一行。如果没有找到,那说明mysql支持选项并没有编译进php。您可以再检查一下安装步骤,查阅一下php文档,看您是否漏掉了什么。
如果找到了mysql那一行,那您可以继续了。
从mysql数据库中读取数据之前,我们得先往数据库里放一些数据。在现在这一阶段,还没有一个简便的方法来做这件事情。大多数的php程序都带有一个数据文件,该文件包含一些数据来创建并激活mysql数据库。这个过程不在本教程范围之内,所以让我来替您做这件事情吧。
mysql使用它自己的用户权限表。在安装时,会创建一个默认的用户(root),该用户是没有口令的。数据库管理员可以根据需要来增加用户并赋予用户各种不同的权限,但这项工作完全可以另写一本书了,所以我们只使用root用户。如果您自己管理服务器和数据库,为root用户分配一个口令是很重要的。
总之,我们还是接着说数据库吧。对win32用户来说,很对不起,不过您要在dos下做些工作。您不得不使用dos窗口,或者在“执行”窗口中键入所有命令。别忘了,输入命令时要带上mysql/bin的目录名。unix用户可以在mysql的bin目录下输入命令,但命令必须以./开头,才能让程序运行起来。
我们要做的第一件事情是实际创建出数据库。在命令行下,键入下列命令:
mysqladmin -u root create mydb
这样就创建了一个名为“mydb”的数据库。-u选项告诉mysql我们使用的是root用户。
下一步,我们要加入一些数据,这里我们用的示例数据是大家都喜欢用的员工数据库。我们将会用到我前面提到过的数据文件。如果您想在这方面多了解一些,可以查阅mysql所带的手册或访问 http://www.turbolift.com/mysql/网站。 < br>
把下面的文字复制到一个文件中,把该文件存在mysql的bin目录下(我假定文件名是mydb.dump)。
create table employees ( id tinyint(4) default '0' not null
auto_increment, first varchar(20), last varchar(20),
address varchar(255), position varchar(50), primary key (id),
unique id (id));insert into employees values (1,'bob','smith',
'128 here st, cityname','marketing manager');
insert into employees values (2,'john','roberts','45 there st ,
townville','telephonist');
insert into employees values (3,'brad','johnson','1/34 nowhere blvd,
snowston','doorman');
如果文字是折行的,请确保每一个insert语句都是另起一行的。现在,我们要把数据加入到mydb数据库中了。在命令行下,键入下面的命令:
mysql -u root mydb < mydb.dump
此时您应该不会遇到什么错误。如果真的出错了,请仔细检查一下是否因上面的文字折行而引起错误。>>
六、测试
ok,现在我们已经把数据导入到数据库中了。现在我们来处理这些数据。把下面的文字存入一个文件中,把该文件存在web服务器的文档目录下,后缀名为.php3。
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("select * from employees",$db);
printf("first name: %s<br>\n", mysql_result($result,0,"first"));
printf("last name: %s<br>\n", mysql_result($result,0,"last"));
printf("address: %s<br>\n", mysql_result($result,0,"address"));
printf("position: %s<br>\n", mysql_result($result,0,"position"));
?>
</body>
</html>
我来解释一下上面的代码。mysql_connect()函数负责以指定的用户名(本例中用户名是root)连接到指定机器(在本例中机器是本机localhost)上的mysql数据库。如果您想指定用户口令,您也可以把它送给这个函数。连接的结果保存在变量$db中。
随后,mysql_select_db()函数告诉php,我们要读取的数据库是mydb。我们可以在程序中同时连接到多台机器上的多个数据库,但目前我们还是限于连接一个数据库。
接下来,mysql_query()函数完成最复杂的部分。利用刚才得到的连接结果标识,该函数把一行sql语句送给mysql服务器去处理。返回的结果保存在变量$result中。
最后,mysql_result()函数显示sql查询命令所得到的各个字段的值。利用变量$result,我们就可以找到第一条记录,记录号是0,并将其中各字段的值显示出来。
如果您以前没用过perl或c语言,那么printf函数的语法格式会显得很奇怪。在上面的每一行程序中,%s代表表达式第二部分中的那个变量(例如,mysql_result($result,0,"position"))应该以字符串的形式显示出来。想更深入了解printf,请参阅php文档。
这一课我们就讲到这里了。我们已经成功地编译、安装和设置了mysql和php,并且运行了一个简单的程序来读取数据库中的信息。在 第二课里,我们会做一些更复杂的工作,来显示多行记录的数据,甚至与数据库互相交换数据。
一、 while循环一、基本函数
欢迎来到本教程的第三课,也是最后一课。如果您已经学过第一课和第二课,那么您已经掌握了mysql和php的安装及编程的基本知识。下面我们要介绍php的一些其他函数,这些函数可能会对您有用,使您的开发过程更加简单。首先我们来看看头文件。
大家应该知道头文件的一些基本概念吧?头文件是一个外部文件,它的内容被包含到主程序中。方法也十分简单:在程序文件中引用头文件名,这个头文件就会包含进来了。在php中使用头文件,会涉及两个函数:include()和require()。这两个函数差别很小,却很重要,所以我们要认真研究一下。require()函数工作方式与xssi相类似;不管在程序的哪个部分使用了这个函数,只有程序一开始运行,头文件的内容就被作为程序本身的一部分来处理。因此,如果您在一个条件判定语句中使用了require()函数,那么即使这个条件即使不为真,头文件也会被包含进来。
而include()函数只是在执行到这一条语句时才会把头文件内容包含进来。如果程序没运行到这里,那php是不会管它的。这就意味着,您在条件判定部分使用include时,它会完全按照您希望的那样工作。
还有,如果您用了require()函数,而您指定的头文件并不存在,那么程序将会停止运行并产生错误。如果您用了include(),程序会产生一个警告信息,但是会继续运行。您可以亲自试一下,运行下面的程序,然后把include()换成require(),再比较两个程序运行的结果。
<html>
<body>
<?php
include("emptyfile.inc");
echo "hello world";
?>
</body>
</html>
我喜欢把头文件的后缀名起成.inc,这样就可以把头文件和一般的程序区分开来。如果您也这么做,那么请您修改web服务器软件的配置文件,使它能够把.inc文件也当作php文件来处理。否则,黑客们也许会猜到您的头文件名,然后用浏览器把头文件内容以纯文本格式显示出来。此时如果您的头文件中有些机密信息(如数据库口令等)那就糟糕了。
那么,您用头文件来做什么呢?很简单!把对所有程序都通用的那些内容放到头文件里。象html文件头啦,脚注啦,数据库连接代码啦,还有您自己定义的一些函数什么的。把下面的文字拷贝到一个文件中,保存为header.inc。
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
?>
<html>
<head>
<title>
<?php echo $title ?>
</title>
</head>
<body>
<center><h2><?php echo $title ?></h2></center>
然后再创建另外一个文件,名字是footer.txt,该文件可以包含一些程序结束时用到的一些文字和标记。
现在,我们再来创建一个文件,这个文件里面是真正的php程序代码。试一下下面的代码,当然,您要确认mysql数据库服务器正在运行。
<?php
$title = "hello world";
include("header.inc");
$result = mysql_query("select * from employees",$db);
echo "<table border=1>\n";
echo "<tr><td>名字</td><td>职位</tr>\n";
while ($myrow = mysql_fetch_row($result)) {
printf("<tr><td>%s %s</td><td>%s</tr>\n", $myrow[1], $myrow[2], $myrow[3]);
}
echo "</table>\n";
include("footer.inc");
?>
看到发生了什么事了吗?头文件里的内容被合并到程序中,php把所有的代码都执行了一遍。注意在包含header.inc头文件之前$title是如何定义的。在header.inc中的代码可以访问到它的值。这样,网页的标题就被改掉了。现在,您可以在任何程序中使用header.inc头文件了,您所要做的不过是在每个主程序中为$title变量取一个合适的值。
头文件、html、条件判定语句,还有循环语句,这些东西加在一些,您就可以用最简练的代码,写出功能各异的各种复杂程序来。在与函数同时使用时,头文件更能发挥它的效力,我们后面就会看到。
接下去,我们会介绍精彩的部分:数据校验。>>
二、 数据校验
想象一下这样的情形:我们把数据库都设计妥当了,现在请用户输入信息来写到数据库中去。假设您有一个字段是要求数字类型的信息,比如价格;而某个可爱的用户,却在这一栏里输入了文字信息,使得您的应用程序的执行过程出现了故障。对您在sql语句中提供的文字类型的数据,mysql数据库拒不接受,并向您提出了“严正抗议”。
怎么办呢?您要用数据校验来防止以上状况发生。
简单地讲,数据校验是指我们对数据(通常是用户经由html表格传过来的)进行检查,看看它是否遵从一定的规则。规则可以是多种多样的,比如某一数据元素不能为空,或者要求某一数据项的内容必须满足一定的要求(例如前面的例子中要求必须是数字而不是文字,或者要求电子邮件地址中一定要包含一个“@”字等等)。
数据校验既可以在服务器一端作,也可以在客户端来作。php是用来作服务器一端的数据校验的,而javascript或其他客户端脚本编程语言则能够提供客户端的数据校验功能。本文说的是php,所以我们在这里着重介绍服务器端的校验。如果您想找一些现成的、在客户端运行的数据较验程序,那您可以去网猴程序库看看。
暂时把数据库放在一边不谈,我们先来说说php的数据校验方法。如果您愿意(或者说,您想记录我们要校验的那些数据的话),您可以在前面所建的员工数据库的里加入其他字段,很简单,用mysql的alter 语句就行了。
有好几个php功能都可以用来作数据校验的工作,有些很简单,有些则复杂一些。其中strlen()是比较简单的一个函数,它能够告诉我们一个变量的长度。
更复杂一点儿的是ereg(),这个函数可以处理完整的常规表达式来进行复杂的校验。我不想就常规表达式讲得太深,因为许多书都是专门写这个问题的。不过我会在下一页中给出一些简单的例子。
我们先从一个简单的例子开始吧。下面这个程序要检查一个变量是否存在。
<html>
<body>
<?php
if ($submit) {
if (!$first !$last) {
$error = "对不起,您必须填写所有的栏目!";
} else {
// 处理表格输入内容
echo "谢谢!";
}
}
if (!$submit $error) {
echo $error;
?>
<p>
<form method="post" action="<?php echo $php_self ?>">
第一栏: <input type="text" name="名" value="<?php echo $first ?>"><br>
第二栏: <input type="text" name="姓" value="<?php echo $last ?>"><br>
<input type="submit" name="submit" value="输入信息">
</form>
<?php
} // if结束
?>
</body>
</html>
这段程序中关键的地方是嵌套的条件判定语句。第一层检查用户是否按了发送数据的按钮。如果是,程序接着检查$first和$last两个变量是否都存在。那个 符号表示“或”,而 ! 符号表示“非”。那一句程序用一般语言描述就是“如果$first不存在或者$last不存在,那么就把 $error变量置成下面的值。”
接下来,我们再进一步,检查一段文字的长度。这对用户口令的检查是很有必要的,因为您不想让某些懒惰的用户输入只有一、两个字的口令,可能会要求他们输入六位长的口令。
我们已经讲到strlen()这个函数了。它只是简单地返回一个数字,该数字等于被测变量中所包含的字符个数。这里,我修改一下上面的程序,检查一下$first与$last的长度。
<html>
<body>
<?php
if ($submit) {
if (strlen($first) < 6 strlen($last) < 6) {
$error = "对不起,您必须填写所有栏目!";
} else {
// 处理表格输入内容
echo "谢谢!";
}
}
if (!$submit $error) {
echo $error;
?>
<p>
<form method="post" action="<?php echo $php_self ?>">
第一栏: <input type="text" name="名" value="<?php echo $first ?>"><br>
第二栏: <input type="text" name="姓" value="<?php echo $last ?>"><br>
<input type="submit" name="submit" value="输入信息">
</form>
<?php
} // if结束
?>
</body>
</html>
您可以执行一下这段程序,输入六个字或少于六个字的内容。这种校验很简单,但很有效?>
三、 处理常规表达式
我们稍微讲讲用ereg()和eregi()两个函数处理常规表达式。前面我已经提过,这些函数有的很简单,有的很复杂,看您的实际需要而定。
使用常规表达式,您可以对一个字符串进行检查,搜索其中的一些结构模式,判定这些模式是否满足您的规定。最普遍的用法包括检查电子邮件地址是否有效(当然,即使这种办法判定有效,也不能保证邮件地址真的存在)。
我们在这里不细究常规表达式的复杂细节了,仅仅给出几个实例。您可以使用上一页中用过的表格 - 把相应的程序代码复制过来,添加到下面的代码段中,就可以看到它是怎样工作的。
首先,我们要确保表格中各栏只能输入字母。下面的常规表达式在用户输入一个或多个小写字母时判定为真,而输入数字是不允许的:
if (!ereg("[a-z]", $first) !ereg("[a-z]", $last)) {
现在我们更进一步,检查字符串的长度是否是四到六位字符长。用[[:alpha:]]是检查字符是不是字母的简单方式。大括号内的数字检查字符个数。还要说明的是,^ 和 $ 分别代表字符串的开始和结束。
if (!ereg("^[[:alpha:]]{4,6}$", $first) !ereg("^[[:alpha:]]{4,6}$", $last)) {
最后,我们来构造一个常规表达式,来检验电子邮件地址的有效性。这种检验方式的效果已经引发了相当多的讨论。没有什么东西是十全十美的,不过我下面给出的这段程序还是十分奏效的。
我这段宝贝程序是从php邮件讨论组上得来的。那可是个好去处 - 常去看看吧。不错,这段程序看起来是有点乱糟糟的。
if (!ereg('^[-!#$%&\'*+\./0-9=?a-z^_`a-z{}~]+'.'@'.'[-!#$%&\'*+\/0-9=?a-z^_`a-z{}~]+\.'.
'[-!#$%&\'*+\./0-9=?a-z^_`a-z{}~]+$', $last)) {
别花太多时间来细究这段代码了,还是先到下一页内容吧。
四、 简便方法
前面的常规表达式怎么样?很有意思,是吧?要是在每个需要检查电子邮件地址的程序里都写上这么一段程序,那才真叫有意思呢?!想想看吧,得写那么乱七八糟的一段程序,还得写上那么多遍!...不过,当然了,还有更简便的方法。
还记得前面我们学过的头文件吗?它能让我们写一段程序,象是这个电子邮件地址的检查程序,然后把这段程序包含进多个程序里面去。这样,我们要改写这段程序时,只须改动一处就行了,不用修改多个文件。
但是,要做到这一点,我们必须用到函数。
我们已经用过很多次函数了。每次我们查询数据库或检查字符串长度时,我们都是用函数来做的。这些函数是php自带的。如果您是位热心的程序员,您可以用自己编写的函数来扩充php本身的功能。但对本教程而言,这部分内容是太过高深了一点。我们要创建的函数不是那一种,而是写在php脚本程序内部的函数。
函数就是一段程序代码,我们可以把一个或多个值传给这段代码,然后这段代码会处理我们传给它的数据并返回一个值。根据实际需要,函数可以很简单,也可以十分复杂。但是只要我们传进去一个数,然后能得到一个数,您管它里面有是复杂还是简单呢!这就是函数的可爱之处。
php里的函数与c语言里的函数表现差不多。当我们定义函数时,必须指明函数需要接收什么样的数据。一开始好象不太好理解为什么它要接收数据进去,不过这样可以防止发生一些怪异的问题。函数之所以能做到这一点,是因为函数里面的变量都是私有变量,也就是说,它只在该函数内部存在。例如,您在程序中有一个变量叫$myname,如果您创建了一个函数,想让这个函数也使用那个$myname变量(值也相同),那是不行的。您可以在函数内部创建一个变量,名字也叫$myname,这两个变量可以各平相处,而各自取不同的值。不过我可不建议您这么做!您如果真的这么做了,等半年后您再来修改这样的程序时,您可能就会被弄糊涂了。
那我们现在就来创建一个函数,先来个简单的。我们要给它取个名字,指定它要接收什么的变量。在调用这个函数之前,我们还得定义这个函数。
<html>
<body>
<?php
function addnum($first, $second) {
$newnum = $first + $second;
return $newnum;
}
echo addnum(4,5);
?>
</body>
</html>
这就行了!首先,我们创建了第一个自己的函数。我们定义了两个新变量,$first和$second,注意它们是怎样被定义的。在调用这个函数时,要给这两个变量按它们出现的顺序赋好值 - 4赋给$first,5赋给$second。然后我们简单地把这两个数加在一起,返回结果。“返回”在这里的意思是把结果送回去。在程序最后部分我们把数字9显示出来。
我们再来创建一个函数,让它对我们的数据库应用有点帮助。一个能妥善处理错误的函数怎么样?试试下面的程序:
<html>
<body>
<?php
function do_error($error) {
echo "噢,好象有点儿问题...<br>";
echo "系统报告的错误是:$error.\n<br>";
echo "最好是暂时关闭网站并通知系统管理员。";
die;
}
if (!$db = @mysql_connect("localhost","user", "password")) {
$db_error = "无法连接到mysql数据库";
do_error($db_error);
}
?>
</body>
</html>
在运行程序之前,试试关闭mysql数据库,或使用错误的用户名或口令。您会看到友好的、有用的错误信息 。细心的朋友会注意到在mysql_connect()函数之前的那个@符号。它会抑制系统错误信息,使得程序只能从do_error()函数那里得到有关的错误信息。您还会注意到,我们可以把一个在别处定义的变量作为参数传给函数,而不是在调用时直接赋一个值。
还记得我过函数使用的是私有变量吧?这话说得不完全对。事实上,您可以让函数访问到函数外面的变量。您可能要写一个函数,用它来查询数据库,然后把结果显示在多个网页中。您不想每次都把数据库连接标识都传给函数。在这种情况下,您可以把连接标识定义成一个全局的变量。例如:
<html>
<body>
<?php
function db_query($sql) {
global $db;
$result = mysql_query($sql,$db);
return $result;
}
$sql = "select * from mytable";
$result = db_query($sql);
?>
</body>
</html>
这是个很简单的函数,但重要的是,您在调用这个函数时,不必传递$db变量 - 您可以通过 global这个字使得函数可以访问到该变量。在这条语句中您可以定义多个全局变量,各个全局变量之间用逗号隔开。
最后,您可以使用可选参数,这样看起来您已经是真正的专家了。这里面关键的一点是,在函数中定义参数时要给它指定一个缺省值。然后您在调用这个函数时,如果不为该参数变量指定其他值,那么函数会自动把缺省值赋给这个变量。如果您指定了其他值,那么缺省值就不起作用了。
不太明白?比方说,您在连接数据库时,几乎总是连接到相同的服务器,并且使用相同的用户名和口令。不过有时候,您也需要连接到其他的服务器。看看下面的程序:
<html>
<body>
<?php
function db_connect($host = "localhost", $user="username", $pass="graeme") {
$db = mysql_connect($host, $username, $password);
return $db;
}
$old_db = db_connect();
$new_host = "site.com";
$new_db = db_connect($new_host);
?>
</body>
</html>
很“酷”是不是?在定义函数时,函数内部用到的变量也定义好了。第一次调用这个函数时,全部参数变量都是用的缺省值。第二次调用时,服务器名变了,而用户名和口令没有变。真是太棒了!
想想您在什么地方还能用到函数。您可以用函数来作数据校验,来完成常用的功能,等等。在对web网页上显示的文字作处理时,我用到了很多函数。我可以一次完成对文字的检查、解析和修改,来加入换行符和html标记等。
现在,剩下的就是我要给您的一些忠告了。
五、进阶技巧
谈起数据库开发,我们有很多东西要学。如果您还没有学习过怎样进行数据库设计,和怎样在不同的平台上可靠地运行数据库,那么请您赶快去找本这方面的好书来读一读。这方面的能力会带给您无法估量的好处,从长远的眼光看,它会为您节省大量的时间与精力。还有,认真学学mysql。这是一个复杂而有趣的数据库,有很多不错的文档。学学数据库的表结构、数据类型,还有sql。如果您真正掌握了sql,您可以完成相当多的实际工作。
最后,还有php。您想要的一切几乎都可以在php的网站上找到,包括全面的文档、邮件讨论组的讨论内容、程序代码库,等等。学习php的一个绝好的办法是研究用户手册中给出的实例,并查阅网上的代码。网友们发表的代码包括许多函数和类,您可以在自己的程序中直接使用,而不必自己从头来过。另外,如果您遇到问题,邮件讨论组是一个非常值得利用的资源。php的开发人员自己也会参加邮件讨论组,还有许多经验丰富的高手们,他们都可以帮助您解决问题。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器