PHP/MySQL三日通-第二天(三)

一、基本函数

五、修改数据

欢迎来到本教程的第三课,也是最后一课。如果您已经学过第一课和第二课,那么您已经掌握了MySQL和PHP的安装及编程的基本知识。下面我们要介绍PHP的一些其他函数,这些函数可能会对您有用,使您的开发过程更加简单。首先我们来看看头文件。

在个教程中,我都把要执行的SQL语句放到一个变量中,然后才用mysql_query()来执行数据库查询。在调试时这是很有用的。如果程序出了什么问题,您随时可以把SQL语句的内容显示出来,检查其中的语法错误。

大家应该知道头文件的一些基本概念吧?头文件是一个外部文件,它的内容被包含到主程序中。方法也十分简单:在程序文件中引用头文件名,这个头文件就会包含进来了。在PHP中使用头文件,会涉及两个函数:include()和require()。这两个函数差别很小,却很重要,所以我们要认真研究一下。require()函数工作方式与XSSI相类似;不管在程序的哪个部分使用了这个函数,只有程序一开始运行,头文件的内容就被作为程序本身的一部分来处理。因此,如果您在一个条件判定语句中使用了require()函数,那么即使这个条件即使不为真,头文件也会被包含进来。

我们已经学习了如何把数据插入到数据库中。现在我们来学习如何修改数据库中已有的记录。数据的编辑包括两部分:数据显示和通过表格输入把数据返回给数据库,这两部分我们前面都已经讲到了。然而,数据编辑还是有一点点不同,我们必须先在表格中显示出相关的数据。

而include()函数只是在执行到这一条语句时才会把头文件内容包含进来。如果程序没运行到这里,那PHP是不会管它的。这就意味着,您在条件判定部分使用include时,它会完全按照您希望的那样工作。

首先,我们回过头再看看第一课的程序代码,在网页中显示员工姓名。但是这次,我们要把数据显示在表格中。程序看起来象下面这样:

还有,如果您用了require()函数,而您指定的头文件并不存在,那么程序将会停止运行并产生错误。如果您用了include(),程序会产生一个警告信息,但是会继续运行。您可以亲自试一下,运行下面的程序,然后把include()换成require(),再比较两个程序运行的结果。

$#@60;html$#@62;$#@60;body$#@62;$#@60;?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);?$#@62;$#@60;form method=”post”
action=”$#@60;?php echo $PATH_INFO?$#@62;”$#@62;$#@60;input
type=hidden name=”id” value=”$#@60;?php echo $myrow[“id”]
?$#@62;”$#@62;名:$#@60;input type=”Text” name=”first”
value=”$#@60;?php echo $myrow[“first”]
?$#@62;”$#@62;$#@60;br$#@62;姓:$#@60;input type=”Text”
name=”last” value=”$#@60;?php echo $myrow[“last”]
?$#@62;”$#@62;$#@60;br$#@62;住址:$#@60;input type=”Text”
name=”address” value=”$#@60;?php echo $myrow[“address”]
?$#@62;”$#@62;$#@60;br$#@62;职位:$#@60;input type=”Text”
name=”position” value=”$#@60;?php echo $myrow[“position”]
?$#@62;”$#@62;$#@60;br$#@62;$#@60;input type=”Submit” name= bmit”
value=”输入信息”$#@62;$#@60;/form$#@62;$#@60;?php} else {//
显示员工列表$result = mysql_query(“SELECT * FROM employees”,$db);while
($myrow = mysql_fetch_array($result)) {printf(“$#@60;a
href=/”%s?id=%s/”$#@62;%s %s$#@60;/a$#@62;$#@60;br$#@62;/n”,
$PATH_INFO, $myrow[“id”], $myrow[“first”],
$myrow[“last”]);}}?$#@62;$#@60;/body$#@62;$#@60;/html$#@62;

$#@60;html$#@62;$#@60;body$#@62;$#@60;?phpinclude(“emptyfile.inc”);echo
“Hello World”;?$#@62;$#@60;/body$#@62;$#@60;/html$#@62;

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

我喜欢把头文件的后缀名起成.inc,这样就可以把头文件和一般的程序区分开来。如果您也这么做,那么请您修改Web服务器软件的配置文件,使它能够把.inc文件也当作PHP文件来处理。否则,黑客们也许会猜到您的头文件名,然后用浏览器把头文件内容以纯文本格式显示出来。此时如果您的头文件中有些机密信息那就糟糕了。

