1、连接数据库
连接是通过创建 PDO 基类的实例而建立的。不管使用哪种驱动程序,都是用 PDO 类名。
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
带错误处理方式的连接
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
2、关闭连接
// 现在运行完成,在此关闭连接
$dbh = null;
3、连接的事务性
如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。
一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。
注意: 只有通过 PDO::beginTransaction() 启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。
在事务中执行批处理:
在下面例子中,假设为新员工创建一组条目,分配一个为23的ID。除了登记此人的基本数据之外,还需要记录他的工资。
两个更新分别完成起来很简单,但通过封闭在 PDO::beginTransaction() 和PDO::commit() 调用中,可以保证在更改完成之前,其他人无法看到这些更改。
<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
array(PDO::ATTR_PERSISTENT => true));//ATTR_PERSISTENT参数是请求一个持久连接
echo "Connected\n";
} catch (Exception $e) {
die("Unable to connect: " . $e->getMessage());
}
try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, NOW())");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
?>
4、预处理
预处理的好处a、仅需预处理一次,但可以用相同或不同的参数执行多次。所以预处理语句占用更少的资源,因而运行得更快。b、提供给预处理语句的参数不需要用引号括起来,预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。
PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象
语法:
PDO::prepare ( string $statement [, array $driver_options = array() ] )
参数
statement
合法的SQL语句。
driver_options
此数组包含一个或多个 key=>value 对来设置 PDOStatement 对象的属性, 最常使用到是将PDO::ATTR_CURSOR值设置为PDO::CURSOR_SCROLL来请求一个可滚动游标。
PDOStatement::execute 执行一条预处理语句返回 TRUE, 或者在失败时返回 FALSE。
语法:
bool PDOStatement::execute ([ array $input_parameters ] )
参数
input_parameters
一个元素个数和将被执行的 SQL 语句中绑定的参数一样多的数组。所有的值作为 PDO::PARAM_STR 对待。
如果不带input_parameters就必须用调用 PDOStatement::bindParam() 绑定 PHP 变量到参数标记
使用一个含有插入值的数组执行一条预处理语句(命名参数)
<?php /* 通过传递一个含有插入值的数组执行一条预处理语句 */ ```php $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->execute(array(':calories' => $calories, ':colour' => $colour)); ?>
下面例子通过用 name 和 value 替代相应的命名占位符来执行预处理语句进行重复插入
使用命名(:name)参数来准备SQL语句 用bindParam邦定值
```php
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();
// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>
注你不能在 SQL 语句中同时包含命名(:name)或问号(?)参数标记,只能选择其中一种风格。
使用问号占位符的预处理语句
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();
// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>
5、错误处理
通过设置 属性ATTR_ERRMODE的值为,PDO::ERRMODE_EXCEPTION
可能拖出更详细的错误信息
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
6、PHP PDO 大对象 (LOBs)
可能需要在数据库中存储"大"数据,例如图片,具体参考菜鸟PDO 大对象
7、常用命令绍介: 参考菜鸟PDO 介绍
(1)PDO::setAttribute — 设置属性
(2)int PDO::exec ( string $statement ) — 执行一条 SQL 语句,并返回受影响的行数常用在删除操作中
(3)PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集
(4)PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象一般与(5,6)一起使用
(5)PDOStatement::bindParam — 绑定一个参数到指定的变量名
(6)PDOStatement::execute — 执行一条预处理语句