PHP 中使用 PDO 扩展操作 MySQL

简介

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));

猜你喜欢

转载自blog.csdn.net/lamp_yang_3533/article/details/80574767