$#@60;html$#@62;$#@60;body$#@62;$#@60;?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);?$#@62;$#@60;form method=”post”
action=”$#@60;?php echo $PATH_INFO?$#@62;”$#@62;$#@60;input
type=hidden name=”id” value=”$#@60;?php echo $myrow[“id”]
?$#@62;”$#@62;名:$#@60;input type=”Text” name=”first”
value=”$#@60;?phpecho $myrow[“first”]
?$#@62;”$#@62;$#@60;br$#@62;姓:$#@60;input type=”Text”
name=”last” value=”$#@60;?php echo $myrow[“last”]
?$#@62;”$#@62;$#@60;br$#@62;住址:$#@60;input type=”Text”
name=”address” value=”$#@60;?php echo $myrow[“address”]
?$#@62;”$#@62;$#@60;br$#@62;职位:$#@60;input type=”Text”
name=”position” value=”$#@60;?php echo $myrow[“position”]
?$#@62;”$#@62;$#@60;br$#@62;$#@60;input type=”Submit”
name=”submit” value=”输入信息”$#@62;$#@60;/form$#@62;$#@60;?php}}
else {// 显示员工列表$result = mysql_query(“SELECT * FROM
employees”,$db);while ($myrow = mysql_fetch_array($result))
{printf(“$#@60;a href=/”%s?id=%s/”$#@62;%s
%s$#@60;/a$#@62;$#@60;br$#@62;/n”, $PATH_INFO, $myrow[“id”],
$myrow[“first”],
$myrow[“last”]);}}?$#@62;$#@60;/body$#@62;$#@60;/html$#@62;

那么,您用头文件来做什么呢?很简单!把对所有程序都通用的那些内容放到头文件里。象HTML文件头啦,脚注啦,数据库连接代码啦,还有您自己定义的一些函数什么的。把下面的文字拷贝到一个文件中,保存为header.inc。

就是这样。在这个程序中已经包含了我们学过所大多数特性。您也已经看到,我们在一个if()条件判别语句中又加了一个if()语句,来检查多重条件。

$#@60;?php$db = mysql_connect(“localhost”,
“root”);mysql_select_db(“mydb”,$db);?$#@62;$#@60;html$#@62;$#@60;head$#@62;$#@60;title$#@62;$#@60;?php
echo $title
?$#@62;$#@60;/title$#@62;$#@60;/head$#@62;$#@60;body$#@62;$#@60;center$#@62;$#@60;h2$#@62;$#@60;?php
echo $title ?$#@62;$#@60;/h2$#@62;$#@60;/center$#@62;

下面,我们要把所有东西全都加在一起,写出一个很好的程序来。

然后再创建另外一个文件,名字是footer.txt,该文件可以包含一些程序结束时用到的一些文字和标记。

现在,我们再来创建一个文件,这个文件里面是真正的PHP程序代码。试一下下面的代码,当然,您要确认MySQL数据库服务器正在运行。

$#@60;?php$title = “Hello World”;include(“header.inc”);$result =
mysql_query(“SELECT * FROM employees”,$db);echo “$#@60;table
border=1$#@62;/n”;echo
“$#@60;tr$#@62;$#@60;td$#@62;名字$#@60;/td$#@62;$#@60;td$#@62;职位$#@60;/tr$#@62;/n”;while
($myrow = mysql_fetch_row($result))
{printf(“$#@60;tr$#@62;$#@60;td$#@62;%s
%s$#@60;/td$#@62;$#@60;td$#@62;%s$#@60;/tr$#@62;/n”, $myrow[1],
$myrow[2], $myrow[3]);}echo
“$#@60;/table$#@62;/n”;include(“footer.inc”);?$#@62;

看到发生了什么事了吗?头文件里的内容被合并到程序中,PHP把所有的代码都执行了一遍。注意在包含header.inc头文件之前$title是如何定义的。在header.inc中的代码可以访问到它的值。这样,网页的标题就被改掉了。现在,您可以在任何程序中使用header.inc头文件了,您所要做的不过是在每个主程序中为$title变量取一个合适的值。

头文件、HTML、条件判定语句,还有循环语句,这些东西加在一些,您就可以用最简练的代码,写出功能各异的各种复杂程序来。在与函数同时使用时,头文件更能发挥它的效力,我们后面就会看到。

接下去,我们会介绍精彩的部分:数据校验。

二、 数据校验

