简单生活 发表于 2015-1-16 22:34:05

MYSQL网站制作之PHP基本

DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。PHP的基础功效就是注释一个剧本,来天生发送到客户机的Web页面。具有代表性的是,剧本包含逐字发送到客户机的HTML和作为程序实行的PHP代码的夹杂编码。不管代码天生甚么样的输入,城市发送到客户机,因而客户机永久不会看到代码,它只能看了局的输入。
当PHP入手下手读取文件时,假定文件内容暗示笔墨的HTML,则它仅仅拷贝在那边找到的输入内容。当PHP注释程序碰到一个特别的翻开标志时,就从HTML形式切换到PHP代码形式,而作为要实行的PHP代码也入手下手注释文件。代码的开头由另外一个特别的标志指出,解
释绦蛟谡飧鑫恢么哟肽J角谢换HTML形式。这就同意将静态的文本(HTML部分)与静态发生的了局(PHP代码部分的输入)相夹杂,发生依附于挪用情况变更的页面。比方,可使用PHP剧本来处置表格的了局,在这个格局中,用户已输出了数据库搜刮的参数。
因为格局填进内容的分歧,以是每次搜刮的参数大概也分歧,因而当剧本实行搜刮的时分,每一个作为了局的页面将反应分歧的搜刮。
让我们经由过程一个十分复杂的PHP剧本看一看它是怎样事情的:
<HTML>
<BODY>
hello,world
</body>
</HTML>
这个剧本其实不很风趣,由于它不包含PHP代码!因而您会问:那它有甚么优点?这个成绩的回覆是:它偶然有助于创建包含想要天生页面的HTML框架的剧本,然后再到场PHP代码。这长短常无效的,PHP注释程序用于它是没有成绩的。
为了在剧本中包含PHP代码,您可从用两个特别标志(剧本入手下手处的‘<?php’和剧本停止处的‘?>’)把它与四周的文本辨别开来。当PHP注释程序碰到入手下手的‘<?php’标志时,就从HTML形式切换到PHP形式,并注释它找到的任何PHP代码,直到瞥见停止的‘?>’标志为止。它发生的一切输入注释并交换了两个标志之间的剧本。将后面的实例再从头编写一下,它包含了大批的PHP代码,以下所示:

此时,代码部分是很小的,由单行构成。当注释代码时,发生了输入“hello,world”,它作为输入部分发送到客户机扫瞄器。如许,这个剧本发生的Web页面与后面实例发生的Web页面一样,后面实例的剧本完整由HTML构成。
可使用PHP代码发生Web页面的任何部分。我们已看到了一个出格的实例,在那边全部剧本都由笔墨的HTML构成,而不包含PHP代码。另外一个出格的实例是全部剧本都是PHP代码而不包含笔墨的HTML:

