Docstoc

php mysql

Document Sample
php mysql Powered By Docstoc
					第一页 PHP/MySQL 简介 您应该听说过开放源代码软件(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 支持 Internet 开发的一些前沿技术。这些技术包括身份认证、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 目录下。如果您打开这个文件,会发现 里面有很多有趣的东西可以改。现在,把含有:
extension=php3_mysql.dll

内容的那一行的注释去掉。

如果您使用的是 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-mysql=/usr/local/mysql -with-apache=/path/to/apache/dir

如果您打算以外部 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。 在上面的程序中您最先注意到的可能是定界符,也就是以<?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”的数据库。 选项告诉 MySQL 我们使用的是 root -u 用户。 下一步, 我们要加入一些数据, 这里我们用的示例数据是大家都喜欢用的员工数 据库。我们将会用到我前面提到过的数据文件。如果您想在这方面多了解一些, 可以查阅 MySQL 所带的手册或访问 http://www.turbolift.com/mysql/网站。 把下面的文字复制到一个文件中,把该文件存在 MySQL 的 bin 目录下 (我假定文 件名是 mydb.dump)。

CREATE TABLE employees ( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, first varchar(20), last varchar(20), PRIMARY KEY (id), address varchar(255), position varchar(50), '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');

UNIQUE id (id));INSERT INTO employees VALUES (1,'Bob','Smith',

如果文字是折行的,请确保每一个 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 循环 在这一课里,我们将会继续深入下去, 使用 PHP 和 MySQL 来写出一些简单而有用 的页面。我们从昨天创建的数据库开始,显示库中的数据,但是会再稍微加以润 色。 首先,我们用下面的代码来查询数据库内容。

<html> <body>

<?php

$db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); echo "<table border=1>\n"; echo "<tr><td>姓名</td><td>职位</td></tr>\n"; while ($myrow = mysql_fetch_row($result)) { printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myro w[1], $myrow[2], $myrow[3]);

} echo "</table>\n";

?> </body> </html>

您可能已经注意到,我们在这个程序里加进了一些新东西。最明显的是 while() 循环。该循环是说,只要数据库里还有记录可读(使用 mysql_fetch_row()函数), 那就把该记录赋给变量$myrow,然后执行大括号({})内的指令。仔细看一下这 里,这部分是比较重要的。 我们应该注意一下 mysql_fetch_row()函数。这里有一点小问题,它返回的是一个 数组,必须以数组下标来访问其中的某个字段。第一个字段下标为 0,第二个是 1,依此类推。在执行某些复杂查询时,这么做简直实在是太烦琐了。

现在我们更仔细地研究一下循环过程。 程序前几行我们在第一课的例子中已经看 到过了。然后,在 while()循环中,我们从查询结果中读取一条记录并把该记录 赋给数组$myrow。接着,我们用 printf 函数把数据中的内容显示在屏幕上。随后, 循环反复执行,读取下一条记录赋给$myrow。这样继续下去,直到所有记录都已 被读取完为止。 使用 while()循环的一个好处是,如果数据库查询没有返回任何记录,那您也不 会收到错误信息。在刚执行循环语句时,循环条件就不满足,不会有任何数据赋 给$myrow,程序就直接往下运行了。 但是如果查询未返回任何数据, 我们怎么让用户知道这一点呢?我们也许该提供 点儿相关的消息给用户吧。这是可以做到的,下面我们就看看怎么做。>> 第二页 if-else 请看下面的程序。

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { echo "<table border=1>\n"; echo "<tr><td>姓名</td><td>住址</td></tr>\n"; do { printf("<tr><td>%s %s</td><td>%s</tr>\n", $myrow["first"], $myrow["last"], $myrow["address"]); } while ($myrow = mysql_fetch_array($result)); echo "</table>\n";

} else { echo "对不起,没有找到记录!"; }

?>

</body>

</html>

