MySQL是一款广受欢迎的数据库,由于它是开源的半商业化软件,所以市场占有率高,倍受PHP开发者的喜爱,一直被认为是PHP的最好搭当。今天向各位PHP新手讲解一下用PHP操作MySQL的基本思路。下面的演示我们将会在PHP 4和MySQL 4中完成,如果你想跟着做,请确定您的PHP是4.06或以上版本,MySQL是3.X也可以。
首先你要知道操作MySQL必须用到的相关信息。如果你的是虚拟主机,那么空间商会把这些告诉你;如果你是本机调试,那么可以通过命令行模式创建用户、数据库等,具体的操作可以在搜索引擎搜索“MYSQL 4.1简体中文手册”,把它下载回来看看。
知道了MySQL的信息以后,我们要定义四个变量(变量名可以随便改,只要不用错就可以了):$db_host(MySQL服务器地址)、$db_name(数据库名称)、$db_user(帐号名)、$db_password(帐号的密码)。你还得了解一下PHP函数库中这几个函数的用途:mysql_connect()、mysql_select_db()、mysql_query()、mysql_fetch_array()、mysql_free_result()、mysql_close(),这几个函数的详情可参考《PHP手册》中文版。下面就先看一个数据库连接的例子:
<?php
//结合刚才定义过的变量,使用mysql_connect()连接,格式如下
//mysql_connect("MySQL服务器地址","帐号名","帐号的密码")
//如果连接失败,就用die()函数停止程序并输出错误信息
$link = mysql_connect($db_host, $db_name, $db_password)
or die(‘连接失败’);
//关闭连接
mysql_close($link);
?>
好了,懂得连接以后,那就可以试着用mysql_select_db()选择数据库,用mysql_query()向MySQL发送操作语句,然后用mysql_fetch_array()获取查询结果了。下面看一个简单的例子,如果你的数据库中有一张users数据表,里面存放了用户的各种资料,就可以通过这个例子是取得并输出lmws这位用户的email(数据表的创建和SQL语句可参考MySQL手册):
<?php
//连接数据库
$link = mysql_connect($db_host, $db_name, $db_password)
or die(‘连接失败’);
//选择数据库
mysql_select_db(‘user_db’);
//定义SQL语句
$sql = "SELECT email FROM user_table WHERE user_id = ‘lmws’;";
//发送查询
$result = mysql_query($sql);
//把结果抓取为$user_data数组
$user_data = mysql_fetch_array($result);
//关闭连接
mysql_close($link);
//输出结果
echo $user_data['email'];
?>
这样我们就成功地将lmws这位用户的email输出来了。如果你是新手,可能会觉得$sql变量里的那个语句不好理解,不要怕,那是SQL语句,PHP就是把这样一条条的SQL语句送到数据库中执行的,SQL语句语句的教程在MySQL手册里有。
或许还有人有这样的疑问:发送一次SELECT查询所返回的结果不止一条,那怎么对每一条结果时间处理(或输出)呢?问得好,我们要用while循环语句。请看例子
<?php
//连接数据库
$link = mysql_connect($db_host, $db_name, $db_password)
or die(‘连接失败’);
//选择数据库
mysql_select_db(‘user_db’);
//定义SQL语句
$sql = "SELECT id,email FROM user_table;";
//发送查询
$result = mysql_query($sql);
//用while循环语句处理
while ($user_data = mysql_fetch_array($result)) {
echo "用户 {$user_data['id']} 的Email地址是 {$user_data['email']} <br />";
}
//关闭连接
mysql_close($link);
//输出结果
echo $user_data['email'];
?>
用PHP操作MySQL的大概思路就是这样,只要改一改$sql变量里的语句就可以产生不同的效果了。
while 循环是PHP中最简单的循环类型。它和 C 语言中的 while 表现得一样。while语句的基本格式是:while (表达式) 循环语句
while语句比较简单,它先检查表达式,如果表达式为真,则执行循环语句直到表达式为假。
下面的例子显示数字1到10:
<?php
$i = 1;
while ($i <= 10) {
print $i++;
}
//把“$i<=10”放入while语句中,由于原来的$i等于1,所以“$i <= 10”为真,执行大括号内的语句。
?>
do..while和while循环非常相似!它们的区别在于——do..while是在每次循环结束时,才会检查表达式的值;而while是在开始时就检查表达示的值。也就是说do..while总会确保循环语句能够执行一次,然后判断,如果值为TRUE,那么就继续执行循环语句;如果值为FALSE,那么就停止循环。
do..while语句的用法如下:
<?php
do {
//循环语句
} while (/*判断语句*/);
//请看一个例子,输出1到10
$i = 0;
do {
echo ++$i;
} while ($i<10);
?>
if 结构是很多语言(包括PHP在内)最重要的特性之一,它允许按照条件执行指定代码。PHP的if结构和C语言相似:
<?php
//如果符合“条件”,就执行“声明”
if (条件)
声明
?>
if语句的范例:
<?php
//如果$a大于$b,则输出“a大于b”
if ($a > $b)
print "a大于b";
?>
如果需要按条件执行多个语句,可以将这些语句放入语句组中,用大括号“{}”括起来。
范例,如果$a大于$b,就输出“a大于b”并且将$b加上10:
<?php
if ($a > $b) {
print "a大于b";
$b = $b + 10;
}
?>
如果要在满足某个条件时执行语句,而在不满足该条件时执行其它语句,这时就要用到另一个流程控制语句——else。else延伸了if语句,可以在if语句条件不满足时执行其它语句。
范例,在$a大于$b时显示“a大于b”,否则显示“a不大于b”:
<?php
if ($a > $b) {
print "a大于b";
} else {
print "a不大于b";
}
?>
elseif,和此名称暗示的一样,是if和else的组合。它和else一样延,伸了if语句。可以在原来if的条件不符合时执行不同语句。但是elseif和else不一样的是,它仅在 elseif 的条件符合时才执行语句。
不明白?不用担心,马上看范例:
<?php
//如果a大于b时,则显示“a大于b”
if ($a > $b) {
print "a大于b";
}
//如果a等于b时,则显示“a等于b”
elseif ($a == $b) {
print "aa等于bb";
}
//如果a即不大于b,也不等于b时,则显示“a小于b”
else {
print "a小于b";
}
?>
注意:elseif和else if是一样的,两种写法都可以,不会影响程序执行。
学完这三个流程控制语句之后,只要结合前面所学的常量的运用,就可以写出一些小小的程序来了,快试试。
echo()是一个用来输出字串的语句。echo()不是一个真正的函数,它只是一种语言结构,因此它没有反回值。而且你使用它时不需要加圆括号,当然,你加上圆括号也不会有任何问题。
echo语句的几种用法:
<?php
echo "Hello World"; //输出“Hello World”
echo ("Hello World"); //这样输出也是和上面一样的,但才惯上不这么用
echo "第一行
第二行
第三行"; //如果输出的文字中有换行符的话换行符也会照样被输出
echo "第一行 \n第二行 \n第三行"; //你也可以加入 \n 来产生一个换行符
echo "如果要在字串中加入半角的双引号的话,就要\"这样做\""; //要在半角的双引号前加上 \
$website="大矩阵PHP技术作坊"; //你也可以用echo语句输出变量
echo "本站是$website"; //输出“本站是大矩阵PHP技术作坊”
echo ‘$website’; //当使用双引号时,会输出变量名而非变量。这个例子输出为“$website”
echo <<<END
这种是类似是Perl的输出方法
它的好处是可以在这个区间不加修改地放入一些特殊字符
如插入半角的双引号(")时无需加上
这种方法适合于插入一大段HTML代码
END;
?>
把PHP代码嵌入HTML代码中
PHP最大的一个特性就是可以和HTML代码混合,但必须在页面里加上标记来表示PHP代码的开始和结束,这样解释器才能正确识别哪些是PHP代码,而PHP代码以处的部分,解释器会不作任何处理。
标记一段PHP代码的方式有几下几种:
方法一:
<?php echo "这种是类似于XHTML或XML档格式的嵌入方法,也是最常用的、默认的方法"; ?>
方法二:
<? echo "这是一种较简单嵌入方法,但必须把php.ini里的short_open_tag设为on才能用"; ?>
方法三:
<script language="php">
echo "这种PHP嵌入语法类似于Javascript和VBscript,也是默认的嵌入方法";
</script>
方法四:
<% echo "这种是ASP的嵌入风格,但必须把php.ini里的asp_tags设为on才能用"; %>
PHP的语句分隔
PHP和C、Perl相同,每个语句之间是用英文分号(;)来分隔的。
例如:
<?php
echo "第一行";
echo "第二行";
?>
在PHP里注释代码
编写代码的过程中,为了让自己记得做过什么,或者让某个语句的作用一目了然,我们常要写注释,注释的内容不会被解释器处理,只在直接打开源代码里才能看到。
在PHP中,写注释的方法有三种:
<?php
//这里是注释内容。这种是C++的注释风格,只能注释单行的内容。
#这里是注释内容。这种是Unix shell的注释风格,也是只能注释单行的内容。
/*
这里是注释内容。
这种注释方法可以使用多行注释,但绝对不能把/* */这个字串再嵌入注释里
*/
?>
首先建立一个PHP文件,例如:first.php,然后输入以下内容:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php
echo "Hello World";
?>
</body>
</html>
把这个页面上传到网页目录里,打入地址后,输出到你浏览器应该是如下代码:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
Hello World
</body>
</html>
当你的浏览器接收到以上代码里,恭喜你,你的第一个PHP页面完成了!这个页面只是利用了PHP的打印语句echo()显示了“Hello World”这个字符串,非常简单。
从一名开发人员到数万个使用者;
从一个站点到互联网上20%的域名;
从一种鲜为人知的语言到网络脚本主流之一;
从Linux上的悄然诞生到Windows用户的疯狂增长。
这一切,用了八年——没有任何大型商业公司支持、推动、炒作。
创造这个奇迹的精神叫做自由,创造这个奇迹的脚本叫做PHP。
悄然诞生的PHP/F1
PHP是PHP Hypertext Preprocessor(PHP超文本预处理器)的缩写,如同GNU的名字一样,它开了递归命名这个OpenSource阵营里爱开的玩笑。你也许想不到,PHP这个英文缩写现在的含义是它的 Fans们投票选出来的。PHP最初的含义是Personal Home Page Tools,是Rasmus lerdorf用Perl写成的一套工具。当时Rasmus写它的目的只是看看有哪些人访问他的简历。为了能打动未来的雇主,Rasmus允许任何人查看他主页的访问日志。很快的,Rasmus的日志吸引了很多人的注意,他们纷纷发邮件给Rasmus询问如何实现这个功能,于是 Rasmus决定把这些代码分发出去。
在1995年晚些时候,Rasmus用PHP建立了一个邮件列表,供大家交流思想、分享代码和修复BUG。放在网上的简历也派上了用场,Rasmus在多伦多大学找到了一份工作,负责为学校的图书馆建设Web界面的学生信息管理系统。当时互联网上并没有用来解析表单的工具,于是Rasmus用C编写了一些标签(Tag),他叫它FI(表单解释器),因为它能从表单(Form)中取得变量的值。后来Rasmus把PHP和FI集成到了一起,称为PHP/FI,那就是PHP的最初版本。
一开始,Rasmus并没有打算开放PHP/FI源代码,1996年时,他甚至曾有过把PHP/FI商业化的想法,不过他从全球各地发送来的大量改进原程序和修复BUG的代码中得到了很大帮助,这让他多少有些犹豫,同时他也清楚地意识到发展PHP的最好方法就是保持源代码的开放。所以最后他开放了PHP/FI的源代码。Rasmus深知失之东隅收之桑榆的道理,他说:“(开放源代码)这只会给我带来帮助。如果全世界的人都使用我写的代码,那么最终我会从这(PHP)以外得到回报。”他在Linuxcare的新工作证明了他的预言是正确的。
而在PHP的定位上Raslnus再次表现出了他的远见卓识。“我当时,现在也仍然认为,PHP的目的是试图找到解决Web问题的最佳路径”,在一次访谈中 Rasmus回忆道,“它并不打算成为一个广泛应用的脚本语言,人们将通过PHP找到解决Web问题的快捷方案。”
正是开放源代码的运作机制和专注网络的不凡定位让PHP获得了日后的成功。开源运作使PHP能从全球开发人员那里源源不断地得到力量,而专注网络则把这些强大的力量集中于一个点。犹如一个功力深厚的武学家把全身内力集于掌心,这一掌出去,势必惊天动地。而 PHP接着要做的,就是苦练内功。为了使PHP能更好地解决Web问题,Rasmus,当然,是在众多支持者的帮助和推动下,不断地对PHP/FI进行改进。1997年11月,PHP/F1 2,0在历经了数个BETA版本后正式发布。当时全球有数千个用户和约50,000个域名安装了它,这些域名约占全球的1%。而不久之后的PHP3.0 Alpha版,则使PHP走上了高速发展的道路。
脱胎换骨的PHP3
和前一版本相比,PHP3.0可以说是一种全新语言,它首次采用了类似今天PHP的语法结构。也正是从这个版本开始,PHP不再是一个人主导开发的项目——Andi Gutmans和Zeev Suraski这两个在PHP发展中起着关键作用的天才加入了进来。如果说Rasmus的远见注定了PHP的成功,Andi和Zeev的加入则加速了PHP的成功。当时Andi和Zeev也在为一所大学工作,任务是开发电子商务程序。他们选择了PHP/F1 2.0,不过在使用中发现功能的明显不足。为了能完成任务,他们重写了PHP/F1 2.0的代码。后来他们把改进后的代码发送给了Rasmus——这就是PHP3.0的雏形。收到代码后,Rasmus和Andi、Zeev进行了认真地讨论,最后他们决定终止 PHP/F1 2.0的开发,而把PHP3.0作为 PHP/F1 2.0的官方后续版本。PHP3.0进行重大调整,引入了强大的可扩展性、面向对象支持和新的语法结构,这些特性使得PHP3.0得到了巨大的成功,尤其是它的可扩展性吸引了大量的开发者加入开发和提交自己开发的新模块,这使PHP开发阵营和PHP本身都迅速地得到了充实。同PHP3.0一起“发布”的还有PHP Hypertext Preprocessor这个名字,它标志着PHP不再只是个人主页的支持工具,也将开始对商业应用提供强大的支持。
到1998年末,全球已有约10,000用户安装了PHP,约100,000个网站由PHP支持。当PHP3.0达到巅峰时,全球约10%的Web服务器都安装了它。 1998年6月PHP/MYSQL获得了Web98的年度大奖。
为了增强复杂程序运行时的性能和PHP自身代码的模块性,1998年冬天, Andi和Zeev开始重新编写PHP的代码。PHP3,加入的新功能和第三方的广泛支持使高效处理复杂程序成为可能,但是PHP本身却缺乏这样的能力。于是Andi和Zeev编写了一个引擎,并用他们名字的缩写来命名它,那就是我们熟悉的 Zend引擎。Zend引擎在1999年1月发布并在年中首次引入到PHP中,从此成为PHP的动力核心,推动着PHP高速发展。提到Zend引擎就不得不重点说说 Zeev,他和另一个合伙人Doron Gerstel成立了一家公司,Zend Technologies。这家公司在PHP的发展中有着不可磨灭的功绩,从进一步加速PHP的accelerator和优化PHP效率的optimizer到支持单步跟踪的PHP集成开发环境Zend Studio和保护PHP代码安全的Encoder,它的产品几乎涌盖了整个PHP的开发和使用过程。而这些产品为PHP走向商业应用铺平了道路。Zend Technologies最近整合了原来的产品推出了一个新的系列,以进一步提升PHP的表现,为PHP进军企业级市场做准备。另外,即将发布的PHP5的核心——Zend引擎2.0也是由 Zend Technologies主导开发的,关于PHP5的话题,我们稍后再提。
风行全球的PHP4
在PHP3.0发布两年后,整合了 Zend引擎的PHP终于发展成为新的版本——PHP4.0。在这个版本中,PHP的效率得到了很大的提高,同时开始支持更多的Web服务器,支持HTTP SESSION;和输出缓存,支持更为安全的用户输入处理。PHP4.0是一个里程碑,它标志着PHP开始走向成熟。在此基础上,—些相关项目也随之成熟。其中最著名的是PEAR(PHP扩展与应用资源库),它定义了PHP编码规范并提供了PHP程序的基本类,并可能在将来增强为在开发人员间分发PHP和C语言编写的PHP扩展的关键方法。这个项目的存在,为PHP走向规范化和规模化奠定了坚实的基础。
PHP4是目前PHP的最新版本,它已经风靡了全球。数万名开发人员和几百万网站已安装了PHP,每五个域名中,就有一个使用PHP来支持它的网站。PHP在开源阵营中的地位日益重要,LAMP(Linux +Apache+Mysql +PHP)组合在 Linux和Windows的服务器市场争夺战中功不可磨。而根据NetCraft最近的统计,PHP的 Windows平台使用者也开始不可思议地疯狂增长。毫不夸张的说,PHP已经成为了当今web界三大主流脚本语言之一。它是如此的出色,以至于很多人习惯于把PHP与Asp.net和J2EE相比较,你甚至可以在MSDN找到比较Asp.net和PHP的文章。其实不管结论如何,当你开始比较时,对PHP来说就已经意味着胜利——人们是从来不把蚂蚁和大象相提并论的。而被这些身出名门的泛目的(general purpose)语言当作对手的 PHP却只是一个网络脚本——当然,它也只打算做一个网络脚本,最出色的网络脚本。
不过,PHP对网络的专注并不意味着你不能用它来做一些其他的事情。PHP GTK是一个让Rasmus都感到吃惊的项目,它允许用户使用PHP来编写 GUI程序。这对于习惯了用PHP编写网络脚本的程序员们似乎是件不可思议的事情。而要让你的GUI程序在Windows下运行,你只需要简单的COPY几个文件到特定的目录就可以了。
也许你要问,GTK是不是有点不务正业,是不是和PHP专注网络的方向背道而驰?对于GTK,Rasmus说:“PHP- GTK主要用在你需要在一个程式中同时提供Web界面和GUI界面的情况下。(在这种情况下)能使用同样的后台代码是一个重大的胜利。”
姗姗而来的PHP5
由于PHP4越来越成熟,越来越多的大型网站开始采用PHP来架构它们的网站。日浏览量15亿次的大型门户网站 Yahoo就放弃了自己原来的脚本语言而全面转向了PHP,原因是经过一段时间的试用,他们发现“PHP性能卓越”。Yahoo的加入对PHP乃至整个开源团体都是一个巨大的推动;但是另一方面,这些用户的加入也对PHP提出了更高的要求,除了稳定和高速外,还要处理日益复杂的企业逻辑。而这也正是PHP4比较头痛的地方,因为一旦项目复杂度提高,面向对象就会变得重要起来,而PHP4中的对象机制并不健全。PHP4中的对象没有访问控制符,你可以任意访问对象的属性,这使类的实现无法隐藏;对象之间的复制采用的是和简单变量类似的机制,这让采用面向对象的PHP程序要比面向过程的稍显缓慢。另外PHP4还存在着缺乏结构化异常捕捉之类语言体系上的问题。当然,没有人比PHP的开发者和使用者更了解这些问题了,伴随着PHP新闻组中对这些问题的激烈讨论,一个全新的PHP版本也逐渐成形。
2003年6月29日,是值得庆祝的日子——期待已久的PHP5终于发布了它的第——个BETA版本。在这个版本中,我们欣喜地看到对象机制得到了前所未有的增强,PHP终于成为一个真正支持面向对象的语言。PHP5新添加的一些主要特性如表所示。
PHP5新特性
1、新的面向对象机制
●构造函数和析构函数
●对象的引用
●对象的克隆
●对象中的私有、公共及受保护模式
●接口(Interfaces)
●抽象类
●__call __set和__get
●__autoload()
●静态成员
2、异常处理和自定义错误处理
3、名称空间
对象机制的完善和加强不只意味着效率的提高,而且标志着PHP从此将可以采用真正的对象机制来处理复杂的企业逻辑。对于竞争者来说,这意味着PHP在个人用户和中小型网站市场上取得不俗的成绩后,开始进入企业级市场。而对于开发人员而言,则意味着,你可以更方便地使用PHP5来实现设计模式,编写测试用例和重构你的代码。在PHP5身上,我们看到了不少Java的影子,这其实没有什么好奇怪的,因为PHP身上—直都闪烁着许多语言的优秀之处。PHP就是这样自由而开放,它从来不拒绝吸收优秀的东西,所以它能在崎岖的道路上不断前进。不过吸收绝不是原封不动地拿过来再塞进去,而是指和原有体系的完美融合。如果你认真研究过PHP5,你就会发现它的对象机制有着不少特殊之处。而正是这些特殊之处使得PHP能在实现新特性的同时保持自己—贯的风格。这一切,使得PHP更加的方便易用,当然,还有高效和强大。
意大利有一种咖啡叫Cappuccino,由1/3的意大利Expresso咖啡,1/3的鲜牛奶,加上1/3的牛奶泡沫组成,味道香浓而独特。比起入口苦涩而回味清香的Java来,PHP就像一杯Cappuc- clno。而这杯Cappuccino的第五个版本将在今年年底发布。如果你想品尝它的味道,或者你想再次见证奇迹,那么从现在开始,请关注PHP5——它将是又一个奇迹的开始。
作者简介:陈理捷,石油大学计算机系学生。主要兴趣是企业信息化解决方案、软件体系架构和软件开发过程。