1、PDO是PHP新版中推荐的基于面向对象操作数据库服务器的方式。
开启PDO_mysql相关扩展:在php.ini中修改extension=php_pdo_mysql.dll
重启apache
2、PDO操作数据库的基本使用步骤
连接,认证,发送SQL,等待mysql服务器的执行结果,处理执行结果
3、pdo操作数据库的代码:
<?php
//实例化PDO对象
$dsn=‘mysql:host=localhost;port=3306;dbname=php34‘;
$username=‘root‘;
$password=‘123456‘;
//$driver_options 驱动选项,对应当前数据库服务器一些特定的初始化工作
$driver_options=array(
PDO::MYSQL_ATTR_INIT_COMMAND=>‘SET NAMES UTF8‘,
);
$pdo=new PDO($dsn,$username,$password,$driver_options);
//***** var_dump($pdo); //测试打印PDO是一个对象类型
//发送SQL到服务器等待执行SQL的结果,用pdo对象方法query(SQL)完成执行SQL
$sql="show databases";
$result=$pdo->query($sql);
//*****var_dump($result); //打印结果object(PDOStatement)#2 (1) { ["queryString"]=> string(14) "show databases" }
//*****逻辑上,返回的是结果集,被PDOStatememt类对象封装管理
//*****PDOStatement类,称之为PDO语句对象,SQL执行完(处理完)产生的结果对象
//利用该结果对象,获得我们需要的数据
/*
$list=$result->fetchAll();
var_dump($list); //默认返回关联和索引的集合,可以传递参数,进行配置
*/
//$list=$result->fetchAll(PDO::FETCH_ASSOC);
$list=$result->fetchAll(PDO::FETCH_NUM);
//var_dump($list);
//PDO对象的常用方法
// errorInfo() 错误信息,包含错误信息的数组
//errorCode() 错误代码
//处理错误信息
if(!$result=$pdo->query($sql)){
var_dump($pdo->errorInfo());
echo "<br/>";
var_dump($pdo->errorCode());
}
4、开启事务: beginTransaction();
回滚事务: rollback();
提交事务: commit();
判断是否处于事务中: inTransaction();
5、最后形成的auto_increment字段的值:lastInsertID()
6、Exec()
又一个执行SQL的方法。
区别于query(),返回值类型不同。Exec()返回值类型为整型。(query()返回的是对象类型)。
该返回的整数,表示当前执行SQL所影响的记录数。
可见:
Query(), 执行查询类,show,select,desc
Exec(), 非查询类,insert,delete,update,DDL
注意:影响的记录数可能为0.但是不意味着执行失败
7、项目中对PDO的使用
使用PDO,实现与mysqlDB这个DAO对象外部操作一致的另外一种DAO的实现,可以做到,模型切换DAO,是不需要更改模型内的任何代码(热插拔,无缝切换)。
增加DAO的操作接口(I_DAO),使所有DAO的定义(mysql扩展,PDO扩展)都实现相同的DAO操作接口(I_DAO)
//DAO层操作接口
interface I_DAO{
public function getInstance($config);
public function query($sql);
public function getAll();
public function gerRow();
public function getOne();
public function escapeString();
}
class PDODB implements I_DAO{
}
class MySQLDB implements I_DAO{
}
8、预处理(预编译)的执行方式
一条SQL的执行,MySQL分成两大步骤:
①,编译;②,执行
如果:
连续执行多条结构相同的SQL:
编译的中间结果(语法树)应该是一致的。
应该将相同的结构,统一编译,每次使用不同的数据执行即可!
预编译:指的是预先编译SQL的结构的一种执行SQL的方法
9、编译统一的结构
$PDOStatement = $pdo->prepare(SQL的结构);
SQL结构中的数据部分,可以使用问好,或者冒号标签的语法来占用
$sql1="insert into team values(null,?)";
$sql2="insert into team values(null,:team_name)";
$stmt=$pdo->prepare($sql);
10、绑定数据到中间编译结果,语法:$PDOStatement->bindValue()
$stmt->bindValue(‘:team_name‘,‘球队‘);
11、执行 语法形式: $PDOStatement->execute();
$result=$stmt->execute();
12、预编译的优点:
更好的防止SQL注入,是因为预编译时,不需要用户的数据参与。编译时,结构固定,导致用户数据不能影响到SQL的结构。
普通的执行方法:
$pdo->query();
$pdo->exec()
如果需要防止SQL注入,需要人为的转义用户数据,使用的方式是$pdo->quote()方法。转义并使用引号包裹。
13、PDOStatement对象的常用方法
errorInfo()
errorCode()
使用PDOStatement->execute()方法执行失败时,错误信息由以上两个方法获得。
fetchColumn(index=0)
允许传递参数,表示获得第一条记录的第几个字段的值。
getOne()
Fetch()
getRow()
获取一条后,可以向后移动结果集指针。
FetchAll()
getAll()
rowCount();
统计处理的记录数:
影响了多少行(增删改)
结果集中存在多少行(查)。
closeCursor();
释放结果集光标。(建议fetch之后,手动释放)
14、数据据抽象层&驱动
PDO:PHP Data Object。
PDO是数据库抽象层的一种。
将多种数据库的操作,抽象出来,使用同一种语法完成。
示例代码:
<?php
//实例化PDO对象
$dsn=‘mysql:host=localhost;port=3306;dbname=php34‘;
$username=‘root‘;
$password=‘123456‘;
//$driver_options 驱动选项,对应当前数据库服务器一些特定的初始化工作
$driver_options=array(
PDO::MYSQL_ATTR_INIT_COMMAND=>‘SET NAMES UTF8‘,
);
$pdo=new PDO($dsn,$username,$password,$driver_options);
//***** var_dump($pdo); //测试打印PDO是一个对象类型
//发送SQL到服务器等待执行SQL的结果,用pdo对象方法query(SQL)完成执行SQL
$sql="show databases";
$result=$pdo->query($sql);
//*****var_dump($result); //打印结果object(PDOStatement)#2 (1) { ["queryString"]=> string(14) "show databases" }
//*****逻辑上,返回的是结果集,被PDOStatememt类对象封装管理
//*****PDOStatement类,称之为PDO语句对象,SQL执行完(处理完)产生的结果对象
//利用该结果对象,获得我们需要的数据
/*
$list=$result->fetchAll();
var_dump($list); //默认返回关联和索引的集合,可以传递参数,进行配置
*/
//$list=$result->fetchAll(PDO::FETCH_ASSOC);
$list=$result->fetchAll(PDO::FETCH_NUM);
//var_dump($list);
//PDO对象的常用方法
// errorInfo() 错误信息,包含错误信息的数组
//errorCode() 错误代码
//处理错误信息
if(!$result=$pdo->query($sql)){
var_dump($pdo->errorInfo());
echo "<br/>";
var_dump($pdo->errorCode());
}