这申明PHP在怎样发生输入方面有很年夜的天真性。但PHP也留下一个成绩,那就是断定怎样组合HTML和PHP代码才是符合的。不用把一切代码都放在一个中央,PHP在这方面也很天真。只需您乐意,就能够经由过程剧本在HTML和PHP代码形式之间举行转换。
PHP剧本标志
除本章实例中利用的标志以外,PHP还撑持其他的剧本标志。您能够在其别人编写的PHP代码中看到它们,大概能够本人利用这些标志。PHP辨认四种标志作风:
缺省标志作风。这是PHP设置为缺省时利用的作风:
<?phpprint("hello,world
");?>
简便开标志作风。这个作风除开标志较简便外,其他与缺省作风相相似:
<?print("hello,world
");?>
兼容ASP的作风。这个作风在ActiveServerPage情况外部是通用的:
<%print("hello,world
");%>
<SCRIPT>标志作风。假如利用与其他标志作风分歧的HTML编纂器,这个作风是有效的。固然,它对照冗杂,可是当您利用其他标志作风时,编纂器大概不处置PHP代码,这时候您将发明它是必须的:
<SCRIPTLANGUAGE="php">print("hello,world
");</SCRIPT>
缺省时,简便开标志作风和兼容ASP作风有效。请参阅附录H有关开启它们的申明。
自力的PHP剧本
当处置命令注释程序剧本或Perl剧本时,能够编写从命令行挪用的自力的PHP剧本。这里有一个实例:
#!/usr/local/bin/php-q
<?phpprint("hello,world
");?>
后面的剧本可定名为hello.php,使用chmod+x使之成为可实行的,并从命令注释程序中挪用:
%hello.php
hello,world
本章中我们不编写任何自力的剧本。这里编写的一切实例都希冀Web服务器挪用它们来天生Web页面。
下一个剧本有一些本色性的内容,但仍旧相称冗长。它申明了怎样较简单地从PHP会见MySQL数据库,并在Web页面中利用查询了局。此剧本在第5章表达得很冗长,它构成了汗青联盟Web站点主页的基本。在我们持续往下做的时分,应当使剧本更精致一些,但直到
如今为止,它所做的只是显现冗长的接待动静和以后联盟会员资历的计数:


接待动静就是一个静态文本,因而它作为笔墨的HTML是最简单编写的。另外一方面,会员资历的盘算是静态的,并且随时会变动,因而必需在它不事情时经由过程查询samp_db数据库中的member表来断定。
在开和闭剧本标志之间的代码文本实行一个复杂的义务。起首,它翻开了与MySQL服务器的毗连,并使samp_db数据库成为缺省数据库。然后,它发送一个到服务器的查询来断定现在汗青联盟有几成员(我们将它作为member表中的行数)。查询了局将作为包含会员
资历计数动静的一部分显现出来,然后再做处置。
在处置过程当中,假如任何一点产生毛病,该剧本城市复杂地加入。它因为太复杂而不发生毛病输入,因而把会见该Web站点的人们弄懵懂了(假如依托PHP代码天生全部Web页面,当因毛病而加入,且不发生任何输入时,大概会使会见页面的人十分末路火,由于有些浏
览器将显现“这个页面没无数据”的对话框)。
让我们把该剧本分红几段,看看它是怎样事情的。第一步是用mysql_pconnect()毗连到服务器:
上一篇目次下一篇=@mysql_pconnect("pit.viper.snake.net","paul","secret")
orexit();
mysql_pconnect()把主机名、用户名和口令作为参数。毗连创建乐成,则前往毗连标识符,假如产生毛病,则前往FALSE。假如毗连失利,剧本立即挪用exit()来停止剧本,而且不再发生输入。
在mysql_pconnect()挪用前的‘@’字符是甚么意义呢?就是“请封闭”的意义。有些PHP函数在失利时除前往形态代码以外还写堕落误动静。在mysql_pconnect()情形下,失利的毗连招致了上面的动静呈现在发送到客户机扫瞄器的Web页面上:
Warning:MySQLConnectionFailed:Accessdeniedforuser:
paul0pit-viper.snake.net(Usingpassword:YES)
如许很丢脸,观光我们站点的人们大概不晓得它是怎样酿成的和该如何处置它。把‘@’字符放到mysql_pconnect()挪用的后面,就能够作废这个毛病动静,以使我们能在前往值的基本上本人选择怎样处置毛病。关于该剧本,假如产生毛病,最好基本不发生属于会员资历计数的输入。如许,页面将只包括接待动静。
任何PHP函数都可使用‘@’,但以笔者的履历来讲,初始的mysql_pconnect()挪用是最大概失利的一个。因而,本章的例子克制来自该函数中的动静。
将称号和口令嵌进到一切人都能看到的剧本中,大概会使您严重不安。是如许的,称号和口令呈现在发送到客户机的Web页面上是对的,由于该剧本的内容由其输入的了局交换失落了。但是,假如Web服务器不知何以设置不妥,没有辨认出剧本必要由PHP代码来处置,
它就会将剧本以纯文本发送进来,且会表露毗连参数。在8.2.1节“利用函数和include文件”中,将扼要地处置这类情形。
mysql_pconnect()前往的毗连标识符能够传送到PHPAPI中的几个与MySQL相干的挪用中。但是,关于如许的挪用,标识符老是可选择的。比方,可使用以下格局之一来挪用mysql_select_db():
mysql_select_db($db_name,上一篇目次下一篇);
mysql_select_db($db_name);
mysql_pconnect()与mysql_connect()的对照函数mysql_pconnect()与函数mysql_connect()类似,都具有主机名、用户名和口令
参数,并前往毗连标识符或FALSE来讲明毗连是不是乐成。两个挪用之间的分歧在于:mysql_pconnect()创建了一个耐久的毗连,而mysql_connect()创建了一个非耐久的毗连。与非耐久毗连分歧,耐久毗连在剧本停止时不封闭。假如别的一个PHP剧本随后由统一
个Apache子处置实行,并用一样的参数挪用mysql_pconnect(),将从头利用这个毗连。这比封闭后再创建毗连的效力要高。
假如疏忽了从一些相干MySQL的PHP挪用中失掉的毗连参数,挪用就会利用比来翻开的毗连。如许,假如剧本只翻开单个毗连,那末在任何MySQL挪用中永久不用指定毗连参数――即毗连是缺省的。这就是C或DBIAPI与MySQL程序计划的极年夜分歧的地方,由于它
们没有如许的缺省。
笔者利用上一篇目次下一篇变量在复杂的主页上编写了上面的毗连代码,使mysql_pconnect()前往哪一种范例的值加倍明晰:
上一篇目次下一篇=@mysql_pconnect("pit-viper.snake.net","paul","secret")
orexit();
但是,实践上,我们在剧本的其他中央都没有利用$link,因而代码可更复杂地写成:
@mysql_pconnect("pit.viper.snake.net","paul","secret")
orexit();
假定毗连创建乐成,则下一步是选择一个数据库:
mysql_select_db("samp_db")
orexit();
假如mysql_select_db失利,我们将会冷静地加入。假如我们可以毗连到服务器,而且数据库存在,那末仿佛不成能产生毛病,可是仍旧要严厉地反省成绩并接纳响应的举动。选择数据库以后,可将查询发送到服务器,提取了局,加以显现,然后开释了局集:
$result=mysql_query("SELECTCOUNT(*)FROMmember
orexit();
if($row=mysql_fetch_array($result))
echo"<p>TheLeaguecurrentlyhas".$row."members";
mysql_free_result($result);
mysql_query()函数将查询发送到服务器中往实行。查询不必分号大概‘g’停止。假如查询不法或由于某些缘故原由不克不及实行,则mysql_query()前往FALSE,不然前往一个了局集标识符。该标识符是我们能用来取得有关了局集信息的值。关于查询,该了局集由暗示会员资历计数的单列值的单行构成。为失掉这个值,我们能够把了局集标识符传给mysql_fetch_row()
来猎取行,将此行赋给变量$row,并以$row情势会见第一个元素(只要一个元素时也是如许)。
当处置结束果集时,将了局集传送给mysql_free_result()举行开释。实践上这类挪用在我们的剧本中是不用要的,由于当剧本停止时,PHP会主动地开释一切举动的了局集。
mysql_free_result()有助于实行年夜型查询或大批查询的剧本。它避免大批内存的利用。
为了利用剧本,必要在某处安装它。本章将接纳如许的商定:美国汗青联盟在Apache文档树的最高一级中有本人的目次,称为ushl,因而主页面剧本作为该树的ushl/index.php举行安装。我们也将为学分保留计划开辟剧本,因而给出目次gp。假如Web站点主机是pit-viper.snake.net,那末这两个目次中的页面将有以下开首的URL:
http://pit-viper.snake.net/ushl/
http://pit-viper.snake.net/gp/
比方,每一个目次的主页面都可称为index.php,并以以下体例举行会见:
http://pit-viper.snake.net/ushl/index.php
http://pit-viper.snake.net/gp/index.php

利用函数和include文件

PHP剧本与DBI剧本的分歧的地方在于,PHP剧本位于Web服务器文档树的外部,而DBI剧本位于cgi-bin目次中,这个目次在文档树的内部。这就提出了一个平安性成绩:服务器设置不妥的毛病大概招致位于文档树外部的页面会以纯文本体例保守给客户机。这意味着
创建与MySQL服务器毗连的用户名和口令假如在PHP剧本而非DBI剧本中利用,则将处于表露给外界的很高的伤害当中。
PHP中的变量
在PHP中,能够经由过程复杂地利用变量而使它们存在。主页剧本利用了三个变量:$link、$result和$row,没有一个变量会在一切中央都声明(声明变量的中央有高低文,如在函数外部援用全局变量时,我们随后漫谈到这个成绩)。
变量由美圆标记(‘$’)为开首的标识符暗示。不管它暗示甚么范例的值都是准确的,只管关于数组和工具要增加一些分外内容来会见值的单个元素。假如变量$x暗示单个值,比方,数字或字符串,则能够写成$x来会见它。假如$x暗示无数字索引的数组,则可
以写成$x、$x等等来会见它的元素。假如$x暗示有联系关系索引的数组,如“yellow”大概“large”,则能够写成$x[“yellow”]、$x[“large”]来会见它的元素。
PHP数组能够同时具有数字索引的元素和相干索引的元素。比方,$x和$x[“large”]都能作为统一数组的元素。假如$x代表一个工具,则可写成$x->property_name来会见它所具有的属性。比方,$x->yellow和$x->large都是$x的属性。
作为属性名,数字是分歧法的,因而$x->1在PHP中是分歧法的。
初始的汗青联盟主页剧本也存在这个成绩,由于它包含MySQL用户名和口令的间接值。让我们用两个PHP功能:函数和include文件,把这些毗连参数移到剧本表面。我们将编写函数samp_db_connect()来创建这个毗连,并把函数放到一个include文件中―不是主剧本部分的,但能够从剧本中援用的文件。这类办法的长处以下:
编写毗连创建代码对照简单。不必要写出一切参数,就能够在毗连后用samp_db_connect()选择数据库,使一个函数能够举行两个PHP函数的事情。因为你能够将精神会合于剧本的共同标志,而不用为毗连创建代码专心,因而也使得剧本加倍易于了解。
可从剧本中会见include文件,但可移到Apache文档树的表面。这使它的内容关于客户机来讲是不成会见的,即便Web服务器设置不妥,毗连参数也不会表露给它们。利用include文件,关于埋没不想由Web服务器发送到站点的任何范例的敏感信息都是个良策。
固然云云,但这其实不意味着用户名和口令在任何意义上说都是平安的。假如没有接纳防备措施,在Web服务器主机上注册的用户,可以间接读取include文件。请参阅7.4.3节“从Web剧本毗连到MySQL服务器”关于安装DBI设置文件所形貌的防备措施,它们用于回护口令和用户名不受其他用户损害。对PHP的include文件也要使用一样的提防措施。
PHP言语上的影响
假如有C程序计划履历,则大概注重到:剧本中很多语法的布局与C程序计划中的十分相似。实践上,PHP语法很年夜水平下去自于C,因而这类类似处并非偶合。假如有些C的背景常识,就能够将它的很多内容转换到PHP。现实上,假如不克不及确信怎样用PHP编写表达式或把持布局,则能够试用C中编写它们的办法,这极可能也是准确的。固然PHP的基础部分次要在C中,但也包括了利用Java和Perl的成份。能够在正文语法中检察它,在那边同意以下情势:
#Perl-stylecommentfrom#toendofline
//c++orJava-stylecommentfrom//toendofline
//*C-stylecommentbetweenslash-startostar-slash*/
Perl的其他类似性包含‘.’字符串联接操纵符(包含‘.=’作为分外的毗连),变量援用和本义序列的办法是在双引号内而非单引号内注释的。
include文件能够由多个剧本利用。这进步了代码的可重用性,使代码加倍可保护。同时也同意对会见这个文件的每一个剧本不吃力地做出全局性的变动。比方,假如我们将数据库samp_db从pit-viper挪动到boa,则不用变动一簇单个剧本,而只需变动包括
samp_db_connect()函数的include文件中mysql_pconnect()挪用的主机名参数便可。
为了利用include文件,必需有寄存它们的中央,并且必需使PHP找到它们。假如体系已有了如许一个地位,则可使用。假如没有,则利用上面的历程创建一个include文件的地位:
1)创立一个目次来寄存PHP的include文件。该目次不克不及位于Web服务器文档树外部!笔者利用/usr/local/apache/php的PHPinclude目次,它与我的文档树在统一条理上(/usr/local/apache/htdocs),而不是在其外部。
2)经由过程完全的路径名大概告知PHP在搜刮时寻觅哪一个目次来援用include文件。后者的办法更便利些,由于假如我们利用了文件的基名,PHP就会找到它(PHPinclude文件与C头文件有些相似,个中包含的PHP将在多个目次中征采include文件,就像C预处置程序在多个目次中征采C头文件一样)。为了告知PHP往那里检察,修正PHP初始化文件(体系上的/usr/local/lib/php3.ini)来改动include_path的值。假如它没有值,能够将它设置为新的包括路径的完全路径名:
include_path="current_value:/usr/local/apache/php"
假如include_path已有值了,则把新的目次加到谁人值中:
include_path="current_value:/usr/local/apache/php"
3)创立想利用的include文件并将它放到include目次中。文件应当有一些有特性的称号,为了这个目标,这里我们利用samp_db.inc。它的内容将鄙人面列出。关于我们这里开辟的剧本,当毗连到MySQL服务器上时,会一向利用samp_db数据库,因而毗连函数samp_db_connect()也能够为我们选择samp_db数据库。假如毗连乐成并选择了这个数据库,这个函数就前往一个毗连标识符;假如产生毛病,则前往FALSE。产生毛病时将不打印动静,而且同意挪用者悄悄地加入,大概在情况同意时再打印动静。

察看一下,samp_db.inc文件的内容由‘<?php’和‘?>’括在一同。这是由于PHP是在HTML形式中入手下手读取文件的。假如没有这些标志PHP会把文件以纯文本发送进来,而不是作为PHP代码注释。假如想在文件中包括笔墨的HTML是很好的选择。可是,假如文件包括PHP代码,就必需在剧本标志外部关闭代码。
4)利用上面的行从剧本中援用文件:
include("samp_db.inc");
当PHP看到这一行时,就征采文件并读取内容。关于剧本的以下部分,文件中的任何事物都酿成可会见的。
在创建了我们的include文件samp_db.inc以后,就能够修正汗青联盟主页来援用include文件,并经由过程挪用samp_db_connect()函数毗连到MySQL服务器上:

include()与require()的对照
PHP的require()功能与include()相相似。分歧的地方在于,对include()来讲,在include()实行时文件每次都要举行读取和评价;而关于require()来讲,文件只处置一次(实践上,文件内容交换了require()语句)。这意味着假如有包括这些指令之一的代码和
大概实行屡次的代码,则利用require()的效力对照高。另外一方面,假如每次实行代码时想读取分歧的文件,大概有经由过程一组文件迭代的轮回,就利用include(),由于能够给想要包含的文件名设置一个变量,当参数为include()时利用这个变量。
samp_db.inc文件对其他函数也是有效的,我们能够将它作为各类其他事物的蕴藏库。实践上,还能够再创立两个函数放进到文件中。我们编写的每一个剧本在页面的开首城市发生一组相称夺目的HTML标志,而另外一组在开头。不用在每一个剧本中将它们逐字地写出,我们能够经由过程编写函数html_begin()和html_end()来做这些事。函数html_begin()可以提取几个指定了页面题目和头的参数。两个函数的代码以下:

然后我们能够修正汗青联盟主页来利用这两个新函数,以下所示:

请注重代码被分红了两块,两块代码之间呈现了接待动静的笔墨HTML文本。
发生页面入手下手和最初部分的函数用法给了我们一个主要的才能。假如想改动利用这些函数的页面头和尾的表面,能够在函数中包括一些代码。利用它们的每一个剧本也都将主动地遭到影响。比方,您能够把动静“CopyrightUSHL”放在每一个汗青联盟页面的底部。页面尾部函数html_end()会很简单地做到这一点。

一个复杂的查询页面

已嵌进到汗青联盟主页中的剧本运转了一个只前往单个行的查询。下一个剧本先容了怎样处置多行的了局集。它猎取并显现了member表中的内容。这就是第7章开辟的dump_membersDBI剧本的PHP等价物,因而称它为dump_members.php。它与DBI版本的分歧的地方在于,它但愿在Web情况中利用而不是在命令行中利用。因为这个缘故原由,它必要发生HTML输入而不是复杂地写出制表符分开的文本。为了使行和列大度地分列,我们将以HTML表情势编写会员资历纪录。剧本以下:

这个剧本利用了die()函数来打印动静,假如产生毛病则加入(die()函数与exit()函数相相似,可是它在加入之前打印动静)。与我们在汗青联盟主页中利用的悄悄地加入办法比拟,这是一种分歧的毛病处置办法。在dump_membes.php中,我们但愿看到一个特别的了局,因而打印毛病动静来讲明产生的成绩是有事理的。
剧本能够安装在ushl目次并用http://pit-viper.snake.net/ushl/dump_members.php会见。能够在汗青联盟主页的新剧本中增添一个毗连,以便人们懂得它:



处置查询了局

在这一节中,我们将更仔细地反省怎样实行MySQL查询并处置了局集。在PHP中,一切的查询都经由过程挪用mysql_query()函数来公布,这个函数提取查询字符串和毗连标识符作为参数。毗连标识符是可选的,因而能够用上面恣意一种情势挪用mysql_query():
$result=mysql_query($query,上一篇目次下一篇);#useexplicitconnection
$result=mysql_query($query);#usedefaultconnection
关于不前往行的查询(非SELECT的查询,如DELETE、INSERT、REPLACE和UPDATE),mysql_query()前往TRUE大概FALSE申明查询乐成大概失利。为了取得乐成的查询,能够挪用mysql_affected_rows()找出有几行被改动(多是删除、拔出、交换大概更新)。
关于SELECT语句,mysql_query()前往了局集标识符大概FALSE申明查询是乐成或是失利。为了取得乐成的查询,利用了局集标识符能够取得更多的有关了局集的信息。比方,能够找出了局集有几行或列,大概提取这个了局集外部包含的行。
当mysql_query()前往FALSE(也就是零)时,意味着查询失利―换句话说就是产生一些毛病而不克不及实行查询。查询失利大概有上面几个缘故原由:
查询多是畸形的并包括语法毛病。
查询按照语法多是准确的,可是在语义上倒是偶然义的,比方要从不包括列的表当选择列时。
没有充实的权力实行查询。
因为收集成绩,大概已毗连不到MySQL服务器主机。
在以上每种情形中(另有其他情形),mysql_query()都前往FALSE。假如要想晓得毛病的具体缘故原由,就挪用mysql_error()大概mysql_errno()取得毛病动静字符串大概数字毛病代码(请参阅8.2.4节“处置毛病”一节)。
思索mysql_query()酿成的两种最多见的毛病,前往值是行计数,大概它包括查询前往的数据,二者都是毛病的。
1.处置不前往了局集的查询
上面的代码利用DELETE申明了怎样处置不前往任何行的查询:
$result=mysql_query("DELETEFROMmemberWHEREmember_id=149");
if(!$result)
print("queryfailed
");
else
printf("numberofrowsdeleted:%d
",mysql_affected_rows());
假如有一个ID号为149的成员,MySQL就删除纪录,且mysql_query()前往TRUE。假如没有如许的成员呢?这类情形下mysql_query()仍旧前往TRUE!这使将精神耗在曲解mysql_query()的前往值是行计数的人们十分惊奇。两种情形都前往TRUE,是由于不论实践上是不是删除一些行,查询都是正当的。由查询感化的行的数量则是完整分歧的事。若要在查询乐成以后提取值,可挪用mysql_affected_rows()。
2.处置前往了局集的查询
上面的实例供应了SELECT查询处置的大抵概略:

不要假定mysql_query()会乐成
在PHP邮件发送清单中,新的PHP用户会配合扣问:实行剧本时为何会产生上面的毛病动静:
Warning:0isnotaMySQLresultindexinfileonlinen
这个动静将为零的了局集标识符的值传送给了希冀无效了局集的一些函数(如提取行的函数)。这意味着早时的mysql_query()挪用前往了零值―就是FALSE。换句话说就是mysql_query()失利,而且在由其他函数利用它之前,剧本编写程序对反省前往值其实不懊恼。在利用mysql_query()时,要一向检测前往值。
假如查询失利,了局将为FALSE,对这个了局我们只是打印一条动静(取决于情况,其他对毛病的反响大概更符合)。假如查询乐成,则mysql_query()前往了局集标识符。这个前往值在很多办法中是有效的(但不是作为行计数!)。了局集标识符可用于以下方针:
将它传送给mysql_num_rows(),来断定了局会合的行数。
将它传送给mysql_num_fields(),来断定了局会合的列数。
将它传送给提取行的例程,来提取了局集的一连行。这个实例利用了mysql_fetch_row(),可是另有其他的选择,我们即刻就会看到它们。
将它传送给mysql_free_result(),来开释了局集并同意PHP处置一些与之相干的源文件。
在mysql_query()乐成地实行SELECT查询以后(请拜见表8-1),PHP为检索了局集供应了几个提取行的函数。当不再有行时,每一个函数都失掉一个了局集标识符作为参数并前往FALSE。
表8-1PHP行提取函数

函数名前往值mysql_fetch_row()一个数组,由数字索引会见其元素mysql_fetch_array()一个数组,由数字索引或相干索引会见其元素mysql_fetch_object()一个工具,作为属性会见其元素最基础的挪用是mysql_fetch_row(),它前往了局集的下一行作为一个数组。数组的元素经由过程从0到mysql_num_fields()-1局限内的数字索引会见。上面的实例申明了怎样在每行都提取和打印值的复杂轮回中利用mysql_fetch_row():

变量$row是一个数组。可用$row[$i]会见它,$i在这里是数字列索引。假如熟习PHPcount()函数,能够试着用它而不要用mysql_num_fields()来断定每行的列数。count()只盘算这个数组中已设置值的元素的数目,PHP不是与NULL列值绝对应的元素设置值。count()对前往列数的器度是不成靠的,由于那不是它想要的。它还用于别的两种提取行的函数。
第二个提取行的函数mysql_fetch_array()在表8-1中列出,它与mysql_fetch_row()相相似,可是由数字索引和相干索引前往的数组元素都是牢靠的。换句话说,能够经由过程数字或称号会见元素:

由mysql_fetch_array()前往的信息是mysql_fetch_row()前往的信息的扩大集。除此以外,两个函数之间的分歧功能是能够疏忽不记的,挪用mysql_fetch_array()能够无特别功能消耗。
第三个提取行的函数mysql_fetch_object(),前往了局集的下一行作为工具,这意味着用$row->col_name语法会见行的元素。比方,假如从President表中检索last_name和first_name值,能够用$row->last_name和$row->first_name会见那些列:

在查询了局中测试NULL值
可使用isset()函数测试SELECT查询前往的列值是不是为NULL。比方,假如行包括在$row数组中,那末假如$row[$i]对应于NULL值,则isset($row[$i])就为FALSE,假如$row[$i]为非NULL值,则isset($row[$i])就为TRUE。相干的函数是empty(),可是关于NULL和空字符串,empty()前往的了局都是一样的,因而作为NULL值测试而言,这个函数是无用的。
假如查询包含盘算的列怎样办?比方,公布一个作为表达式了局盘算的前往值的查询:
SELECTCONCAT(first_name,"",lsat_last_name)FROMpresident
如许编写的查询不适于利用mysql_fetch_object()。选择的列名自己就是表达式,它不是正当的属性名。但是,能够经由过程给列付与一一般名来供应正当的称号。上面的查询将列的别号定名为full_name,假如用mysql_fetch_object()提取了局,就同意它以$row->full_name情势来会见:
SELECTCONCAT(first_name,"",lsat_last_name)ASfull_nameFROMpresident

处置毛病

PHP供应了三种处置毛病的办法:
■用‘@’作废毛病动静。能够对一些显现动静的函数利用‘@’。当我们挪用mysql_pconnect()制止来自于函数的毛病动静不在发送到客户机的页面上呈现时,就已在做这一点了。
利用error_reporting()函数。这个函数按以下级别将毛病呈报翻开大概封闭:
毛病级别毛病呈报范例1一般函数毛病2一般告诫4剖析程序毛病8请注重为了把持毛病呈报,可挪用error_reporting()函数,且参数为想要激活的级其余总和。封闭级别1和级别2告诫应当完整可以作废来历于MySQL的动静:
error_reporting(4+8);
你大概不想封闭有关剖析毛病的级别4告诫,假如关失落了,大概要有一段困难的工夫用来调试它对剧本酿成的修改!级别8告诫经常被疏忽,但偶然它指出剧本中应当注重的成绩,因而您大概也想把它激活。另有16和32毛病级别,它们都来自于PHP中心动员机,而非函数,因而一般情形下不用思索它们。
利用mysql_error()和mysql_errno()。这些函数呈报了MySQL服务器前往的毛病信息。它们与响应的CAPI挪用相相似。mysql_error()以字符串情势前往毛病信息(假如不产生毛病就前往空字符串)。mysql_errno()前往一个毛病数字(假如不产生毛病就前往0)。两个函数都有指定与MySQL服务器毗连的毗连标识符参数,在前往形态的毗连上都前往比来挪用的MySQL函数的毛病信息。毗连标识符是可选的,假如缺掉,就利用比来翻开的毗连。比方,能够如许呈报mysql_query()的毛病:

mysql_error()和mysql_errno()的PHP版本在一个主要方面与CAPI中对应的部分分歧。在C中,即便试图毗连服务器失利,也会失掉毛病信息。相反,PHP挪用直到毗连创建乐成,才前往有效的毗连信息。换句话说,假如毗连失利,就不克不及用mysql_error()和mysql_errno()呈报失利缘故原由。假如要呈报毗连失利的特别缘故原由而不是一般缘故原由,则必需做特别的思索。请参阅附录H“PHPAPI参考”,个中具体先容了怎样往做。
当检测到毛病时,本章的剧本打印了相称一般的毛病信息,如“查询失利”。但是在开辟剧本时,您会发明:到场一个mysql_error()挪用对帮您发明毛病的特别缘故原由是很有效的。

援用成绩

在PHP中机关查询字符串时,晓得援用成绩是需要的,就像在C和Perl中一样。固然函数名在各类言语中是分歧的,但处置援用成绩的办法倒是相似的。假定正在机关一个,将新的纪录拔出到表中的查询,能够在值的前后加上引号拔出到字符串列中:

这里的成绩是援用值的自己还包括着引号(“O’Malley”),假如将查询发送到MySQL服务器会招致语法毛病。在C中我们挪用mysql_escape_string()办理这个成绩。在PerlDBI剧本中则利用quote()。PHP有一个addslashes()函数能够完成一样的事变。比方,挪用addslashes(“O’Malley”)前往“O’Malley”值。将后面的实例做以下编写来办理援用成绩:

DBIquote()办法是把前后的引号加到字符串中。addslashes()则不是,因而我们仍需在查询字符串中要拔出值的四周将那些引号显式地指定出来。
当编写信息呈现在Web页面上时也将产生援用成绩。假如正在编写一个将作为HTML或URL的部分呈现的字符串,并且这个字符串包括HTML或URL外部的特别字符,最好将它编码。PHP函数htmlspecialchars()和urlencode()能够做到这点,它们与CGI.pm
escapeHTML()和escape()办法相相似。


人们常说“成功孕育成功”,这种说法明显非常适合MySQL的情况。MySQL学习教程这个开源数据库号称在全世界有超过110万份的完全安装。

再见西城 发表于 2015-1-18 10:51:20

如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。

兰色精灵 发表于 2015-1-21 20:16:04

代替了原来VB式的错误判断。比Oracle高级不少。

莫相离 发表于 2015-1-30 22:11:59

也可谈一下你是怎么优化存储过程的?

老尸 发表于 2015-2-6 16:17:31

作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!

简单生活 发表于 2015-2-17 04:48:03

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

admin 发表于 2015-3-5 16:00:17

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

爱飞 发表于 2015-3-12 10:21:29

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

不帅 发表于 2015-3-19 20:20:00

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
页: [1]
查看完整版本: MYSQL网站制作之PHP基本