第 五 章 SQL 编程 数据库接口技术
description
Transcript of 第 五 章 SQL 编程 数据库接口技术
2
嵌入式 SQL ODBC JDBC PHP
提纲
嵌入式 SQL
为什么使用嵌入式 SQL ?嵌入式 SQL 执行过程需要解决的几个问题
为什么使用嵌入式 SQL ?
有些操作对于交互式 SQL 是不可能的任务 SQL 的表达能力相比高级语言有一定的限制,
有些数据访问要求单纯使用 SQL 无法完成。一方面, SQL 在逐渐增强自己的表达能力(参见习题 4.10 ),另一方面,太多的扩展会导致优化能力及执行效率的降低
非声明性动作 实际的应用系统是非常复杂的,数据库访问只
是其中一个部件。有些动作如与用户交互、图形化显示数据等只能用高级语言实现
嵌入式 SQL 执行过程
主语言 + 嵌入 SQL
预处理
主语言 + 函数调用
主语言编译器
主语言执行程序
需要解决的几个问题
区分 SQL 语句与 C 语言语句嵌入 SQL 语句与 C 语言之间的数据传递SQL 与主语言之间操作方式的协调SQL 语句执行信息反馈
区分 SQL 语句与 C 语言语句
嵌入的 SQL 语句以 EXEC SQL 开始,以分号 (;) 或 END_EXEX 结束
EXEC SQL delete from PROF
where DNO = 10 ;
嵌入 SQL 与 C 语言之间的数据传递
宿主变量 C 变量,既可以用在 C 语句中,也可用在 SQL 语
句中,用来在两者之间传递数据宿主变量的声明
声明为通常的 C 变量,并将其放在下列标识语句之间
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
嵌入 SQL 与 C 语言之间的数据传递
EXEC SQL BEGIN DECLARE SECTION
int prof_no;
char prof_name[30];
int salary;
EXEC SQL END DECLARE SECTION
嵌入 SQL 与 C 语言之间的数据传递
注:宿主变量出现于 SQL 语句中时,前面加( : )以区别列名 宿主变量可出现的地方: SQL 的数据操纵语句中可出现常数的任何地方, select , fetch 等语句的 into 字句中示例: EXEC SQL
select PNAME , SAL
into :prof_name , :salary
from PROF
where PNO = :prof_no ;
嵌入 SQL 与 C 语言之间的数据传递指示变量
C 变量,用来指示返回给宿主变量的值是否为 null 值,以及返回给宿主变量的字符串是否发生了截断
指示变量应用场合 如果一个宿主变量所对应的数据库字段允许空值,或字符
串类型的宿主变量的长度可能小于所对应的数据库字段的长度,则需要一个指示变量来指明数据库访问的返回状态
指示变量的返回值 = 0 :取到主变量的值不空,没有发生截断 = 1 :取到主变量的值为空值 > 0 :取到主变量的值发生了截断,指示变量的值是截断
前的字符串的实际长度
嵌入 SQL 与 C 语言之间的数据传递 指示变量的用法
• 声明与宿主变量的声明方式一样,在数据操纵语句中,在宿主变量和指示变量之间加 ( : ) 或关键字 indicator
EXEC SQL BEGIN DECLARE SECTIONint prof_no;char prof_name[30];int salary;short name_id;short sal_id;
EXEC SQL END DECLARE SECTION
EXEC SQL select PNAME , SALinto :prof_name : name_id , :salary:
sal_idfrom PROFwhere PNO = :prof_no ;
SQL 与主语言之间操作方式的协调
执行方式的差别 SQL :一次一集合 C 语言:一次一记录
游标 在查询结果的记录集合中移动的指针 若一个 SQL 语句返回单个元组,则不用游标 若一个 SQL 语句返回多个元组,则使用游标
SQL 语句执行信息反馈
良好的应用程序必须提供对错误的处理 , 应用程序需要知道 SQL 语句是否正确执行了,发生错误时的错误代码,执行时遇到特殊情况时的警告信息
SQL 通讯域 SQLCA 是一结构 , 每一嵌入 SQL 语句的执行情况在其执行完成后写入 SQLCA 结构中的各变量中 , 根据 SQLCA 中的内容可以获得每一嵌入 SQL 语句执行后的信息 , 应用程序就可以做相应的处理
为了说明 (USERCA), 必须在应用程序中包括 :EXEC SQL INCLUDE SQLCA;
Company
LOGO
数据库接口技术—— ODBC
www.themegallery.com
数据库接口技术的分类
微软最新的数据访问技术 ,用以实现访问关系或非关系数据库中的数据。
ADO
Microsoft推出的最早的整合异质数据库的数据库接口,现在已成为一种事实上的标准。
ODBC
是执行 SQL语句的 Java API ,由一组用 Java 语言编写的类与接口组成。
JDBC
www.themegallery.com
ODBC
ODBC :Open DataBase Connectivity开放式数据库联接Microsoft引进这种技术的一个主要
目的是,以非语言专用的方式,提供给程序员一种访问数据库内容的简单方法。
www.themegallery.com
ODBC 的产生背景
关系型数据库产生后很快就成为数据库系统的主流产品,由于每个 DBMS厂商都有自己的一套标准,人们很早就产生了标准化的想法,于是产生了 SQL ,由于其语法规范逐渐为人所接受,成为RDBMS上的主导语言。最初,各数据库厂商为了解决互连的问题,往往提供嵌入式 SQL API ,用户在客户机端要操作系统中的 RDBMS 时,往往要在程序中嵌入 SQL 语句进行预编译。由于不同厂商在数据格式、数据操作、具体实现甚至语法方面都具有不同程度的差异,所以彼此不能兼容。
www.themegallery.com
ODBC 的产生
1991年 11月,微软宣布了 ODBC ,次年推出可用版本。
1992年 2月,推出了 ODBC SDK 2.0版。ODBC基于 SAG 的 SQL CAE草案所规定
的语法,共分为Core 、 Level 1 、 Level 2三种定义,分别规范了 22 、 16 、 13共 51条命令,其中 29条命令甚至超越了 SAG CLI 中原有的定义,功能强大而灵活。它还包括标准的错误代码集、标准的连接和登录DBMS 方法、标准的数据类型表示等。
www.themegallery.com
ODBC 的发展
由于当时 ODBC思想上的先进性,且没有同类的标准或产品与之竞争,它一枝独秀,推出后仅仅两三年就受到了众多厂家与用户的青睐,成为一种广为接受的标准。目前,已经有 130 多家独立厂商宣布了对 ODBC 的支持,常见的 DBMS都提供了 ODBC 的驱动接口,这些厂商包括Oracle 、 Sybase 、 Informix 、 Ingres 、 IBM(DB/2) 、 DEC(RDB) 、 HP(ALLBASE/SQL) 、 Gupta 、 Borland(Paradox) 等。目前,ODBC已经成为客户机 /服务器系统中的一个重要支持技术。
www.themegallery.com
ODBC 的基本思想
为用户提供简单、标准、透明的数据库连接的公共编程接口 。
ODBC基本思想
开发厂商根据ODBC 的标准去实现底层的驱动程序 。
www.themegallery.com
ODBC 与传统方式的比较
传统方式 ODBC
www.themegallery.com
ODBC 的特点
1
使用户程序有很高的互操作性,相同的目标代码适用于不同的 DBMS
2
由于 ODBC 的开放性,它为程序集成提供了便利,为客户机 /服务器结构提供了技术支持
3
由于应用与底层网络环境和 DBMS分开,简化了开发维护上的困难
www.themegallery.com
ODBC 的体系结构和实现
ODBC 是依靠分层结构来实现的
具体分为四层: 应用程序 驱动程序管理器 驱动程序 数据源
www.themegallery.com
体系结构
应用程序
驱动程序管理器
驱动程序
数据源
Application
Drive manager
Drive
Data sourse
www.themegallery.com
应用程序层
使用 ODBC 接口的应用程序可执行以下任务: 请求与数据源的连接和会话 (SQLConnect) 向数据源发送 SQL 请求 (SQLExecDirct 或
SQLExecute) 对 SQL 请求的结果定义存储区和数据格式 请求结果 处理错误 如果需要,把结果返回给用户 对事务进行控制,请求执行或回退操作
(SQLTransact) 终止对数据源的连接 (SQLDisconnect) 。
www.themegallery.com
驱动程序管理程序功能
为 ODBC 提供提供参数和次数验证
为每一个驱动程序提供 ODBC 函数入口地点
处理几个 ODBC 的初始化调用
www.themegallery.com
驱动程序功能
建立与数据源的连接向数据源提交请求在应用程序需求时,转换数据格式返回结果给应用程序将运行错误格式化为标准代码返回在需要时说明和处理光标。
www.themegallery.com
数据源的组成
数据源 网络环境
DBMS
数据
操作系统
www.themegallery.com
ODBC 的接口函数
I. 连接数据源( Connecting to a Data Source ) SQLAllocEnv SQLAllocConnect SQLConnect SQLPriverConnect SQLBrowseConnect
II. 取得驱动程序及数据源的相关讯息 SQLDataSource SQLGetInfo SQLGetFunctions SQLGetTypeInfo.
III. 设定及取得驱动程序的选项 SQLSetConnectOption SQLGetConnectOption SQLSetStmtOption SQLGetStmtOption.
www.themegallery.com
ODBC 的接口函数
IV. 准备 SOL 指令之需求 SQLAllocStmt SQLPrepare SQLSetParam SQLParamOptions SQLGetCursorName SQLSetCursorName SQLSetScrollOptions.
V. 传送及执行需求 SQLExecute SQLExecDirect SQLNativeSql SQLDescribeParanl SQLNumParams SQLParamData SQLPutData.
www.themegallery.com
ODBC 的接口函数
VI. 取得执行结果及有关结果的讯息 SQLRowCount SQLNumResultCols SQLDescribeCol SQLColAttributes SQLBindCol SQLFetch SQLExtendedFetch SQLGetData SQLSetDos SQLMoreResults SQLError
VII. 取得有关数据源系统表( System tables or Catalog )的讯息 SQLColumnPrivileges SQLColumns SQLForeignkeys SQLPrimaryKeys SQLProcedureColumns SQLProcedures SQLSpecialColumns SQLStatistics SQLTablePrivileges SQLTables
www.themegallery.com
ODBC 的接口函数
VIII. 结束 SQL 指令需求 SQLFreeStmt SQLCancel SQLTransact
IX. 结束与数据源的连接 SQLDisconnect SQLFreeConnect SQLFreeEnv
www.themegallery.com
ODBC 程序流程
为 ODBC 分配环境句柄分配一个连接句柄连接到数据库用 SQL命令分配一个语
句句柄传送该命令关闭连接解除连接和环境句柄
www.themegallery.com
ODBC 实例
应用程序要访问一个数据库,首先必须用 ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及 ODBC驱动程序等信息,建立起 ODBC 与具体数据库的联系。这样,只要应用程序将数据源名提供给 ODBC , ODBC就能建立起与相应数据库的连接。
在 ODBC 中, ODBC API 不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对 ODBC API 的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
www.themegallery.com
ODBC 实例(续 1 )
实现步骤: 1. 设置ODBC 数据源 步骤是控制面板->管理工具-> 数据源
( ODBC )。这里将加入一个本用户的数据源local ,连接到本地的 SQL Server 2000服务器上。
选择添加数据源,选择 SQL Server 的驱动。完成相关的设置之后就可以看到本地的 DSN中多了一个名为 local 的数据源。如图所示:
www.themegallery.com
ODBC 实例(续 2 )
设置完之后就可以在程序中使用 ODBC 的 API 来连接到数据库了。
www.themegallery.com
ODBC 实例(续 3 )
2. 连接到 ODBC 数据源 下面通过一个简单的基于控制台的 VC 程序来演示如何连接到 ODBC 数据源。
要连接到 ODBC 数据源,需要先分配环境句柄,设置环境句柄,分配连接句柄,然后用这些句柄连接到ODBC建立连接。这部分的代码如下: • SQLHENV hEnv; • SQLHDBC hConnect; • SQLRETURN r; • // 分配环境句柄 • r = SQLAllocHandle ( SQL_HANDLE_ENV,
SQL_NULL_HANDLE, &hEnv); • if ( r != SQL_SUCCESS ) { • cout << "SQLAllocHandle error!" << endl ; • exit(1); • }
www.themegallery.com
ODBC 实例(续 4 )
• // 设置环境句柄 • r = SQLSetEnvAttr ( hEnv, SQL_ATTR_ODBC_VERSION, (void • *)SQL_OV_ODBC3, 0 ); • if ( r != SQL_SUCCESS ) { • cout << "SQLSetEnvAttr error!" << endl ; • exit(1); • } • // 分配连接句柄 • r = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hConnect); • if ( r != SQL_SUCCESS ) { • cout << "SQLAllocHandle error!" << endl ; • exit(1); • } • // 连接 ODBC 数据库 • r = SQLConnect ( hConnect, (SQLCHAR*) "local", SQL_NTS, • (SQLCHAR*) "zhdf", SQL_NTS, • (SQLCHAR*) "123456", SQL_NTS); • if ( r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO ) { • cout << "SQLConnect error!" << endl; • exit (1); • }
www.themegallery.com
ODBC 实例(续 5 )
3 . 查询实现 在建立 ODBC 的时候我选择的默认数据库是 pubs 。在这里用代码查询一下 authors : char SQLString[100] ; SQLCHAR RetName[20]; SQLLEN cbName; // 分配语句句柄 r = SQLAllocHandle ( SQL_HANDLE_STMT, hConnect,
&hStmt); if ( r != SQL_SUCCESS ) { cout << "SQLAllocHandle error!" << endl ; exit(1); } // 执行 SQL 查询 strcpy ( SQLString, "select au_lname from authors"); r = SQLExecDirect( hStmt, (SQLCHAR *)SQLString,
strlen(SQLString) ); if ( r != SQL_SUCCESS ) { cout << "SQLExecDirect error!" << endl ; exit(1); }
www.themegallery.com
ODBC 实例(续 6 )
// 绑定数据并输出 r = SQLBindCol ( hStmt, 1, SQL_C_CHAR, (SQLPOINTER)
RetName, 20, &cbName); while (1) { r = SQLFetch ( hStmt ); if ( r == SQL_ERROR || r == SQL_SUCCESS_WITH_INFO)
{ cout << "SQLFetch error!" << endl ; exit(1); } if ( r == SQL_SUCCESS || r ==
SQL_SUCCESS_WITH_INFO){ cout << RetName << endl; } else break; }
www.themegallery.com
ODBC 实例(续 7 )
执行结果
Company
LOGO
数据库接口技术—— JDBC
www.themegallery.com
JDBC简介
JDBC概述JDBC技术特点JDBC编程框架实例介绍
www.themegallery.com
JDBC 概述 JDBC 的诞生
SUN公司开发的一个以 Java 语言为接口的数据库应用程序开发的接口。
在 JDK1. x版本中, JDBC 只是一个可选部件,到了 JDK1.1公布时, SQL 类包(也就是 JDBCAPI )就成 Java 语言的标准部件。
在 JDBC2.0 中, JDBC 中的一系列可选的扩展对连接过程进行了改进。
JDBC重要性 JDBC 扩展了 Java 的能力。 随着越来越多的程序开发人员使用 Java 语言,对 Java 访问数
据库易操作性的需求越来越强烈。
www.themegallery.com
JDBC 概述
JDBC 和 ODBC 及其他 API 的比较 正如 Java被设计成与硬件平台无关那样, JDBC
也被设计成向开发者提供某种程度的数据库无关性。 ODBC 并不适合在 Java 中直接使用。 ODBC 是
一个 C 语言实现的 API ,从 Java 程序调用本地的C 程序会带来一系列类似安全性、完整性、健壮性的缺点。
完全精确地实现从 C 代码 ODBC 到 JavaAPI 写的ODBC 的翻译也并不令人满意。
JDBC这样的 JavaAPI 对于纯 Java 方案来说是必须的。
www.themegallery.com
JDBC 技术特点 JDBC 是一种用于执行 SQL 语句的 Java API ,它由一
组用 Java 编程语言编写的类和接口组成,可以使用它来访问数据库和执行 SQL 语句。
JDBC 为工具 / 数据库开发人员提供了一个标准的 API ,使他们能够用纯 Java API 来编写数据库应用程序。
JDBC 对 Java 程序员而言是 API ,对实现与数据库连接的服务提供商而言是接口模型。作为 API , JDBC 为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。
www.themegallery.com
JDBC 技术特点
JDBC 的结构
www.themegallery.com
JDBC 技术特点
JDBC规范提供了数据库厂商必须实现的接口集合。目前有四种不同类型的实现。
www.themegallery.com
JDBC 编程框架
JDBC 能完成下列三件事: 同一个数据库建立连接; 向数据库发送 SQL 语句; 处理数据库返回的结果。
JDBC 的接口 一个是面向程序开发人员的 JDBC API 一个是底层的 JDBC Driver API 。
www.themegallery.com
JDBC 编程框架JDBC API
JDBC API 被描述成为一组抽象的 Java接口,可以对某个数据库打开连接,执行 SQL 语句并且处理结果。最重要的接口是:
java.sql.DriverManager 处理驱动的调入并且对产生新的数据库连接提供支持。
java.sql.Connection 代表对特定数据库的连接。
java.sql.Statement 代表一个特定的容器,来对一个特定的数据库执行 SQL 语句。
www.themegallery.com
JDBC 编程框架 java.sql.ResultSet 控制对一个特定语句
的行数据的存取。
其中 java.sql.Statement又有两个子类型:
java.sql.PreparedStatement 用于执行预编译的 SQL 语句。
java.sql.CallableStatement 用于执行对一个数据库内嵌过程的调用。
www.themegallery.com
JDBC 编程框架
JDBC Driver API java.sql.Driver 驱动程序,会将自身载入到
DriverManager 中去,并处理相应的请求并返回相应的数据库连接。
每个 database driver 必须提供这样一个类,以使得系统可以由 java.sql.DriverManager 来管理。
所有的 driver 必须提供对 java.sql.Connection, java.sql.Statement, java.sql.PreparedStatement, and java.sql.ResultSet 的实现。
如果目标 DBMS 提供有 OUT 参数的内嵌过程,那么还必须提供 java.sql.CallableStatement 接口。
www.themegallery.com
JDBC 编程框架
加载驱动程序 建立连接 用于向数据库发送 SQL 语句 执行查询 处理得到的查询结果 关闭所有打开的资源
www.themegallery.com
实例介绍
//JDBCexample.java
import java.sql.*;
class JDBC{public static void JDBCexample(String dbid, String userid, String passwd){
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(dbid, userid, passwd);
www.themegallery.com
Statement stmt = con.createStatement();
try{stmt.executeUpdate(“insert into S
values(‘s030’, ‘刘’ , ‘铁岭 ', 1)");
}catch(SQLException sqle){System.out.println("Could not
insert tuple. " + sqle);}ResultSet rs =
stmt.executeQuery("Select SNO, SNAME, CITY from S");
www.themegallery.com
while( rs.next() ){System.out.println(" SNO: "
+rs.getString("SNO")+ " SNAME: " + rs.getString("SNAME")+ " CITY " + rs.getString("CITY") );
}con.close();
}catch(SQLException sqle){System.out.println("SQLException: " +
sqle);}catch(Exception e)
{System.out.println("Exception: " + e);}}
};
www.themegallery.com
public class JDBCexample{
public static void main(String args[]){JDBC example = new JDBC();example.JDBCexample("jdbc:odbc:db1","",
"");}
};
Company
LOGO
www.themegallery.com
为什么数据库要与 Web 接口
Web浏览器已经变成用户访问数据库的 defacto标准 能够使大量用户从任何地方访问数据库 避免下载 /安装特定软件,同时提供良好的图形化用户界面
例如 Banks, Airline/Car reservations, University course registration/grading, …
Web 和数据库的连接打开创新服务的大门 新的服务和产品快速推向市场,对竞争做出及时反应 基于 Web 的支持服务,增加客户满意度 世界范围的通用访问,快速有效的信息维度
www.themegallery.com
为什么数据库要与 Web 接口
动态文档给 Web赋予生命 静态文档的缺陷
• 不能为用户提供个性化文档• 文档更新有问题,尤其是许多文档共享数据时
解决途径:从数据库中动态产生文档• 可以基于存储在数据库中的用户信息来定制文档
– 例如定制广告、天气、新闻等• 显示的信息是最新的,不像静态页面
– 例如股票信息动态网页技术
客户端技术: Java Applet ,客户端脚本 服务器端技术: Java Servlet ,服务器端脚本
www.themegallery.com
HTML
HTML 提供格式、显示超文本链接HTML 也提供输入特征
选择项: Pop-up menus, radio buttons, check lists
值输入:文本框 输入被送回服务器处理
www.themegallery.com
HTML 示例
<html> <body><table border cols = 3>
<tr> <td> A-101 </td> <td> Downtown </td> <td> 500 </td> </tr>…
</table><center> The <i>account</i> relation </center><form action=“BankQuery” method=get>
Select account/loan and enter number <br><select name=“type”>
<option value=“account” selected> Account<option value=“loan”> Loan
</select><input type=text size=5 name=“number”><input type=submit value=“submit”>
</form></body> </html>
www.themegallery.com
HTML 显示
www.themegallery.com
HTTP
HTTP : HyperText Transfer Protocol 浏览器与 Web服务器之间的通讯协议
HTTP 协议是无连接的 当用户登录到计算机或 JDBC/ODBC服务器时,连接一直保持,直到客户端关闭它(保留用户权限和其他信息)
与此不同的,一旦Web服务器对请求做出响应, Web服务器马上关闭与客户端的连接
动机:减少服务器负载• 操作系统对一个机器上打开连接的数目有严格限制
www.themegallery.com
HTTP 会话和 Cookies
信息服务需要会话信息 例如用户权限只在一次会话时授予 解决方案: cookie
Cookie 是包含确认信息的小片文本 在第一次连接时由服务器发送给浏览器 由浏览器将创建的 Cookie 发送给服务器 服务器保留它收到的 Cookie ,并在响应请求
时使用• 例如用户授权信息,用户偏好等
SITESERVERID=743886a420d9cc2ca7b9554b67c43293sohu.com/06428590083188777793003273629307734*
www.themegallery.com
客户端脚本 /Applets
浏览器可以将脚本或程序与文档一起取回,并在客户端以“安全模式”运行它们 Javascript Applets
客户端脚本 / 程序使得文档成为活动的 动画显示 保证用户的输入满足正确性检查 允许与用户进行更便捷的交互,避免反复与
Server 通讯
www.themegallery.com
Java Applets
Web-ServerHTTP-Request
HTML-File
Web-Server
File-System
Load File
FileLoad Applet...
Java-Class Requests
Java-Classes
Execute Applet...
Java Virtual Machine (JVM)
Server-Process
www.themegallery.com
三层 Web 体系结构
www.themegallery.com
请求 - 服务流程
1. Web浏览器向Web服务器请求一个网页;2. Web服务器用 CGI 将请求传递给应用服务器;
3. 应用服务器用 ODBC连接数据库;4. 应用服务器接受查询结果并创建 HTML网页;5. 应用服务器用 CGI 将网页发送回 Web服务器;
6. Web服务器将网页发送回浏览器;7. HTML输出显示在客户计算机的 Web浏览器上。
www.themegallery.com
Web-ServerHTTP-Request
HTML-File
Web-Server
File-SystemLoad File
FileHTML?
HTML
Execute Program
Program?Output
I/O, Network, DB
通用网关接口: CGI
www.themegallery.com
两层 Web 体系结构
www.themegallery.com
体系结构的简化
三层Web体系结构的弊端 多级服务器之间的交互增加了系统负载 CGI接口对每一个请求都会开始一个新进程
二层Web体系结构 应用服务器作为 Web服务器本身的一部分运
行两种实现方式
通过 Web服务器装载 Java 程序• Java servlet 定义了服务器和应用程序之间的通信接口。
更简单的方法:使用服务器端脚本语言
www.themegallery.com
服务器端脚本
服务器端脚本简化了数据库与 Web连接的任务 定义嵌入可执行代码 /SQL 查询的 HTML文档 从 HTML文档输入的值可以直接在嵌入代码 /
SQL 查询中使用 当请求该文档时, Web服务器执行嵌入代
码 /SQL 查询,产生真正的 HTML文档很多服务器端脚本语言
JSP,服务器端 Javascript, ColdFusion, PHP, Jscript
VBScript, Perl, Python
www.themegallery.com
服务器端脚本
Web-Server
File-SystemWeb-Server
HTTP-Request
HTML-File
Load File
File
HTML
I/O, Network, DB
Script?Output
Server Extension
HTML?
www.themegallery.com
PHP
File-SystemWeb-Server
HTTP-Request
HTML-File
Load File
PHP-File
HTML
PHP-ScriptOutput
Database APIs,
other APIs SNMP,
IMAP, POP3,
LDAP, ...
PHP
Module
Web-Server
www.themegallery.com
PHP
<HTML> <BODY>
<?PHP $db = mysql_connect("localhost", "dbuser"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db);?>
<TABLE BORDER=1> <TR><TD>NAME</TD><TD>POSITION</TR>
<?PHP while ($myrow = mysql_fetch_row($result)) { printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], $myrow[2], $myrow[3]); } ?>
</TABLE></BODY></HTML>
Company
LOGO
使用 PHP 访问 MySQL 数据库
www.themegallery.com
提纲
PHP介绍MySQL介绍PHP 访问 MySQL 数据库
利用 PHP 数据库函数连接MySQL PHP 通过 ODBC 连接MySQL
两种方法的对比
www.themegallery.com
PHP 介绍
PHP (Personal Home Page) 是一种跨平台的服务器端嵌入式脚本语言。它最初是Rasmus Lerdorf 于 1994年开发的。
在 PHP早期的版本中,提供了访客留言本、访客计数器等简单功能。随后,在第二版中增加了对 mSQL 的支持。自此奠定了PHP 在动态网页开发上的影响力,并迅速在 Internet上流传开来。
www.themegallery.com
PHP 介绍
截至 2006年 8月,在全球范围内,共有超过 2000万动态站点使用着 PHP ,包括Yahoo! 等著名网站,目前有超过半数的Ajax-enabled 和 Web2.0站点选择应用PHP 。
除此之外, PHP 也是企业用来构建服务导向型、创造和混合 web服务融于新一代的综合性商业应用的语言,成为开源商业应用发展的方向。
www.themegallery.com
PHP 介绍
PHP流行有以下几个原因:兼容 C 的语法,容易掌握。运行速度快。非常强的容错,很好的鲁棒性能。丰富的函数和简单的操作。
在函数支持方面, PHP 几乎覆盖了 Web 应用的各个方面,其中最有特色的是数据库函数,使用 PHP 完成一个含有数据库功能的网页非常简单,而 PHP支持的数据库也非常丰富,目前包括: Oracle 、 Sybase 、SQL Server 、 MySQL 、 Informix 等。
PHP 是开源的,在各种平台上都可以自由加入新的函数。
www.themegallery.com
MySQL 介绍
MySQL 是一个快速、健壮和易用,且支持多线程、多用户的 SQL 数据库服务器。
MySQL 是一个客户机 /服务器结构的应用,它由一个服务器守护程序 mysqld 和很多不同的客户程序和库组成。
MySQL 是多平台的,是目前使用最广的开源数据库软件。
www.themegallery.com
MySQL 介绍
MySQL 的主要特点 完全多线程,适于多 CPU 使用。 提供 C , C + + , JAVA (JDBC) ,
Perl , Python , PHP 和 TCL 的 API接口。 多平台,包括 :
Solaris , SunOS , BSDI , SGI AIX ,DEC UNIX , Linux , FreeBSD , SCO OpenServer , NetBSD , OpenBSD , HPUX , Win9x and NT. ( 各台支持的功能不尽相同 ) 。
www.themegallery.com
MySQL 介绍
数据类型多样。 非常灵活和安全的权限系统,密码加密。 为 Win9X 提供 ODBC 接口,可通过 Access
与之相联 . 另有第三方开发商提供多样的ODBC 驱动程序。
可处理大型数据 (超过 5千万个记录 ) 。 通过权威检测,无内存泄露。 多种语言支持。
www.themegallery.com
MySQL 介绍
MySQL 的快速和灵活性足以满足一个网站的信息管理工作。
因此, PHP+MySQL靠其功能强大、价格低廉、跨平台等特性,成为网站架构的绝佳组合。
www.themegallery.com
PHP 访问 MySQL 数据库
PHP 访问 MySQL 数据库的方式主要有两种:
1.利用 PHP 的数据库函数连接。 PHP 对不同类型的数据库一般有不同的访问函
数,使它能够快速读取绝大多数数据库或数据源中的数据,包括DBA 、 dBase 、 Informix 、 SQL Server 、 MySQL 、 Sybase 、 Oracle 、 Postgre SQL 等等。
2. 通过 ODBC 连接
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
PHP函数中,针对 MySQL 数据库,常用函数有 : mysql_connect () :建立与 MySQL 服务器的连接。 mysql_create db () :建立一个新的 MySQL 数据库。 mysql_drop_db () :删除一个指定的 MySQL 数据库。 mysql_select_db () :选择一个 MySQL 数据库。 mysql_query () : 送出 query 字符串以帮助
MySQL 做相关的处理或执行。 mysql_num_rows () :本函数返回表行的数目,一般配合 SELECT 语句进行查询操作。
mysql_close () : 关闭与 MySQL 服务器的连接。
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
用 PHP 程序访问 MySQL 数据库的方法比较简单, 典型的步骤如下 :
(1) 用函数 mysql_connect ( string [server] , string [username] , string [password]) 建立与 MySQL 服务器的连接。 如连接成功,函数返回一个连接标识;否则,返回
FALSE ,表明连接失败。 这里,参数 server 可以写成“ host-name:po rt” 的
形式。如果函数调用中未填写参数 server , 则缺省为server = ’localhost: 3306’ ,缺省用户名为数据库服务器进程的拥有者。
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
(2) 用 mysql_select_db ( string database-name , resource [ link-identifier]) 函数设置与指定数据库连接标识相关的当前活动数据库。 如缺省连接标识,则使用前面已经建立的连接;
如前面没有建立连接,则函数试图建立一个连接后再设置与指定数据库连接相关的当前活动数据库。函数调用成功,返回 TRUE;否则,返回 FALSE 。
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
(3) 准备好符合 SQL 语言标准的语句字符串,即类似于$ sql1=“select * from table w here ….” 程序语句。
(4) 用 mysql_query(string query[ , resou rce link_identifier]) 访问数据库。
(5) 如 (4) 是查询操作,则用mysql_fetch_ array (resource result ,int [result_type])从生成的记录集中取记录。
(6) 用 mysql_close() 关闭数据库。
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
例程:<?php$con=mysql_connect(‘localhost’ ,’root’ ,’ adminpassword’);/*上面 localhost 是数据库服务器的名称,root 是用户名,后面一项是 root密码。 */Mysql_select_db(‘database’);/*选择一个数据库, database 代表数据库的名字 */
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
$query=“select * from table”;/*建立数据库操作语句, table 指表的名字 */$result=mysql_query($query ,$con);/* 执行数据库操作语句,若为查询则返回一个查询结果 id赋于 $result */
$maxrows=mysql_num_nows($result);/* 取得结果集中的记录数 */
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
for($i=0; $i<$maxrows; $i++){ $value=mysql_result($result , $i ,’fieldname’);
echo $value.”<br>”;}/*for循环将结果集中每一条记录的 fieldname字段的值存于变量 value 中并且将其输出到网上*/mysql_close($con);/* 关门数据库的连接 */?>
www.themegallery.com
利用 PHP 数据库函数连接 MySQL
补充: PHP脚本语言在网页中要放在 <?和 ?> 或 <?php 和 ?> 之间。其中的变量必须以 $ 开头。
从代码的分析看出 PHP 主要是通过 mysql函数来实现对 MySQL 数据库的操作。
通过修改字符串 query 的值,利用函数ysql_query 可以实现对数据库的不同操作。
同理,用户可以通过其它类型数据库函数来实现对相应数据库的操作。
www.themegallery.com
PHP 通过 ODBC 连接 MySQL
ODBC( 开放式数据库连接 ) 是微软推出的一种工业标准,一种开放的独立于厂商的 API 应用程序接口,可以跨平台访问各种个人计算机、小型机以及主机系统。
作为一个工业标准,绝大多数数据库厂商、大多数应用软件和工具软件厂商都为自己的产品提供了 ODBC接口,或提供了 ODBC支持。
数据库驱动程序使用 DSN(Data Source Name)定位和标识特定的 ODBC兼容数据库,将信息从Web 应用程序传递给数据库。
PHP 有内部的 ODBC函数,采用 SQL 语言可以很容易地对各种数据库进行操作。
www.themegallery.com
PHP 通过 ODBC 连接 MySQL
PHP 通过 ODBC连接MySQL 数据库主要用到四个函数:
odbc_connect () :用来同 ODBC 数据源建立连接。
odbc_do () :用来在建立连接之后执行数据库查询。
odbc_result() :用于取得当前记录行中某个字段的值。
odbc_fetch_row () :用来把查询结果保存到数组,每个数组元素对应一条记录。
www.themegallery.com
PHP 通过 ODBC 连接 MySQL
例程:<?php$con=odbc_connect(“ODBC 数据源”,” username” ,” password”);$query=“select * from table”;$result=odbc_do($con , $query);/* 执行查询语句,返回一个 ID赋予 result*/$maxrows=odbc_num_rows($result);/* 取得结果集 result 中的记录数 */
www.themegallery.com
PHP 通过 ODBC 连接 MySQL
for($i=0; $i<$maxrows;$i++){ odbc_fetch_row($result , $i);
/* 将指针定位到第 i条记录上 */
$value=odbc_result($result ,’ fieldname’);
/* 将结果集中第 i条记录的字段’ fieldname’ 值赋予 value*/
echo $value.”<br>” /*输出 value 值 */}odbc_close($con); /* 关门连接 */?>
www.themegallery.com
两种方法的对比
上述两种方法在与数据库建立连接的语法上,并没有太大差别。
相比较之下,通过 ODBC 方式存取数据库比 PHP利用数据库函数直接存取 MySQL更耗时间。
通过 ODBC接口存取数据库不必担心使用何种数据库,如Oracle , Informix , Sybase 等。它们都支持 ODBC接口,这样可减少更换数据库时需要更改程序的问题。