这段程序中包含有不少新内容,不过这些内容都相当简单。首先是 mysql_fetch_array()函数。该函数与 mysql_fetch_row()十分相近,只有一点 不同:使用这个函数时, 我们可以通过字段名而不是数组下标来访问它返回的字 段,比如$myrow["first"]。这样我们就可以省不少力气了。另外,程序中还加 进了 do/while 循环和 if-else 条件判定语句。 if-else 条件判定语句的含意是,如果我们成功地把一条记录赋给了$myrow 变 量,那就继续;否则,就跳到 else 部分,执行那里的指令。 do/while 循环是我们在上页中用户的 while()循环的一个变体。我们要用到 do/while 的原因是:在最初的 if 语句中,我们已经把查询返回的第一条记录赋 给变量$myrow 了。如果这时我们执行一般的 while 循环(比如,while ($myrow = mysql_fetch_row($result)),那我们就会把第二条记录赋给$myrow,而第一 条记录就被冲掉了。但是 do/while 循环可以让我们执行一次循环体内容之后再 来判定循环条件。因此,我们就不会不小心漏掉第一条记录了。 最后,如果查询结果没有任何记录的话,程序就会执行包含在 else{}部分的那 些语句。如果您想看到这部分程序的执行情况,可以把 SQL 语句改为 SELECT * FROM employees WHERE id=6,或改成其他形式,使得查询结果中没有任何记录。 下面我们来扩充一下循环 if-else 代码,使得页面内容更加丰富。相信您会喜 欢的。>> 第三页 第一个程序脚本 我们刚刚学到了循环语句, 下面我们将在一个更加实际一点的例子中看看如何运 用它。但是在这之前,您应该知道如何处理 Web 表格、查询参数串,以及表单的 GET 方法和 POST 方法。不久之前我们刚刚有文章介绍这部分内容,您如果对这 一部分还不太熟悉的话可以看看那篇文章。

现在,我们要处理查询参数串,正如您所知道的,有三种方法可以把参数内容写 入到查询参数串中。第一种是在表格中使用 GET 方法; 第二种是在浏览器的地址 栏中输入网址时直接加上查询参数; 第三种是把查询参数串嵌入到网页的超链接 中,使得超链接的内容象下面这样:<a href="http://my_machine/mypage.php3?id=1">。 我们现在要用到最后这一种方 法。 一开始,我们再来查询我们的数据库,列出员工姓名。看看下面的程序,其中大 部分内容我们都已经很熟悉了。

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]); } while ($myrow = mysql_fetch_array($result)); } else { echo "对不起,没有找到记录!"; } ?> </body> </html>

这里没什么特别的,只是 printf 函数有些不同。那我们就来仔细研究一下。 首先要注意的是, 所有的引号前面都有一个反斜杠。这个反斜杠告诉 PHP 直接显 示后面的字符,而不能把后面的字符当作程序代码来处理。另外要注意变量 $PATH_INFO 的用法。该变量在所用程序中都可以访问,是用来保存程序自身的 名称与目录位置的。我们之所以用到它是因为要在页面中再调用这个程序本身。 使用$PATH_INFO,我们可以做到,即使程序被挪到其他目录,甚至是其他机器上 时,我们也能保证正确地调用到这个程序。 正如我刚才提到的, 程序所生成的网页, 其中包含的超链接会再次调用程序本身。 不过,再次调用时,会加入一些查询参数。 PHP 见到查询参数串中包含有“名字=值”这样的成对格式时,会作一些特别的 处理。它会自动生成一个变量, 变量名称与取值都与查询参数串中所给定的名称 和取值相同。 这一功能使得我们可以在程序中判断出是第一次执行本程序还是第 二次。我们所要做的只是问问 PHP$id 这个变量是否存在。 当我知道这个问题的答案后, 我可以在第二次调用程序时显示一些不同的结果出 来。请看:

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); // display individual record // 显示单条记录内容 if ($id) { $result = mysql_query("SELECT * FROM employees WHERE id=$id",$db); $myrow = mysql_fetch_array($result); printf("名: %s\n<br>", $myrow["first"]); printf("姓: %s\n<br>", $myrow["last"]); printf("住址: %s\n<br>", $myrow["address"]);