想象一下这样的情形:我们把数据库都设计妥当了,现在请用户输入信息来写到数据库中去。假设您有一个字段是要求数字类型的信息,比如价格;而某个可爱的用户,却在这一栏里输入了文字信息,使得您的应用程序的执行过程出现了故障。对您在SQL语句中提供的文字类型的数据,MySQL数据库拒不接受,并向您提出了严正抗议。

怎么办呢?您要用数据校验来防止以上状况发生。

简单地讲,数据校验是指我们对数据进行检查,看看它是否遵从一定的规则。规则可以是多种多样的,比如某一数据元素不能为空,或者要求某一数据项的内容必须满足一定的要求。

数据校验既可以在服务器一端作,也可以在客户端来作。PHP是用来作服务器一端的数据校验的,而JavaScript/”
target=”_blank”JavaScript或其他客户端脚本编程语言则能够提供客户端的数据校验功能。本文说的是PHP,所以我们在这里着重介绍服务器端的校验。如果您想找一些现成的、在客户端运行的数据较验程序,那您可以去网猴程序库看看。

暂时把数据库放在一边不谈,我们先来说说PHP的数据校验方法。如果您愿意,您可以在前面所建的员工数据库的里加入其他字段,很简单,用MySQL的ALTER
语句就行了。

有好几个PHP功能都可以用来作数据校验的工作,有些很简单,有些则复杂一些。其中strlen()是比较简单的一个函数,它能够告诉我们一个变量的长度。

更复杂一点儿的是ereg(),这个函数可以处理完整的常规表达式来进行复杂的校验。我不想就常规表达式讲得太深,因为许多书都是专门写这个问题的。不过我会在中给出一些简单的例子。

我们先从一个简单的例子开始吧。下面这个程序要检查一个变量是否存在。

$#@60;html$#@62;$#@60;body$#@62;$#@60;?phpif ($submit) {if
(!$first || !$last) {$error = “对不起,您必须填写所有的栏目!”;} else
{// 处理表格输入内容echo “谢谢!”;}}if (!$submit || $error) {echo
$error;?$#@62;$#@60;P$#@62;$#@60;form method=”post”
action=”$#@60;?php echo $PHP_SELF ?$#@62;”$#@62;第一栏:
$#@60;input type=”text” name=”名” value=”$#@60;?php echo $first
?$#@62;”$#@62;$#@60;br$#@62;第二栏: $#@60;input type=”text”
name=”姓” value=”$#@60;?php echo $last
?$#@62;”$#@62;$#@60;br$#@62;$#@60;input type=”Submit”
name=”submit” value=”输入信息”$#@62;$#@60;/form$#@62;$#@60;?php} //
if结束?$#@62;$#@60;/body$#@62;$#@60;/html$#@62;

这段程序中关键的地方是嵌套的条件判定语句。第一层检查用户是否按了发送数据的按钮。如果是,程序接着检查$first和$last两个变量是否都存在。那个
|| 符号表示或,而 !
符号表示非。那一句程序用一般语言描述就是如果$first不存在或者$last不存在,那么就把
$error变量置成下面的值。

接下来,我们再进一步,检查一段文字的长度。这对用户口令的检查是很有必要的,因为您不想让某些懒惰的用户输入只有一、两个字的口令,可能会要求他们输入六位长的口令。

我们已经讲到strlen()这个函数了。它只是简单地返回一个数字,该数字等于被测变量中所包含的字符个数。这里,我修改一下上面的程序,检查一下$first与$last的长度。

$#@60;html$#@62;$#@60;body$#@62;$#@60;?phpif ($submit) {if
(strlen($first) $#@60; 6 || strlen($last) $#@60; 6) {$error =
“对不起,您必须填写所有栏目!”;} else {// 处理表格输入内容echo
“谢谢!”;}}if (!$submit || $error) {echo
$error;?$#@62;$#@60;P$#@62;$#@60;form method=”post”
action=”$#@60;?php echo $PHP_SELF ?$#@62;”$#@62;第一栏:
$#@60;input type=”text” name=”名” value=”$#@60;?php echo $first
?$#@62;”$#@62;$#@60;br$#@62;第二栏: $#@60;input type=”text”
name=”姓” value=”$#@60;?php echo $last
?$#@62;”$#@62;$#@60;br$#@62;$#@60;input type=”Submit”
name=”submit” value=”输入信息”$#@62;$#@60;/form$#@62;$#@60;?php} //
if结束?$#@62;$#@60;/body$#@62;$#@60;/html$#@62;

您可以执行一下这段程序,输入六个字或少于六个字的内容。这种校验很简单,但很有效。

发表评论

电子邮件地址不会被公开。 必填项已用*标注