php数据库类PDO的一些理解

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 — 执行一条预处理语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值