printf("职位: %s\n<br>", $myrow["position"]); } else { // show employee list // 显示员工列表 $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { // display list if there are records to display // 如果有记录,则显示列表 do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]); } while ($myrow = mysql_fetch_array($result)); } else { // no records to display // 没有记录可显示 echo "对不起,没有找到记录!"; } } ?> </body> </html>

程序开始变得复杂了,所以我在这里面加了注释,来解释一下到底发生了什么。 您可以用//加入单行注释,或者用/*和*/来括住大段的注释。

到这里,我们已经学会了第一个真正有用的 PHP/MySQL 脚本程序!现在,我们要 看看怎样把 Web 表格加进来,并且向数据库发送数据。>> 第四页 向服务器发送数据 现在我们从数据库读取数据已经没有太多困难了。 但是怎么反过来向数据库发送 数据呢?其实这不是 PHP 的问题。 首选,我们创建一个带有简单表格的网页。
<html> <body> <form method="post" action="<?php echo $PATH_INFO?>"> 名:<input type="Text" name="first"><br> 姓:<input type="Text" name="last"><br> 住址:<input type="Text" name="address"><br> 职位:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="输入信息"> </form> </body> </html>

同样要注意$PATH_INFO 的用法。就象我在第一课里讲到的,您可以在 HTML 代码 中的任意位置使用 PHP。您也会注意到,表格中的每一个元素都对应着数据库中 的一个字段。这种对应关系并不是必须的,这么做只是更直观一些,便于您以后 理解这些代码。 还要注意的是,我在 Submit 按钮中加入了 name 属性。这样我在程序中可以试探 $submit 变量是否存在。于是,当网页被再次调用时,我就会知道调用页面时是 否已经填写了表格。 我应该指出,您不一定要把上面的网页内容写到 PHP 程序中, 再返过来调用程序 本身。您完全可以把显示表格的网页和处理表格的程序分开放在两个网页、三个 网页甚至更多网页中, 悉听尊便。 放在一个文件中只是可以使内容更加紧凑而已。

那好,我们现在加入一些代码,来检查用户在表格中输入的内容。我会把用 $HTTP_POST_VARS 把所有查询参数变量都显示出来,这只不过是为了证明 PHP 确实 把所有变量都传给了程序。这种方法是一个很有用的调试手段。 如果您要想看全 部的变量,可以用$GLOBALS。

<html> <body> <?php if ($submit) {

// 处理表格输入 while (list($name, $value) = each($HTTP_POST_VARS)) { echo "$name = $value<br>\n"; } } else{

// 显示表格 ?> <form method="post" action="<?php echo $PATH_INFO?>"> 名:<input type="Text" name="first"><br> 姓:<input type="Text" name="last"><br> 住址:<input type="Text" name="address"><br> 职位:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="输入信息"> </form>

<?php } // end if,if 结束 ?> </body> </html>

程序现在运行正常,那我们现在就可以取到表格输入的内容, 并把它们发送给数 据库。

<html> <body> <?php if ($submit) {

// 处理表格输入 $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "INSERT INTO employees (first,last,address,position) VALUES ('$first','$last','$address','$position')"; $result = mysql_query($sql); echo "Thank you! Information entered.\n"; } else{

// 显示表格内容 ?> <form method="post" action="<?php echo $PATH_INFO?>">

名:<input type="Text" name="first"><br>

姓:<input type="Text" name="last"><br>

住址:<input type="Text" name="address"><br>

职位:<input type="Text" name="position"><br>

<input type="Submit" name="submit" value="输入信息"> </form>

<?php

} // end if,if 结束

?>

</body>

</html>

您现在已经向数据库中插入数据了。 不过还有很多完善的工作要做。 如果用户没 有填写某一栏怎么办?在需要填入数字的地方填了文字怎么办?或者填错了怎 么办? 别担心。我们一步一步来。>>

第五页 修改数据 在个教程中,我都把要执行的 SQL 语句放到一个变量($sql)中,然后才用 mysql_query()来执行数据库查询。在调试时这是很有用的。如果程序出了什么问 题,您随时可以把 SQL 语句的内容显示出来,检查其中的语法错误。 我们已经学习了如何把数据插入到数据库中。 现在我们来学习如何修改数据库中 已有的记录。数据的编辑包括两部分: 数据显示和通过表格输入把数据返回给数 据库,这两部分我们前面都已经讲到了。然而,数据编辑还是有一点点不同,我 们必须先在表格中显示出相关的数据。 首先, 我们回过头再看看第一课的程序代码, 在网页中显示员工姓名。 但是这次, 我们要把数据显示在表格中。程序看起来象下面这样:

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); if ($id) {

// 查询数据库 $sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); ?> <form method="post" action="<?php echo $PATH_INFO?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>"> 名:<input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br>

姓:<input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br> 住址:<input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br> 职位:<input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br> <input type="Submit" name="submit" value="输入信息"> </form> <?php } else {

// 显示员工列表 $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]); } } ?> </body> </html>

我们刚才是把字段内容写入到相应表格元素中的 value 属性里, 这是相应简单的。 我们再往前进一步,使程序可以把用户修改过的内容写回数据库去。同样,我们 通过 Submit 按钮来判断是否处理表格输入内容。还要注意,我们用的 SQL 语句 稍稍有些不同。

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); if ($id) { if ($submit) { $sql = "UPDATE employees SET first='$first',last='$last', address='$address',position='$position' WHERE id=$id"; $result = mysql_query($sql);

echo "谢谢!数据更改完成\n"; } else {

// 查询数据库 $sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); ?> <form method="post" action="<?php echo $PATH_INFO?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>">

名:<input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br>

姓:<input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br>

住址:<input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br>

职位:<input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br>

<input type="Submit" name="submit" value="输入信息"> </form> <?php } } else {

// 显示员工列表 $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]); } } ?> </body> </html>

就是这样。在这个程序中已经包含了我们学过所大多数特性。您也已经看到,我 们在一个 if()条件判别语句中又加了一个 if()语句,来检查多重条件。 下面,我们要把所有东西全都加在一起,写出一个很好的程序来。>> 第六页 完整的程序 在本课结束前, 我们要把所有东西加入到一个程序中, 使它具有增加、 编辑修改、 删除记录的功能。这是前面所有内容的一个延伸,也可以作为极好的复习方法。 看看下面的程序。

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); if ($submit) {

// 如果没有 ID,则我们是在增加记录,否则我们是在修改记录 if ($id) { $sql = "UPDATE employees SET first='$first',last='$last', address='$address',position='$position' WHERE id=$id"; } else { $sql = "INSERT INTO employees (first,last,address,position) VALUES ('$first','$last','$address','$position')"; }

// 向数据库发出 SQL 命令 $result = mysql_query($sql);

echo "记录修改成功!<p>"; } elseif ($delete) {

// 删除一条记录 $sql = "DELETE FROM employees WHERE id=$id"; $result = mysql_query($sql);

echo "记录删除成功!<p>"; } else {

// 如果我们还没有按 submit 按钮,那么执行下面这部分程序 if (!$id) {

// 如果不是修改状态,则显示员工列表 $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a> \n", $PATH_INFO, $myrow["id"], $myrow["first"], $myrow["last"]); printf("<a href=\"%s?id=%s&delete=yes\">(DELETE)</a>< br>", $PATH_INFO, $myrow["id"]); } } ?> <P> <a href="<?php echo $PATH_INFO?>">ADD A RECORD</a>

<P> <form method="post" action="<?php echo $PATH_INFO?>"> <?php if ($id) {

// 我们是在编辑修改状态,因些选择一条记录 $sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); $id = $myrow["id"]; $first = $myrow["first"]; $last = $myrow["last"]; $address = $myrow["address"]; $position = $myrow["position"];

// 显示 id,供用户编辑修改 ?> <input type=hidden name="id" value="<?php echo $id ?>"> <?php } ?>

名:<input type="Text" name="first" value="<?php echo $first ?>"><br>

姓:<input type="Text" name="last" value="<?php echo $last ?>"><br>

住址:<input type="Text" name="address" value="<?php echo $address ?>"><br>

职位:<input type="Text" name="position" value="<?php echo $position ?>"><br>

<input type="Submit" name="submit" value="输入信息"> </form> <?php } ?> </body> <`/html>

这段程序看起来很复杂,但实际上并不难。程序主要有三个部分。第一个 if() 语句检查我们是否已经按下了那个“输入信息”的数据提交按钮。 如果是,程序 再检查$id 是否存在。如果不存在,那我们就是在增加记录状态,否则,我们是 在修改记录状态。 接下来我们检查变量$delete 是否存在。如果存在,我们是要删除记录。注意, 第一个 if()语句检查的是用 POST 方法发送来的变量, 而这一次我们检查的是 GET 方法中传递过来的变量。 最后,程序默认的动作是显示员工列表和表格。同样,我们要检查变量 $id 是否 存在。如果存在,我们就根据它的值检索出相应的记录显示出来。否则,我们会 显示一个空的表格。 现在,我们已经把所学的东西全部都放在一个程序里头了。我们用到了 while() 循环,用到了 if()语句,并且执行了全部的 SQL 基本操作 - SELECT、INSERT、 UPDATE 以及 DELETE。另外,我们也知道如何在不同的网页之间通过 URL 和表格 输入来互相传递信息。 在第三课里,我们要学习如何为网页增加智能化处理能力。 第一页 基本函数

欢迎来到本教程的第三课,也是最后一课。如果您已经学过第一课和第二课,那 么您已经掌握了 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 的开发人员自己也会参 加邮件讨论组,还有许多经验丰富的高手们,他们都可以帮助您解决问题。


				
DOCUMENT INFO
Shared By:
Tags:
Stats:
views:438
posted:11/15/2007
language:Chinese
pages:79
Guillaume Guillaume
About