当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

第3章构筑简单的数据库应用程序

9/17/2020 9:43:31 PM 人评论

第3章构筑简单的数据库应用程序

第3章 构筑简单的数据库应用程序

3.1 记录每页的浏览数

页面浏览数的统计,是网站分析的基础中的基础。对Web页面来讲,页面浏览数并非衡量其优劣的唯一指标,但是从衡量页面关注度来看,这是一个重要的特征。

本节将构筑统计页面浏览数的应用程序,并将结果保存在数据库中。通过对统计数据进行排序、合计等操作,可以进行各种各样的分析作业,对改善网站的品质非常有帮助。

alt

本例要点

2.4节中曾经介绍过,对于所有应用程序的共通功能来说,不用在每一个脚本中使用require_once命令,只需在php.ini设置auto_prepend_file参数,就可以自动包含进脚本。这里就不再赘述了。

本节中第一次涉及数据库编程,普通程序员一般都会有数据库编程好像挺难的感觉。实际上,完全没必要害怕数据库编程,数据检索、登录的步骤都是固定的操作。学会了操作流程,以后几乎所有的地方都可以借用了。请务必注意此节数据库的关键操作。

目录结构

alt

为了方便,本例将pdo.ini配置在公开目录下。本来这样的设置文件不能配置在终端用户能直接链接的目录之下。pdo.ini文件中包含了链接字符串、链接数据库的用户名/密码。这些信息绝对不能泄露给第三者,如果泄露,数据库将被其自由链接、操作了。

在实际的应用程序中,设定文件必须放置在终端用户不能接触到的地方——公开目录以外的地方。

数据库的表结构

数据库里的表结构access_counter(访问记录表)如表3-1所示。

表3-1 访问记录表(access_counter)

alt

本例代码

alt

要操作数据库,首先必须生成PDO对象,生成PDO对象时,从第一参数开始指定“连接字符”、“用户名”、“密码”。

这些链接信息将会用在多个脚本中,而在各个脚本中写入固定的连接信息,显然不是聪明的编程的方法,因此将链接数据库的信息都记录在外部的pdo.ini文件中,.ini设定文件的读取方法在2.4节有介绍。

alt

setAttribute方法用于设定关于数据库操作的种种属性。这里设置当程序发生错误(PDO::ATTR_ERRMODE)时抛出PDOException例外(PDO::ERRMODE_EXCEPTION)。使用try…catch命令处理数据库操作的例外是,必须设置此属性有效。

alt

MySQL数据库的文字代码已经被设为UTF-8,因此此处必须执行“SET CHARACTER SET utf8”来保证抽出的多字节字符不出现乱码。

alt

prepare方法对指定的SQL命令进行预编译后,形成可利用的状态。SQL命令中含有如“:url”样的字符串,这些字符串(也被称为place holder预置位)会在SQL被执行前必须用实际数据进行转换,可以在对象SQL的任何地方设置。prepare方法生成的“准备好的SQL命令”以PDOStatement对象的形式返回。

此处以被访问的URL为条件检索表access_counter,以判断表的数据是否存在。

alt

替换SQL命令中的预置位(place holder)使用bindValue函数。bindValue函数的第一参数为预置位名(如[:url]),第二参数为具体的值。$_SERVER['SCRIPT_NAME']为执行中脚本的路径。

alt

设定好各参数好后,excute方法实际执行SQL命令。

alt

fetch方法返回搜索结果集的下一行(具体的数据检索过程见3.3节)。结果集生成后,定位在最初的记录位置,如果最初fetch方法失败(FALSE)后,说明结果集中没有数据。

总之,现在的执行URI在access_counter中存在时,用UPDATE(更新)命令,不存在时用INSERT(插入)命令。同一个关键字的记录如果在access_counter中存在时,INSERT时会出错的。

INSERT(插入)时,将访问统计值设为1。UPDATE(更新)时,将访问统计值加1。

alt

与7行到9行同样的步骤。

alt

数据库操作过程发生例外时,显示详细信息,同时终止处理。

alt

