[TOC] >[success]PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它 提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通 过一致的函数执行查询和获取数据。PDO随PHP5.1发行 PHP通过PDO扩展动态加载相应的数据库驱动程序来完成直接操作各 种数据库,所以在使用PDO时要明确告知所要使用的数据库驱动 ## 查看是否支持 通过phpinfo()查看是否成功加载 >[danger]注意:如果没加载,可以去php.ini看是否开启该扩展,如果前面有分号去掉。 注意:如果没有该扩展,百度"php pdo扩展安装",有很多场景下的解决方案。 ## pdo的使用 ### 通过PDO连接MYSQL ~~~ $db = new PDO("dbtype:host=yourhost;dbname=yourdbname;charset=utf8","username","password"); ~~~ 通过PDO类产生一个连接对象 ### 发送执行sql(针对select) ~~~ PDO::query ( string $statement ) ~~~ 通过查询,返回一个结果集对象 ### 发关操作sql(针对UPDATE,DELETE,INSERT) ~~~ int PDO::exec ( string $statement ) ~~~ 执行一条 SQL 语句,并返回受影响的行数 ### 取结果集中的数据 ~~~ $result->fetchAll(PDO::FETCH_ASSOC)只得到关联方式的数据 $result->fetchAll(PDO::FETCH_NUM)得到索引表示记录 $result->fetchAll(PDO::FETCH_BOTH)得到关联与索引表示的数据 $result->fetchAll(PDO::FETCH_OBJ)得到以对象形式表示的数据 $result->fetch($type)从结果集中获取下一行 ~~~ ### 错误代码 ~~~ mixed PDO::errorCode ( void ) ~~~ 获取跟数据库句柄上一次操作相关的 SQLSTATE ### 错误信息 ~~~ public array PDO::errorInfo ( void ) ~~~ 获取跟数据库句柄上一次操作错误信息 ### 自增id ~~~ string PDO::lastInsertId ([ string $name = NULL ] ) ~~~ 返回最后插入行的ID或序列值 **完整实例** ~~~ Excute query with secure data ============================== <?php try{ $db = new PDO("dbtype:host=yourhost;dbname=yourdbname;charset=utf8","username","password"); $mysecuredata=14; $db->query("Select * from table where id=".$mysecuredata); }catch(PDOException $e ){ echo "Error: ".$e; } ?> Excute query with insecure data ============================== <?php try{ $db = new PDO("dbtype:host=yourhost;dbname=yourdbname;charset=utf8","username","password"); $myinsecuredata=$_GET["id"]; $query=$db->prepare("Select * from table where id=?"); $query->excute(array($myinsecuredata)); }catch(PDOException $e ){ echo "Error: ".$e; } ?> ~~~ ## Pdo预准备 >[success]预计准备的目的与mysqli预准备的是一样的,可以减少解析次数和防注入 **实例** ~~~ <?php /* 通过绑定的 PHP 变量执行一条预处理语句,*/ /*执行一条使用命名占位符的预处理语句 */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); $sth->execute(); ?> <?php /* 通过绑定的 PHP 变量执行一条预处理语句*/ /*执行一条使用问号占位符的预处理语句*/ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindParam(1, $calories, PDO::PARAM_INT); $sth->bindParam(2, $colour, PDO::PARAM_STR, 12); $sth->execute(); ?> ~~~ >[danger]练习:通过Pdo类,开发一个自己的操作数据库的类 Model.class.php