PDO介绍
PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口。实现PDO接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。注意利用PDO扩展自身并不能实现任何数据库功能;必须使用一个具体数据库的PDO驱动
来访问数据库服务。
PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO不提供数据库抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。
操作MySQL数据库需要PDO_MYSQL
驱动,支持MySQL 3.x/4.x/5.x。
创建PDO对象
PDO构造规则是
PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
其中对于dsn(Data Source Name),包含如下元素:
- DSN前缀,对于PDO_MYSQL,固定为
mysql:
- host,主机名
- post,主机端口
- dbname,数据库名称
- unix_socket,MySQL Unix socket(不能和host或port同时使用)
- charset,字符集
例子1
<?php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbh = new PDO($dsn, $username, $password, $options);
?>
例子2
<?php
$dsn = 'mysql:host=localhost;port=12345;dbname=testdb;charset=utf8';
$username = 'username';
$password = 'password';
$dbh = new PDO($dsn, $username, $password);
?>
查询
例子1——查询多条记录
<?php
$dsn = 'mysql:host=192.168.1.101;port=3306;dbname=zhyoulun;charset=utf8';
$username = 'zhyoulun';
$password = 'Abcd#1234';
$pdo = new PDO($dsn,$username,$password);
$sql = 'select id,name from a_tag limit 0,3';
$statement = $pdo->prepare($sql);
if(!$statement->execute())
{
echo "execute error";
exit(1);
}
$items = $statement->fetchAll();
print_r($items);
输出
Array
(
[0] => Array
(
[id] => 1
[0] => 1
[name] => yii2
[1] => yii2
)
[1] => Array
(
[id] => 2
[0] => 2
[name] => 伪静态
[1] => 伪静态
)
[2] => Array
(
[id] => 3
[0] => 3
[name] => php
[1] => php
)
)
例子2——查询多条记录
$sql = 'select id,name from a_tag limit 0,3';
$statement = $pdo->prepare($sql);
if(!$statement->execute())
{
echo "execute error";
exit(1);
}
while($item = $statement->fetch())
{
print_r($item);
}
结果
Array
(
[id] => 1
[0] => 1
[name] => yii2
[1] => yii2
)
Array
(
[id] => 2
[0] => 2
[name] => 伪静态
[1] => 伪静态
)
Array
(
[id] => 3
[0] => 3
[name] => php
[1] => php
)
例子3——绑定参数
$sql = 'select id,name from a_tag where id>=:id_min and id<=:id_max';
$statement = $pdo->prepare($sql);
$statement->bindValue(':id_min', 3);
$statement->bindValue(':id_max', 4);
if(!$statement->execute())
{
echo "execute error";
exit(1);
}
while($item = $statement->fetch(PDO::FETCH_ASSOC))
{
print_r($item);
}
结果
Array
(
[id] => 3
[name] => php
)
Array
(
[id] => 4
[name] => curl
)
插入
例子
$sql = "insert into a_tag(name,count) values('标签1',0);";
$affectRows = $pdo->exec($sql);
print_r($affectRows);
结果
1
更新
例子
$sql = "update a_tag set count=2 where id=1;";
$affectRows = $pdo->exec($sql);
print_r($affectRows);
结果
1
删除
例子
$sql = "delete from a_tag where id=41;";
$affectRows = $pdo->exec($sql);
print_r($affectRows);
结果
1
事务
例子
$pdo->beginTransaction();
try{
for($i=1;$i<100000;$i++)
{
$sql = "insert into a_tag(id,name,count) values({$i},'标签2',0);";
$affectRows = $pdo->exec($sql);
var_dump($affectRows);
//触发回滚
if($i==100)
throw new PDOException();
}
$pdo->commit();
} catch (PDOException $e) {
echo "rollback";
$pdo->rollBack();
}
运行可以可以看到循环了100次,100次以后,触发回滚,数据库中没有新增数据。
参考
- PHP Manual