简介
PDO 支持面向对象的方式处理各种数据库(如:mysql、oracle、db2等),也就是说,PDO 支持跨数据库类型。
PDO 中也支持预处理和参数绑定。
连接数据库
try{
$pdo = new PDO('mysql:host=localhost;dbname=test','root','root');
// 设置错误处理模式为抛出异常,下面执行SQL语句的时候,如果有错误,就会抛出异常。这种错误处理模式是最常用的一种。
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //PDO::ERRMODE_EXCEPTION也可以用数字2代替
}catch(PDOException $e){
echo '数据库连接失败: '.$e->getMessage();
exit;
}
常用方法
exec() 方法
exec() 用来执行写操作的SQL语句,如insert,delete,update等。执行成功返回受影响的行数,失败返回false。
$sql = 'insert user(name, balance) values("张三","3000"),("李四","3000")';
$affected_rows = $pdo->exec($sql);
var_dump($affected_rows);
echo '<br>';
echo "最后插入的自动增长的ID为:".$pdo->lastInsertId();
query() 方法
query() 用来执行读操作的SQL语句,如select,desc等。执行成功返回结果集,失败返回false。
$stmt = $pdo->query("select * from user");
// 设置提取方式为只提取索引数组
$stmt->setFetchMode(PDO::FETCH_ASSOC);
// 每次取出结果集中的一条记录,也可以在 fetch() 方法中传入参数,来设置提取方式
while($row = $stmt->fetch()){
var_dump($row);
}
// $rows = $stmt->fetchAll(); // 取出结果集中的所有记录
prepare() 方法
prepare() 用来进行预处理,可以对读操作和写操作进行预处理。
执行成功返回PDOStatement object(预处理对象),失败返回false。
下面详细讲述预处理。
预处理
预处理(prepare):指的是在数据库服务器上预先准备一个 SQL 语句,执行成功的话,返回一个 PDOStatement object(预处理对象),失败返回 false。
它同 PDO 类中的 exec() 和 query() 方法相比,有以下优点:
- 安全性高。预处理可以有效防止 SQL 注入,因为通过预处理,SQL 语句的主体部分,已经提前在服务器上形成了一个预处理对象,之后通过客户端传递过来的参数,只会被当作值来处理。
- 执行效率高。通过预处理,某条 SQL 语句已经提前在服务器上形成了一个预处理对象,下次碰到和自身语句结构相同的 SQL 语句时,就会直接调用该预处理对象。或者,同一条 SQL 语句需要多次执行时,如果服务器中已经存在对应的预处理对象,就会直接对其调用。
因此,推荐使用预处理。即尽量使用 prepare() 方法。
占位符
占位符的作用是将 SQL 语句中某个具体的值,用占位符替代。
占位符替代的是整个值,不能只替代值的一部分。
占位符有两种形式:? 和 :名称。
问号占位符(?)
参数和问号占位符的匹配按照占位符 ? 的顺序进行匹配。
$stmt = $pdo->prepare('insert user(name,balance) value(?,?)');
$name = "老王";
$balance = 1888;
// 参数绑定
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $balance);
$res = $stmt->execute();
// 如果上面没有绑定参数,就可以这样写。(对应问号占位符)
// $res = $stmt->execute(array($name, $balance));
名称占位符(:名称)
参数和名称占位符的匹配按照名称进行匹配,和顺序无关。
$stmt = $pdo->prepare('insert user(name,balance) value(:a,:b)');
$name = "老王";
$balance = 2888;
// 参数绑定
$stmt->bindParam(":a", $name);
$stmt->bindParam(":b", $balance);
$res = $stmt->execute();
// 如果上面没有绑定参数,而且用的是名称占位符。就应该这样写。
// $res = $stmt->execute(array(':a'=>$name, ':b'=>$balance));