一样平常关系型数据库采取的是“客户机/做事器”的体系构造,客户端通过SQL语句操作做事端。在PHP中,有两大类操作数据库的扩展,一种是针对各数据库开拓的专用扩展,如MySQL扩展、SQLite3扩展;另一种是数据库抽象层,如PDO(PHP Data Objects,PHP数据工具)、ODBC(Open Database Connectivity,开放数据库互连)。在PHP开拓中,以前的开拓中大多利用专用扩展,由于PDO是在PHP5.1版本才引入的,而目前开拓中大多利用PDO扩展。Laravel框架中关于数据库操作的底层利用的便是PDO扩展。
那么这两种扩展有什么差异呢?一是开拓思想不同,针对各数据库开拓的专用扩展采取的是面向过程的思想开拓的,而PDO扩展采取的是面向工具的思想开拓的。二是供应的接口针对的数据库范围不同,专用扩展只是针对某一种数据库开拓的,如MySQL扩展供应的接口只能操作MySQL数据库,当变动底层数据库时,就要重新安装相应数据库的扩展,也须要对数据库的操作代码重新编程;而数据库抽象层则针对多种数据库供应统一的接口,采取这种接口编写的程序,在变动底层数据库时,不须要重新安装数据库抽象层,但须要安装对应的数据库驱动,代码部分只须要修正少许的连接和设置等操作,其他对数据的操作不须要修正,扩展性好,其浸染办法如图所示。三是安全性,在关系型数据库中,利用专用扩展须要办理SQL注入的问题,而利用PDO扩展可以避免这个问题。
下面针对MySQL数据库先容专用扩展和PDO扩展的用法,一是使读者理解两者的差异和效果,二是有助于读者理解Laravel框架关于数据库操作底层的实现。1.MySQL扩展运用;前面提到,专用MySQL扩展是采取面向过程的思想开拓的,当PHP安装了MySQL扩展后,就可以直策应用相应的函数来实行SQL语句,从而完成对数据库的操作,这里用到的是mysql_query()函数实行SQL语句。一样平常将SQL语句分为两类:一类是实行SQL语句后有返回结果的,如select语句、desc语句等;第二类是没有返回结果的,如delete语句、insert语句等。对付没有返回结果的语句不须要设置返回值,可以通过mysql_insert_id()函数获取末了操作数据的行数及通过mysql_affected_rows()获取操作影响的行数。对付有返回结果的语句须要设置返回值,可以通过mysql_fetch_assoc()函数实现返回值的获取。下面给出一个大略的对数据库进行操作的源码:

通过上述源码可以看出,操作一个数据库须要四个步骤:一是连接数据库的做事端;二是选择数据库;三是准备SQL语句并实行;四是关闭数据库。这些步骤所用到的函数都是对应数据库专用的扩展函数,在扩展方面无法迁移到其他数据库,在安全性方面,由于是一次性完成SQL语句命令和数据的设定及编译(一样平常数据库将SQL语句从客户端发送到做事端时须要先编译才能实行),以是随意马虎受到SQL注入的攻击。
2.PDO扩展运用;目前,在PHP程序设计中对数据库的操作广泛采取PDO扩展办法,由于该扩展对不同数据库供应统一的接口,只须要添加相应数据库的驱动就可以实现数据库的迁移,扩展性更好。同时,PDO将做事器端命令语句的编译和数据添加的分离思想运用到客户端,可以避免SQL注入的攻击,安全性更好。下面给出基于PDO扩展来操作MySQL数据库的源码:
通过上述源码可以看出,采取PDO扩展对数据库操作的步骤与采取专用MySQL扩展对数据库操作的步骤险些相同,但在实现办法上却不同。一是在PDO扩展中对MySQL数据库的操作方法中险些没有与该数据库关联的部分,只有在建立连接时布局DSN(Data Source Name,数据源名称)时以“mysql:host=localhost;dbname=Laravel”的办法声明了数据库类型,而详细对数据库的操作方法与数据库类型无关,以是在数据库迁移时,只须要修正这个连接参数就可以实现,扩展性更好;二是在实行数据库操作时,可以先通过PDO类的prepare()方法将操作命令发送到做事端编译,再通过PDOStatement类的execute()方法将数据发送到做事端并实行,这种方法既可以提高多次实行同一条操作命令时的速率,也可以避免SQL注入的危险,以是效率、安全性都更高。