MYSQL编程:运转PHP
用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”在本章的残剩部分中,将办理我们在第1章中为本人定下的方针:关于学分保留计划,必要编写一个同意我们输出、编纂测试和检验分数的剧本。
关于汗青联盟,必要开辟一个有关美国总统的联机检验,使之成为交互式的,以便不做任何事变就能够为这个Web站点的会见者发生试题。
我们也想同意汗青联盟成员联机编纂它们的目次项,使信息保持最新并削减我们本人编纂项的数目。
每一个剧本都发生多个Web页面,并依托在创立页面中嵌进的信息来在剧本的挪用之间举行通讯。
输出先生分数
在本节中,我们将把注重力转向学分保留计划。我们Web站点上的这个地区的URL是http://pit-viper.snake.net/gp/,应当为它编写一个冗长的主页index.php,上面的页面就正在做这件事。它包含了与第7章编写的score_browser剧本的毗连,由于这个剧本合适于学分保留计划。
如今让我们思索怎样计划和完成剧本score_entry.php,它将让我们输出一组新的测试或检验分数,大概修正一组已存在的分数。后者的功能关于处置因为抱病大概其他缘故原由出席(大概,保持这个设法以避免输出分数失利)形成测验或检验比其他先生晚的先生的分数是需要的。分数项剧本的提要是如许的:
1)最后的页面代表一系列已知的挂号事务,并同意选择一个事务大概指定应当创立的新事务。
2)假如选择创立一个新事务,剧本就给出同意指定日期和事务范例的页面。创立这个事务纪录以后,剧本从头显现事务列表页面来显现这个新事务。
3)中选择了事务后,剧本给出在顶部(事务ID、日期、范例)显现事务信息的分数项页面,后接每一个先生一项的列表。关于新事务,项将是空缺的。关于已存在的事务,项将显现每一个先生已存在的分数。选择提交按钮时,分数输出到score表中。
剧本必要实行几个分歧的操纵,这意味着我们必要从一个页面到另外一个页面循环往复地传送形态变量,以便剧本在每次挪用时可以晓得假定要做甚么。在PHP中很简单做到这一点,由于PHP处置作为URL参数传送的变量,并把它们转换为与参数具有不异称号的变量。例
如,能够在剧本URL的开端对参数action举行以下编码:
http://pit-viper.snake.net/gp/score_entry.php?action=value
当挪用score_entry.php时,参数action作为变量$action来编码,如许就能够间接会见它了。这也合用于格局中的域。假想一个包含域name和address的表格,当客户机传送表格时,Web服务器就挪用剧本会见表格的内容。剧本可以找出经由过程反省变量$name和$address的值而输出到表格中的值。关于包含很多域的表格,全体给出独一的定名是有坚苦的。PHP很简单地把数组在表格中传进和传出。假如利用了如x、x等等的域名,则PHP把它们作为$x数组的元素举行编码。能够将这些元素作为$x、$x等等来会见。
我们经由过程利用页面中的action参数,能够将信息从score_entry.php剧本的一个挪用传送到另外一个挪用,并在剧本顶用变量$action反省它的值。剧本的框架是如许的:
变量$action能够取多少值,我们已在switch()语句中测试过了(为制止在剧本中利用笔墨的数字,能够用PHP的define()机关来界说常量)。PHPswitch()语句与它在C中响应的部分相相似。在score_entry.php中,它用来断定接纳甚么操纵,而且挪用完成这个操纵的函数。
反省一下每次处置一个操纵的函数。第一个函数display_events(),检索来自MySQL的event表的行并加以显现。表的每行都列出了事务ID、日期和工夫范例(测试或检验),另有编写事务ID作为能够选择用来修正事务分数的毗连:
表中的毗连用$PHP_SELF来机关。这个变量包含了剧本本人的URL,它为剧本再次挪用本人供应了一个便利的办法。但是,请注重函数入手下手处的global行:
global$PHP_SELF;
在PHP函数中,全局变量是不成会见的,除非显式地声明要利用它们。没有global行,$PHP_SELF将被当作部分变量(由于我们未将值赋给它,因而是空的)。在函数外部,利用global来会见依托URL参数大概作为表格域传送到剧本中的参数也是必须的。
用来天生表的函数display_cell()与第7章编写的同名DBI函数相相似。PHP版本以下:
假如在display_events()给出的表当选择了“NewEvent”毗连,则剧本经由过程操纵SOLICIT_EVENT举行再次挪用。它激发了对solicit_event_info()的挪用,这个函数显现了同意输出新事务信息的表格:
由solocit_event_info()天生的表格包含输出数据的编纂域、指定新事务是测试仍是检验的两个单选按钮、Submit按钮。当递交表格时,ADD_EVENT操纵将挪用score_entry.php。挪用add_new_event()函数在event表中输出一个新的行:
在add_new_event()中,我们利用global会见在新事务项表格中利用的域值(date和type,用变量$date和$type会见)。做出最低限制的平安反省,断定数据为非空缺以后,在event表中输出一个新纪录。输出这个事务纪录以后,主程序将再次显现事务列表,如许就能够选择新事务并入手下手输出分数了。
函数display_scores()为给定的事务查找已存在的分数,并列出显现他们的表格,包含先生姓名:
display_scores()用于检索所选事务的分数信息的查询并非表之间的复杂毗连,由于它不会为事务中没有分数的先生选择行。出格是,关于新的事务,毗连会选择无纪录,这就有了一个空项表格!我们利用LEFTJOIN强制为每一个先生检索行,不管先生是不是在score表中已有了分数。与display_scores()用来检索来自于MySQL的分数纪录相相似的查询背景,已在3.8.2节“反省表中未给出的值”中给出了先容。那边的查询只选择缺掉分数,这里的查询只选择特别事务的分数。
分数在表格中利用了着名称的域举行编码,如score,这里的n是student_id的值。当表格送回Web服务器时,PHP将这些域转换为$score数组的元素,我们能够会见数组元素以恢复表格的内容。
当完成输出大概编纂分数,并提交给表格后,ENTER_SCORES操纵挪用score_entry.php,而且挪用函数enter_scores()处置表格信息:
先生ID的值和相干的分数经由过程迭代PHP的each函数的$score数组来取得。每一个分数处置以下:
假如分数是空缺的,则标明甚么也没有输出,可是我们还要试图删除这个分数,以避免它之前已经存在(大概之前我们为出席的先生毛病地输出了分数)
假如分数不是空缺的,就对值举行一些基本切实其实认。用函数trim()往失落前后的空格以后,假如残剩部分是空缺大概整数,就承受这个了局。但是,表格值一般作为字符串来编码,因而不克不及用is_long()大概is_int()反省值是不是为整数。即便值只包含数字,这些函数也会前往FALSE。既然如许,最好用模子婚配操纵。假如字符串从入手下手到停止每一个字符都是数字,则上面的测试为TRUE:
ereg("^+$",$str)
假如分数反省终了,我们就将它加到score表中。查询利用REPLACE而不必INSERT,由于我们大概交换了已存在的分数而不是输出一个新的分数(REPLACE在两种情形下都合用)。
注重score_entry.php剧本。如今一切的分数项和编纂项都能从Web扫瞄器实行。一个分明的弱点是:剧本没有供应平安措施,毗连到Web服务器的任何人都能够对分数举行编纂。今后,我们用编纂汗青联盟成员项编写的剧本来讲明这个剧本所接纳的复杂确认计划。也能够利用PHPLIB程序包来供应更完美切实其实认。
美国总统检验
汗青联盟Web站点的方针之一就是用它给出检验的在线版本,这相似于联盟在时势通讯“美国纪年史”的儿童部分宣布的一些检验。实践上我们创立了president表,因而对基于汗青的检验能够用它作为成绩的来历。为了给出这个检验,我们将编写称为pres_quiz.php的剧本。
基础的设法是随机选择一个总统,问一个关于他的成绩,然后哀求用户回覆而且观察谜底是不是准确。为了复杂一点,能够把主题限定为扣问总统出身在那里。别的一种复杂的权衡就是以多个选择的格局给出这个成绩。这对用户来说很简单,他只需从一组选择中选择一个,而不必将之键进守候回应。这对我们来说也是简单的,由于我们不需做任何辣手的婚配字符串来反省用户大概键进的内容,而只需对用户的选择和我们寻觅的值做一个复杂的对照。
显现这个检验的剧本必需实行两个函数。第一个,关于它最后的挪用,将从president表中查阅信息来天生并显现一个新的成绩。第二个,假如剧本已被挪用是由于用户正提交一个回覆,那末就必要反省这些谜底并给出一些反应信息来指出它是不是准确。假如准确,剧本会天生并显现一个新的成绩。假如回覆不准确,将再次显现统一成绩。
为了天生这些成绩,我们将利用MySQL3.23中呈现的一个ORDERBYRAND()特征。利用这个函数就可以从president表中随机地举行行选择。比方,为了随机地选择总统的姓名和出身地,查询将实行如许的操纵:
name是选择的总统的名字,出身地是成绩“总统出身在那里?”的准确谜底,我们还必要给出一些毛病的选择,可用相似的查询:
从这个查询的了局中,我们选择了与准确谜底分歧的最后面的四个值。公布这个查询并检索了局的函数以下:
为了给出检验成绩的信息,我们利用了显现总统姓名、一组列出大概选择的单选按钮和一个Submit按钮的表格。这个表格必要做两件事变:必需对客户机给出检验信息;当用户提交回覆时必需将信息传送回Web服务器,以便反省回覆是不是准确。
为了布置表格实行这些操纵,我们利用了埋没域把检验信息包含在表格中。把域称为name、place和choice,它们代表总统的姓名、出身地和一组大概的选择。利用implode()毗连值和特别字符,如许,这些选择能够很简单地作为单个字符串来编码(我们必要特别字符,以便假如必要从头显现成绩时能够用explode()分别字符串)。显现表格的函数以下:
函数hidden_field()为表格中的埋没域编写了HTMT:
当用户做出选择并提交表格时,谜底作为response域值在发送回Web服务器的表格内容中编码。我们能够经由过程反省变量$name、$place和$choice发明name、place和choice域的值。这也给了我们一个办法,指出是不是是第一次挪用剧本,大概用户是不是赐与前显现过的表格提交了回覆,假如是第一次挪用则不会设置那些变量。如许,经由过程反省个中一个变量,剧本的主体就决意了应当做的事变:
我们仍旧必要编写check_response()函数来将用户的回覆与准确谜底做对照。我们将准确谜底在表格的place域举行编码,用户的回覆则在表格的response域举行编码,因而我们所要做的就是对照$place和$response。在对照了局的基本上,我们供应了一些反应信息,以后每次都天生显现一个新的成绩,大概再次显现不异的成绩:
如许,我们就做完了。将pres_quiz.php的链接加到汗青联盟主页上,观光者能够做一下这个检验来测试他们的常识。
汗青联盟联机成员项的编纂
终极的剧本edit_member.php同意汗青联盟成员编纂他们本人的联机项。不管什么时候,成员都能够校订大概更新他们的成员信息,而不用向联盟部提交这些变动。这本性能使成员目次老是坚持最新的,并且削减了秘书的事情量。
我们必要接纳的一个提防措施就是:除该项目标成员以外,避免任何其别人修正项目。这意味着我们必要一些平安性的表单。作为一个复杂的身份确认表单的树模,我们将利用MySQL寄存每一个成员的口令,并请求成员供应准确的口令以会见剧本给出的编纂表单。该剧本操纵以下:
现在次挪用时,edit_script.php给出包含成员ID和口令域的表单。
当提交初始表单时,剧本用成员ID作为关头字寻觅相干的口令来搜刮口令表。假如口令符合,剧本将从member表中查找成员项,并显现要编纂的内容。
当提交编纂过的表单后,我们就用表单的内容更新项。
edit_member.php的框架以下所示:
固然,我们还必要一些口令,一个复杂的办法就是随机地天生它们。上面的语句创建member_pass表,然后,经由过程从随机数中天生MD5校验来为每一个成员创立口令。您可让成员们来选择他们本人的口令,也能够挪用mysql并公布这些语句作为一种既疾速又简单的办法:
我们将一个特别项加到这个表中作为编号0,它有一个用于办理的(超等用户)口令。可使用这个口令会见一切想要会见的项:
INSERTINTOmember_pass(member_id,password)VALUES(0,"secret");
在创立口令表以后,您能够中断利用第7章中编写的samp_browse剧本,该剧本同意任何人在samp_db数据库中扫瞄任何表的内容,个中包含member_pass表。
当做员输出ID和口令并提交该表单时,edit_member.php显现该编纂的项:
display_entry()必要做的第一件事就是校验口令。关于给定的成员ID,假如表单中输出的口令与member_pass表中寄存的口令符合,大概假如它与办理口令符合(即成员0的口令),edit_member.php就显现编纂的项。口令反省函数check_pass()将实行一个复杂的查询从member_pass表中移出一笔记录:
由于不克不及修正它,以是编纂表单作为只读文本显现成员ID的值。关于一般的成员,停止日期也作为只读文本显现,由于不克不及让成员修改它。但是,假如给出办理口令,则停止日期就成为可编纂的,同意联盟秘书为成员更新日期来从头更新他们的会员资历。
member表项的列由display_column()函数显现。它依照第三个参数值把列作为可编纂的文本或作为只读文本加到编纂表单中:
display_entry()函数在格局中作为埋没字段嵌进了member_id和password,因而当做员提交编纂的项时将持续edit_script.php的下一个挪用。这同意主动校验ID的口令,而不必哀求成员再次输出(请注重,我们的复杂切实其实认身份的办法是以文本情势往返传送口令。一般这不是个好主张,可是汗青联盟不是对平安性请求很高的运作机构,因而这类办法充足满意请求。假如在运转金融营业,大概必要更强的平安性操纵)。
更新项的函数以下:
起首,从头校验口令,断定没人发送假表单来捉弄我们,然后更新项。更新时必要注重,由于假如表单中的字段是空缺的,则大概必要作为NULL而不是作为空字符串输出。expiration列就是如许的例子。NULL的成员停止日期具有特别的寄义,即“毕生会员”。假如将一个空字符串拔出到此列中,值转换成“0000-00-00”,则成员不再具有毕生会员资历。
为了处置这个成绩,我们查找该列的元数据并反省它是作为NULL仍是作为NOTNULL举行声明的。该信息由函数mysql_fetch_field()前往。不幸地是,此函数经由过程数值的索引查找列。在member表中按称号会见列会更便利,因而我们编写一个小函nullable(),它猎取一个列名并查找响应的元数据工具:
mysql_fetch_field()函数必要包括反省列地点表的了局集标识符。这可经由过程实行复杂的不前往行的SELECT查询来取得。固然该查询前往一个空了局集,可是,关于检索要评价member表中列的空功能(nullability)的元数据来讲,这类办法充足了:
SELECT*FROMmemberWHERE1=0
安装剧本,让成员们晓得他们的口令,如许他们就可以更新本人的成员信息了。这种服务也提供了足够的监控功能来跟踪性能和使用情况,在问题发生时将发出通知并生成一定深度的分析报告。 然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情 我个人认为就是孜孜不懈的学习 我个人认为就是孜孜不懈的学习 大侠们有推荐的书籍和学习方法写下吧。 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。 大侠们有推荐的书籍和学习方法写下吧。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
页:
[1]