从开始起定义数据库连接文字串、用户名、密码,关于数据库连接文字串请参见后面的补充。

alt

补充

数据库抽象层

PHP准备了与多种数据库的连接函数。现在一般使用的关系数据库(RDB)都能对应。使用数据库连接函数时,灵活性方面有很大的不足。PHP提供了MySQL,PostgreSQL,Oracle等各种数据库用的连接函数。如果你用了MySQL数据库,当然得应用MySQL连接函数,今后一直使用MySQL数据库,不会有任何问题。如果中途觉得MySQL的功能不够强大,想转换到更好的Oracle数据库,这时就不是仅仅更换数据库的问题,还必须修改代码,最少应该将程序中所有使用MySQL连接函数的地方改为Oracle连接函数。这时,这种方式的灵活性不足就显现出来了。

另外,不同的数据库函数的式样之间,有一些很微妙的差别,要有意识地注意那些差别进行编程,非常麻烦,也是产生错误的根源。

为解决上述问题,就出现了数据库抽象层这个概念。数据库抽象层是消化了各种不同数据库间的差别,为应用程序链接数据库时,提高共同接口的程序库,其机制如图3-1所示。

alt

图3-1 数据库抽象层机制

使用了数据库抽象层后,原来连接MySQL时必须使用mysqli_connect函数,连接PostgreSQL时必须使用pg_connect函数的区别被消化了,而是代之为共用的数据库连接方法。

称为数据库抽象层的程序库有很多种,本书采用了在PHP 5.1中新导入的具有能对应面向对象语法且处理速度快等优势的PDO(PHP Data Objects)。

数据库连接字符串

数据库连接字符串是集合了连接数据库时必要信息的字符串。在数据库抽象层中,改变数据库连接字符串就能改变连接的数据库。

表3-2所示的是常用数据库的数据库连接字符串格式。

表3-2 常用数据库的数据库连接字符串格式一览

alt

SQL语言

SQL语言是控制数据的插入/抽出/更新/删除,还有数据库、表的生成/删除/修改等基本数据库操作的语言。SQL语言是一门非常简洁易懂的语言,很容易从字面上就可以基本理解操作的意思。这里不可能详细介绍SQL语言,可以参照相关书籍或网络资料。

结果集

在此还需要请大家注意的是,PHP的数据库函数一次只能对一条记录(record)进行操作,操作对象记录被称为当前记录(current record)。

如图3-2所示的MicrosoftAccess等有图形界面的数据库中,箭头所指示就是当前记录的意思。或称游标(pointer)指向的第一条记录。但是PHP脚本中进行数据库操作时,不能用眼睛看到,在编程时头脑中必须有当前记录(游标)的意识,刚开始可能不习惯,有几次经验就会成为很自然的东西了。

alt

图3-2 有图形界面的数据库

在本节实例中,由Select语句抽取出的结果集中,游标(pointer)指向第一条记录前,如果用fetch方法取得的结果为FALSE,那就说明结果集为空。

另外,如果想从第一条到最后一条取得结果集,可用while循环语句,直至fetch方法返回FALSE。具体的应用后面的章节中会有实际的例子。


知识专栏:性能调试的小技巧(三)——设置索引(index)

索引就是以数据库表里的特定列作为关键字来索引表里的全部数据,提高检索的效率。例如对于商品管理表来说,以商品号码来检索商品的情况很多,如果事先做成以商品号码为关键字的索引,就能大大提高检索的反应速度。

尽管索引非常方便,但是,并不提倡无限制地做成表的索引,那些不常用的索引存在于数据库中,并不是件好事,反而有降低数据库性能的风险。下面罗列了设置索引时需要遵循的标准:

● 频繁进行检索的表。

● 表中的记录非常多。

● 以此列为条件,能检索出表10%以下的数据。

● 表的主键或外键。

当然上面的所谓标准并不是一概而论。进行实际的应用程序开发时,根据实际的使用环境、数据量、访问的情况来建立后,并有必要进行必要的调试。


相关教程

共有条评论 网友评论

验证码: 看不清楚?