原作者:Graeme Merrall |
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
一、 while循环 在这一课里,我们将会继续深入下去,使用PHP和MySQL来写出一些简单而有用的页面。我们从昨天创建的数据库开始,显示库中的数据,但是会再稍微加以润色。 首先,我们用下面的代码来查询数据库内容。
您可能已经注意到,我们在这个程序里加进了一些新东西。最明显的是while()循环。该循环是说,只要数据库里还有记录可读(使用mysql_fetch_row()函数),那就把该记录赋给变量$myrow,然后执行大括号({})内的指令。仔细看一下这里,这部分是比较重要的。 我们应该注意一下mysql_fetch_row()函数。这里有一点小问题,它返回的是一个数组,必须以数组下标来访问其中的某个字段。第一个字段下标为0,第二个是1,依此类推。在执行某些复杂查询时,这么做简直实在是太烦琐了。 现在我们更仔细地研究一下循环过程。程序前几行我们在第一课的例子中已经看到过了。然后,在while()循环中,我们从查询结果中读取一条记录并把该记录赋给数组$myrow。接着,我们用printf函数把数据中的内容显示在屏幕上。随后,循环反复执行,读取下一条记录赋给$myrow。这样继续下去,直到所有记录都已被读取完为止。 使用while()循环的一个好处是,如果数据库查询没有返回任何记录,那您也不会收到错误信息。在刚执行循环语句时,循环条件就不满足,不会有任何数据赋给$myrow,程序就直接往下运行了。 但是如果查询未返回任何数据,我们怎么让用户知道这一点呢?我们也许该提供点儿相关的消息给用户吧。这是可以做到的,下面我们就看看怎么做。>>
二、 if-else 请看下面的程序。
这段程序中包含有不少新内容,不过这些内容都相当简单。首先是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方法;第二种是在浏览器的地址栏中输入网址时直接加上查询参数;第三种是把查询参数串嵌入到网页的超链接中,使得超链接的内容象下面这样:。我们现在要用到最后这一种方法。 一开始,我们再来查询我们的数据库,列出员工姓名。看看下面的程序,其中大部分内容我们都已经很熟悉了。
这里没什么特别的,只是printf函数有些不同。那我们就来仔细研究一下。 首先要注意的是,所有的引号前面都有一个反斜杠。这个反斜杠告诉PHP直接显示后面的字符,而不能把后面的字符当作程序代码来处理。另外要注意变量$PATH_INFO的用法。该变量在所用程序中都可以访问,是用来保存程序自身的名称与目录位置的。我们之所以用到它是因为要在页面中再调用这个程序本身。使用$PATH_INFO,我们可以做到,即使程序被挪到其他目录,甚至是其他机器上时,我们也能保证正确地调用到这个程序。 正如我刚才提到的,程序所生成的网页,其中包含的超链接会再次调用程序本身。不过,再次调用时,会加入一些查询参数。 PHP见到查询参数串中包含有“名字=值”这样的成对格式时,会作一些特别的处理。它会自动生成一个变量,变量名称与取值都与查询参数串中所给定的名称和取值相同。这一功能使得我们可以在程序中判断出是第一次执行本程序还是第二次。我们所要做的只是问问PHP$id这个变量是否存在。 当我知道这个问题的答案后,我可以在第二次调用程序时显示一些不同的结果出来。请看:
程序开始变得复杂了,所以我在这里面加了注释,来解释一下到底发生了什么。您可以用//加入单行注释,或者用/*和*/来括住大段的注释。 到这里,我们已经学会了第一个真正有用的PHP/MySQL脚本程序!现在,我们要看看怎样把Web表格加进来,并且向数据库发送数据。>>
四、 向服务器发送数据 现在我们从数据库读取数据已经没有太多困难了。但是怎么反过来向数据库发送数据呢?其实这不是PHP的问题。 首选,我们创建一个带有简单表格的网页。 同样要注意$PATH_INFO的用法。就象我在第一课里讲到的,您可以在HTML代码中的任意位置使用PHP。您也会注意到,表格中的每一个元素都对应着数据库中的一个字段。这种对应关系并不是必须的,这么做只是更直观一些,便于您以后理解这些代码。 还要注意的是,我在Submit按钮中加入了name属性。这样我在程序中可以试探$submit变量是否存在。于是,当网页被再次调用时,我就会知道调用页面时是否已经填写了表格。 我应该指出,您不一定要把上面的网页内容写到PHP程序中,再返过来调用程序本身。您完全可以把显示表格的网页和处理表格的程序分开放在两个网页、三个网页甚至更多网页中,悉听尊便。放在一个文件中只是可以使内容更加紧凑而已。 那好,我们现在加入一些代码,来检查用户在表格中输入的内容。我会把用$HTTP_POST_VARS把所有查询参数变量都显示出来,这只不过是为了证明PHP确实把所有变量都传给了程序。这种方法是一个很有用的调试手段。如果您要想看全部的变量,可以用$GLOBALS。
程序现在运行正常,那我们现在就可以取到表格输入的内容,并把它们发送给数据库。
您现在已经向数据库中插入数据了。不过还有很多完善的工作要做。如果用户没有填写某一栏怎么办?在需要填入数字的地方填了文字怎么办?或者填错了怎么办? 别担心。我们一步一步来。>>
五、修改数据 在个教程中,我都把要执行的SQL语句放到一个变量($sql)中,然后才用mysql_query()来执行数据库查询。在调试时这是很有用的。如果程序出了什么问题,您随时可以把SQL语句的内容显示出来,检查其中的语法错误。 我们已经学习了如何把数据插入到数据库中。现在我们来学习如何修改数据库中已有的记录。数据的编辑包括两部分:数据显示和通过表格输入把数据返回给数据库,这两部分我们前面都已经讲到了。然而,数据编辑还是有一点点不同,我们必须先在表格中显示出相关的数据。 首先,我们回过头再看看第一课的程序代码,在网页中显示员工姓名。但是这次,我们要把数据显示在表格中。程序看起来象下面这样:
我们刚才是把字段内容写入到相应表格元素中的value属性里,这是相应简单的。我们再往前进一步,使程序可以把用户修改过的内容写回数据库去。同样,我们通过Submit按钮来判断是否处理表格输入内容。还要注意,我们用的SQL语句稍稍有些不同。
就是这样。在这个程序中已经包含了我们学过所大多数特性。您也已经看到,我们在一个if()条件判别语句中又加了一个if()语句,来检查多重条件。 下面,我们要把所有东西全都加在一起,写出一个很好的程序来。>> 六、完整的程序 在本课结束前,我们要把所有东西加入到一个程序中,使它具有增加、编辑修改、删除记录的功能。这是前面所有内容的一个延伸,也可以作为极好的复习方法。看看下面的程序。
这段程序看起来很复杂,但实际上并不难。程序主要有三个部分。第一个if()语句检查我们是否已经按下了那个“输入信息”的数据提交按钮。如果是,程序再检查$id是否存在。如果不存在,那我们就是在增加记录状态,否则,我们是在修改记录状态。 接下来我们检查变量$delete是否存在。如果存在,我们是要删除记录。注意,第一个if()语句检查的是用POST方法发送来的变量,而这一次我们检查的是GET方法中传递过来的变量。 最后,程序默认的动作是显示员工列表和表格。同样,我们要检查变量$id是否存在。如果存在,我们就根据它的值检索出相应的记录显示出来。否则,我们会显示一个空的表格。 现在,我们已经把所学的东西全部都放在一个程序里头了。我们用到了while()循环,用到了if()语句,并且执行了全部的SQL基本操作 - SELECT、INSERT、UPDATE以及DELETE。另外,我们也知道如何在不同的网页之间通过URL和表格输入来互相传递信息。 在第三课里,我们要学习如何为网页增加智能化处理能力。 |