数据库抽象层:
在数据迁移和项目操作多数据库时,为了便于操作而提供一种的解决方案。
当从一个数据库系统向另一个数据库系统迁移时,几乎不用更改太多的程序代码,如将MS SQL Server迁移到MySQL。
代码规划必须规范,尽量使用相同的数据进行对象实例化,并且使用相同的数据库抽象层(如PDO)。这样只需要改变系统的配置文件即可迁移数据库。
目前,使用PHP进行不同的数据库系统开发,这些系统很不相同,而许多数据库抽象层在PHP的层次有所不同,但彼此使用方法相当,它的发展无疑会提高开发效率。
常见的数据库抽象层:
PDO,ADODB, Metabase,PEAR:DB, MySqli(mysql扩展组件)
PDO优点:
PDO底层是c语言开发的,速度较快
PDO简单易学(30多个函数-20个左右)
PHP高版本中已经将PDO作为默认的数据库链接方式,而mysql_query即将被淘汰。
PDO的用法:
PDO类: 用于操作数据库的基本命令 $pdo_object
PDO Statement类: 对查询得到的结果集做操作的类 $pdo_statement
PDO Exception类: PDO异常类
PDO配置和初始化:
Php.ini 开启PDO: 重新apache
Extension = php_pdo.dll
Extension = php_pdo_mysql.dll
$db = new PDO("库类型:host=?;dbname=?","用户名","密码");
链接字符串(DSN)
【PDO_connect.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = ""; try{ $pdo = new PDO($dsn,$usr,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } if($pdo instanceof PDO) echo "PDO connect ok"; else echo "PDO connect error"; ?>
查询操作:
$pdo_statement = $pdo_object -> query("sql命令"):
返回值:
查询功能: 有记录返回-返回结果集 false
插入/删除/修改 :返回 true or false
获取结果集中数据为数组:
$pdo_statement -> Fetch():转换一条记录为一维数组
$pdo_statement -> FetchAll()转换所有记录为二维数组
设置数组样式:
$pdo_statement -> serFetchMode(模式)
模式:
PDO::FETCH_NUM: 索引数组
PDO::FETCH_BOTH: 两种数组
PDO::FETCH_ASSOC: 关联数组
设置链接属性(大小写):
$pdo_statement -> setAttribute(属性,值);
属性:
PDO::ATTR_CASE
值:
PDO::CASE_UPPER 大写
PDO::CASE_LOWER 小写
【pdo_statement.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = ""; try{ $pdo = new PDO($dsn,$user,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } $sql = "select * from students"; $result = $pdo -> query($sql); $data = $result -> fetchAll(); print_r($data); echo "<hr/>"; // 取出后结果集对象中数据不存在 $pdo -> setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); // key名大写 $result = $pdo -> query($sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $data = $result -> fetch(); print_r($data); ?>
修改,删除等无结果集返回的sql操作
$pdo_object -> exec(sql语句);
返回: 有记录影响,返回的是影响行数,无影响返回0;
预加载处理: 一次加载多次执行.
$pdo_statement = $pdo_object -> prepare(sql语句) : 预加载sql语句命令
$pdo_statement-> execute(): 执行预加载命令
$sql = "select * from student where sid=:id& sname=:name";
?: 内存变量标示的统一符号。
:字符 -> 内存变量;
$sql = "select * from student where sid=:id& sname=:name"
$pdo_statement->bindValue(":id",值)
$sql = "select * from student where sid=?& sname=?"
$pdo_statement->bindValue(1,值)
$pdo _statement -> bindParam(":id|数字",PHP变量);