分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程PHP专区 → 文章内容

转贴--PHP/MySQL三日通(3)webhunter

  • 作者:佚名    来源:不详    发布时间:2006-2-26 2:00:25
  • 字体大小:
PHP/MySQL三日通 第三天



原作者
Graeme Merrall





----------------------------------------------------------------------

----------



目录



PHP
/MySQL教程第一天

一、PHP
/MySQL简介

二、安装MySQL

三、安装PHP

四、第一个脚本

五、装载数据库

六、测试



PHP
/MySQL教程第二天

一、
while循环

二、
if-else

三、第一个程序脚本

四、向服务器发送数据

五、修改数据

六、完整的程序



PHP
/MySQL教程第三天

一、基本函数

二、数据校验

三、处理常规表达式

四、简便方法

五、进阶技巧







----------------------------------------------------------------------

----------



一、基本函数



  欢迎来到本教程的第三课
也是最后一课。如果您已经学过第一课和第二课

那么您已经掌握了MySQL和PHP的安装及编程的基本知识。下面我们要介绍PHP的

一些其他函数
这些函数可能会对您有用使您的开发过程更加简单。首先我们

来看看头文件



  大家应该知道头文件的一些基本概念吧
文件是一个外部文件它的内容

被包含到主程序中。方法也十分简单
程序文件中引用头文件这个头文件

就会包含进来了。在PHP中使用头文件
会涉及两个函数include()require(

)。这两个函数差别很小却很重要所以我们要认真研究一下。require()函数

工作方式与XSSI相类似
不管在程序的哪个部分使用了这个函数只有程序一开

始运行
文件的内容就被作为程序本身的一部分来处理。因此如果您在一个

条件判定语句中使用了
require()函数那么即使这个条件即使不为真文件

会被包含进来。



  而
include()函数只是在执行到这一条语句时才会把头文件内容包含进来。如

程序没运行到这里
那PHP是不会管它的。这就意味着您在条件判定部分使用

include它会完全按照您希望的那样工作。



  还有
如果您用了require()函数而您指定的头文件并不存在那么程序

会停止运行并产生错误。如果您用了
include()程序会产生一个警告信息但是

会继续运行。您可以亲自试一下
运行下面的程序然后把include()换成requi

re
()再比较两个程序运行的结果。



 
<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是如何定义的。在head

er
.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
()这个函数了。它只是简单地返回一个数字该数字等

于被测变量中所包含的字符个数。这里
我修改一下上面的程序检查一下$fir

st与$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,如果您创建了一个函数,想让这个函数也使用那个$myna
me变量(值也相同),那是不行的。您可以在函数内部创建一个变量,名字也叫

$myname,这两个变量可以各平相处,而各自取不同的值。不过我可不建议您这么

做!您如果真的这么做了,等半年后您再来修改这样的程序时,您可能就会被弄

糊涂了。



  那我们现在就来创建一个函数,先来个简单的。我们要给它取个名字,指定

它要接收什么的变量。在调用这个函数之前,我们还得定义这个函数。



 



  <html>



<body>



<?php



function  addnum($first, $second) {



$newnum = $first + $second;



return $newnum;



}



echo addnum(4,5);



?>



</body>



</html>





这就行了
首先我们创建了第一个自己的函数。我们定义了两个新变量$fir

st和$second
注意它们是怎样被定义的。在调用这个函数时要给这两个变量按

它们出现的顺序赋好值
- 4赋给$first5赋给$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="gra

eme"
) {



$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的开发人员自己也会参加

邮件讨论组
还有许多经验丰富的高手们他们都可以帮助您解决问题。



  祝您编程顺利
一切顺利


<