1、项目八 数据库版计数器PHP动态网站开发项目教程制作数据库版计数器并在其中显示包含网站访问量的欢迎信息,如图8.1所示。(源代码: chapter8example.php)图8.1 网站计数器3相关知识项目实现内容导航认识数据库PHP数据库操作认识数据库在开始操作数据库之前,先简单认识关系数据,并了解如何在NetBeans中操作MySQL数据库。1认识关系数据库目前常用数据库基本上都是关系数据库如MySQL、Microsoft SQL Server、Microsoft Access、Microsoft Visual FoxPro、Oracle、Sybase等,下面对关系数据库的数据模型、基本概
2、念进行介绍。(1)数据模型数据模型指数据库的结构,有4种常见的数据模型:01OPTION02OPTION03OPTION04OPTION 层次模型 网状模型 关系模型 面向对象模型1认识关系数据库(2)关系数据库基本概念下面对关系数据库的基本概念分别进行介绍。l关系:和数据之间的联系称为关系。l表:关系数据库使用二维表来表示和存储关系。表中的行称为记录,列称为字段。一个数据库可以包含多个表。l记录与字段:表中的一行称为一个记录。表中的列为记录中的数据项,称为字段。字段也称为属性。每个记录可以包含多个字段。不同记录包含相同的字段。例如,学生成绩表中的每个记录包含姓名、学号、英语、物理和化学等字段
3、。关系数据库不允许在一个表中出现重复的记录。l关键字:可以唯一标识一个记录的字段或字段组合称为关键字。一个表可有多个字段或字段组合标识记录。其中用于标识记录的关键字称为主关键字,一个表只允许有一个主关键字。例如,学生成绩表中的学号可以唯一标识一个学生,学号字段可作为主关键字。l外部关键字:如果一个表中的字段或字段组合作为其他表的主关键字,这样的字段或字段组合称为外部关键字。1认识关系数据库(3)关系数据库基本特点关系数据库具有下列5项特点,下面分别进行介绍。关系数据库表是二维表,表中的字段必须是一个整体,不允许出现表中表。在同一个表中不允许出现重复的记录。在同一个记录中不允许出现重复的字段。表
4、中记录先后顺序不影响数据的性质,可以交换记录顺序。记录中字段的顺序不影响数据,可以交换字段的顺序。2在NetBeans中操作MySQL数据库在NetBeans中可直接操作MySQL数据库,主要操作分别如下。要在NetBeans中操作MySQL数据库,首先应注册MySQL服务器,其具体操作如下。 选择“窗口/服务”命令,打开服务窗口。 在服务窗口的“数据库”选项上单击鼠标右键,在弹出的快捷菜单中选择“注册MySQL服务器”命令,打开“MySQL服务器属性”对话框,如图所示。(1)注册MySQL服务器2在NetBeans中操作MySQL数据库(1)注册MySQL服务器 NetBeans可自动检测到
5、已安装的MySQL服务器。通常只需要输入管理员root的口令即可。也可选中 复选框,以后再次访问NetBeans中MySQL服务器即可无需输入口令。 “MySQL服务器属性”设置窗口中的基本属性只用于访问服务器数据库。还可在“管理属性”选项卡中设置管理属性,这样可在NetBeans中启动和停止MySQL服务器以及打开服务器管理工具。如右图所示。管理属性包括MySQL服务器管理工具、启动命令和停止命令。也可单击 按钮在打开的对话框选择路径。2在NetBeans中操作MySQL数据库(1)注册MySQL服务器 最后单击 按钮关闭对话框。在NetBeans的服务窗口中展开“数据库”可看到已注册的My
6、SQL服务器。下图显示了MySQL服务器节点中包含的各个数据库和MySQL服务器右键快捷菜单,在其上单击鼠标右键,在弹出的快捷菜单中可对其进行创建、停止、断开连接等操作。2在NetBeans中操作MySQL数据库下面对MySQL服务器右键快捷菜单各个命令含义分别进行介绍。 创建数据库:创建新的数据库。 启动:启动MySQL服务器。 停止:停止MySQL服务器。 连接:连接到MySQL服务器。连接到MySQL服务器后,才能在NetBeans服务器窗口中查看服务器中包含的数据库。 断开连接:断开MySQL服务器连接。 删除:在NetBeans中删除MySQL服务器注册信息。 刷新:刷新连接,显示最
7、新数据库列表。 运行管理工具:运行在服务器属性对话框中设置的管理工具。 属性:打开MySQL服务器属性对话框,修改注册属性。2在NetBeans中操作MySQL数据库(2)创建MySQL数据库用鼠标右键单击MySQL服务器服务器连接,在弹出的快捷菜单中选择“创建数据库”命令,打开“创建MySQL数据库”对话框,如右图所示。在“创建MySQL数据库”对话框的“新建数据库名称”文本框中输入新数据库名称,如phptest,单击 按钮关闭对话框。NetBeans将数据库创建命令提交给MySQL服务器。成功创建数据库后,NetBeans可自动连接到数据库,并在服务器窗口中显示该连接,如右下图所示。该图上
8、半部分显示了MySQL服务器中的数据库列表,新建的phptest数据也出现在其中;下半部分显示了展开的phptest数据库连接。数据库中的表、视图和过程等对象按文件夹分类显示。2在NetBeans中操作MySQL数据库(3)连接到数据库在MySQL服务器中的数据库列表中选择要连接的数据库,单击鼠标右键,在弹出的快捷菜单中选择“连接”命令,即可连接到数据库。连接到MySQL数据库后,在NetBeans服务器窗口中展开连接,显示数据库中各个文件夹。在“表”文件夹上单击鼠标右键,在弹出的快捷菜单中选择“创建表”命令,打开“创建表”对话框,如下图所示。(4)创建数据库表2在NetBeans中操作MyS
9、QL数据库(4)创建数据库表首先在对话框最上方的“表名”文本框中输入新建表的名称,如user。然后单击右侧的 按钮,打开“添加列”对话框,如图所示。在“添加列”对话框中可设置新建列的名称、类型、大小、比例、默认值、约束等各种属性。设置好各种属性后,单击 按钮将列添加到创建表对话框中。添加完需要的列后,单击 按钮关闭创建表对话框,确认创建表。成功创建表后,新建表会出现在服务器窗口数据库连接的“表”文件夹中。2在NetBeans中操作MySQL数据库(5)查看表数据在服务器窗口数据库连接的“表”文件夹中,选择需要查看的表,并在其上单击鼠标右键,在弹出的快捷菜单中选择“查看数据”命令,打开SQL命令
10、编辑窗口和数据网格,如右图所示。在SQL命令编辑窗口中显示了检索数据的select命令,可修改命令显示不同的数据。在右侧中部的数据网格中显示了表中已有的数据。双击记录字段可进入字段编辑状态,修改字段数据。若要删除记录,可选择需要删除的记录,然后单击数据网格工具栏中的 按钮。若要添加记录,可单击数据网格工具栏中的 按钮,打开“插入记录”对话框添加新记录。15相关知识项目实现内容导航认识数据库PHP数据库操作PHP数据库操作PHP 5.1可使用轻量级的统一接口PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库。而使用PDO只需要指定不同的DSN(数据源名称)即可访问不同
11、的数据库。在Windows中要使用PHP访问MySQL数据库,首先需要在php.ini文件中启用设置,下面对这些设置分别进行介绍。extension_dir = D:php5ext:设置PHP扩展函数库路径PDO及MySQL数据库等扩展函数库默认在PHP安装目录下的.ext目录中。要使用扩展函数库,首先应正确设置扩展函数库路径。extension=php_pdo.dll:启用PDO扩展库。extension=php_pdo_mysql.dll:启用MySQL扩展库。1连接服务器创建PDO对象即建立与MySQL服务器的连接。例如:trycatch用于捕捉代码中的错误。本例中如果new PDO()
12、在PDO对象时出错,则在catch部分可输出错误信息。2创建、删除数据库创建数据库SQL命令基本格式为数据库名称应遵守下列命名原则: 名称可包含任意字母、阿拉伯数字、“”和“$”符号,不能单独使用数字。 名称最长64个字符,数据库别名最多256个字符。 在Windows系统中,数据库名称和表名不区分大小写。 不能使用MySQL关键字作为数据库名、表名。 不能与其他数据库重名,否则会出错。删除数据库SQL命令基本格式为2创建、删除数据库下面的代码使用PDO连接到MySQL服务器,并创建一个数据库,然后将其删除。代码中调用了PDO对象的exec()方法执行SQL命令,返回一个整数值。若连接到特定数
13、据库,则可执行insert(添加记录)、delete(删除记录)和update(修改记录)等命令。3创建数据库表创建数据库表使用“create table”命令,其基本格式为表名之后的括号中指定表包含的一个或多个列,列属性基本格式为命令不区分大小写,通常习惯用大写表示MySQL命令关键字,小写表示自定义值,括号表示可选选项。其中,TEMPORARY表示创建临时表,临时表在数据库关闭连接时自动删除。IF NOT EXISTS表示若存在同名的表,则不执行创建表命令,避免出错。默认情况下,create table命令在当前数据库中创建表。在创建PDO对象时,DSN字符串中dbname参数指定当前数据
14、库名称。若未指定当前数据库,则应在表名前加数据库名称进行限定。如phptest.newtable,表示属于phptest数据库的newtablle表。3创建数据库表该sql命令表示在当前数据库中创建名为test的表,test有两个列id和data。id列为INT类型,自动增量,作为表主键。data列为VARCHAR类型,长度为8。其中,NOT NULL表示不允许取空值,NULL表示允许取空值。DEFAULT设置默认值。AUTO_INCREMENT表示创建自动增量列,整数或浮点数列可设置为自动增量。自动增量列不需要设置值,其值自动从0开始,每增加一个列,列值自动加1。UNIQUE KEY表示创建
15、唯一键,PRIMARY KEY表示创建主键,主键用于识别记录,应为每个表定义一个主键列。例如:提示:本书重点讲解PHP,MySQL各种命令的完整语法可参考官方最新在线文档:http:/dev. mysql. com/doc/refman/5.7/en/sql-syntax.html,或参考MySQL中文站点:http:/doc. INTO 表名(列名1,列名2,) VALUES(value1,value2,)添加记录时,指定的列名与VALUES中的值一一对应。列名可省略,省略列名时,VALUES部分指定的值按照表中列的顺序一一对应。例如:下面两条命令相同。5删除记录删除满足条件的记录。如果未用
16、WHERE关键字指明条件,则删除表中的全部记录。下面的命令删除test表中data列包含“ab”的记录。删除记录使用delete命令,其基本格式为6修改记录修改满足条件的列的值。如果未指定条件,则修改全部记录。下面的命令将test表中data列以“ab”开头的值修改为“abcd”。修改记录使用update命令,其基本格式为7记录查询其中,字段列表可用“*”查询全部记录,或者用逗号分隔要在查询结果中包含的列名。FROM表示指定数据来源表,多个表用逗号分隔。WHERE指定筛选条件,满足条件的记录包含在查询结果中。ORDER BY指定查询结果排序列,ASC表示升序(默认值),DESC表示降序。例如:
17、记录查询使用select命令,其基本格式为PDO对象可使用query()方法执行查询。或者用PDO对象的prepare()方法准备一个PDOStatement对象,然后用PDOStatement对象的execute()方法执行查询。7记录查询query()方法参数为一个查询字符串,查询执行成功返回包含查询结果集的PDOStatement对象,若失败则返回FALSE。提示:若查询结果集中记录没有读取完,试图再次执行query()方法将会出错。此时,可在再次执行query()方法前,调用PDOStatement的closeCursor()方法释放PDOStatement对象关联的数据库资源。(1)
18、使用query()方法执行查询query()方法基本格式为7记录查询query()方法参数为一个查询字符串,查询执行成功返回包含查询结果集的PDOStatement对象,若失败则返回FALSE。(2)使用预处理查询如果一个查询需要多次执行,则可使用PDO对象的prepare()方法预先提交查询,服务器准备一个预处理查询语句。然后可多次调用PDOStatement对象的execute()方法执行查询。prepare()方法基本格式为准备好语句后,调用execute()方法执行查询。例如:7记录查询在execute()方法中,用数组指明参数,数组元素与参数按顺序一一对应。(3)使用带参数的预处理查
19、询在预处理查询过程中可对其参数进行设置,分别是使用问号参数、使用命名参数和将参数绑定到变量(:参数名,以冒号开始的参数名)3种方式设置参数。 使用问号参数例如: 使用命名参数例如:在execute()方法中,用查询参数名称作为参数数组的键。因为是命名参数,所以参数数组各个元素的先后顺序可与查询中参数的先后顺序不同。7记录查询 将参数绑定到变量可以将参数绑定到变量,变量的值作为参数值。例如:将参数绑定到变量后,改变变量的值即可获得不同的查询结果。如果参数不是命名参数,在绑定时,可使用1开始的整数表示对应参数。例如:8处理查询结果集(1)使用fetch()方法读取查询结果不管用query()方法还
20、是execute()方法执行查询操作,查询结果都保存在PDOStatement对象中。可用PDOStatement对象的fetch()、fetchAll()或fetchColumn()方法从查询结果中集中读取数据。fetch()方法返回一个包含查询结果集下一条记录的数据,已无记录时返回FALSE。其基本格式为8处理查询结果集不管用query()方法还是execute()方法执行查询操作,查询结果都保存在PDOStatement对象中。可用PDOStatement对象的fetch()、fetchAll()或fetchColumn()方法从查询结果中集中读取数据。例如:PDO:FETCH_NUM:
21、用0开始的整数作为数组元素下标。PDO:FETCH_ASSOC:用列名作为数组元素下标。PDO:FETCH_BOTH:默认值,既有整数下标,也有列名下标。8处理查询结果集(2)使用fetchAll()方法读取查询结果fetchAll()方法指返回查询结果集中剩余的全部记录到一个二维数组,无记录时返回FALSE。其基本格式为参数$fetch_style与fetch()方法一致。(3)fetchColumn()方法读取查询结果fetchColumn()方法返回查询结果集下一条记录中指定列的值,已无记录时返回FALSE。其基本格式为参数$n表示列序号的整数,列序号默认从0开始。参数$n省略时,取第1
22、列。使用fetchColumn()方法时,依次只能读记录中的1列的值,不能读取其他列值。例如:8处理查询结果集例8.1综合使用PDO对象,实现一个可以查看、修改和删除记录的网页。(源代码:chapter8 test1.php、edit.php、save.php、delete.php)test1.php显示记录查看页面,如图8.10所示。页面中以表格形式显示记录,单击“修改”超链接可切换到记录修改页面,单击“删除”超链接可删除该行记录。8处理查询结果集test1.php代码如下。8处理查询结果集8处理查询结果集edit.php显示记录修改页面,如图所示。在页面中输入新的列值后,单击 按钮将表单数
23、据提交给执行保存操作的save.php。8处理查询结果集edit.php码如下:8处理查询结果集save.php执行保存操作,用修改表单提交的数据更新数据库表中的对应记录,其代码如下。8处理查询结果集delete.php从数据库表删除指定的记录,其代码如下。40相关知识项目实现内容导航认识数据库PHP数据库操作项目实现为实现图8.1所示目标,可做如下分析。制作数据库版的网站计数器首先在数据库中创建一个表保存网站访问量,该表只需要一个整数类型的列即可。在网页中首先从数据库获取现有访问量,在网页中显示访问欢迎信息,最后更新数据库中的访问量。为避免因刷新页面造成的重复计数,可在$_SESSION中设置一个变量保存访问标识。实例代码:项目实现43Thank you!