标签:
前言:
PDO:PHP Data Object 一种PHP的数据对象,使用一个针对特定的数据库的PDO驱动
PHP5以前都是用mysql函数去驱动mysql数据库,本来是打算在PHP6废除PHP中的mysql扩展,之后夭折,PHP5以后用对象方式的操作去驱动数据库,目的是为了提供一种轻型、清晰、方便的API统一各种不同RDBMS库的共有特征。
优点:1.支持永久性连接,mysql多次连接数据将会使用用一个进程,减少服务器开销。
2.对象方式编程
3.PDO的单次执行效率可能不如mysql,但是大吞吐量下稳定性优于mysqli
4.切换平台的兼容性更好
pdo的安装
windows下:打开extension=php_pdo.dll extension_php_mysql.dll,重启服务器即可。
linux下:详情查找相关资料。
手册里的pdo
创建连接对象
pdo的错误处理机制
pdo和mysql一样,默认是”静默模式“,不显示mysql执行中的错误,pdo中分成三成错误模式:
静默模式:错误不显示在页面;
警告模式:对错误的处理是输出页面,可以自定义处理函数
异常模式:Exception异常类,通过try监听,catch捕获,throw抛出
pdo操作sql常用函数
第一类:执行语句
$statement
) # 无结果集 返回影响行数Int类型 例如:insert, uodate, set names utf8等$statement
) # 有结果集 返回PDOStatement对象 例如:select, show等1 <?php 2 3 header(‘Content-Type:text/html; charset=utf-8‘); 4 $dsn = ‘mysql:host=localhost;dbname=demo;‘; 5 $opts = array(PDO::ATTR_AUTOCOMMIT=>1, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION); 6 try{ 7 8 $db = new PDO($dsn, ‘root‘, ‘‘, $opts); 9 10 /** 11 * exec()和query()的区别 12 */ 13 $sql_insert = "INSERT INTO pdo(name) VALUES(‘dishui‘)"; 14 var_dump($db ->exec($sql_insert));PHP_EOL; # 返回结果是int 1 15 var_dump($db ->query($sql_insert));PHP_EOL; # query没有结果集返回,返回的是PDOStatement对象,可以打印下看看 16 17 $sql_select = "SELECT id,name FROM pdo"; 18 var_dump($db ->exec($sql_select));PHP_EOL; # 返回结果报错,合情合理。报错后为了测试注释掉 19 var_dump($result = $db ->query($sql_select));PHP_EOL; # 返回结果 同上个query。 20 /** 21 * query后得到是一个对象 22 * 然后通过三种方式:foreach循环(不建议使用)、 23 * PDOStatement::fetch()或者PDOStatement::fetchALL()获取数据 24 */ 25 foreach ($result as $arr) { # 返回关联数组和索引数组 26 print_r($arr);PHP_EOL; 27 } 28 $result ->setFetchMode(PDO::FETCH_ASSOC); # 设置取出数组的格式 ASSOC是关联数组 NUM索引数组 29 while($row = $result->fetch()){ 30 print_r($row);PHP_EOL; 31 } 32 var_dump($result->fetchALL()); 33 34 }catch(PDOException $e){ 35 echo $e->getMessage(); 36 }
PDO::beginTransaction();
PDO::commit();
PDO::rollback();
第三类:预处理:
预处理是PDO中运用最多的地方,上面的执行语句exec和query在实际的开发中应用的并不多,而且也不推荐使用。
预处理是先将客户端准备好的sql语句发送到数据库服务器端进行编译,只编译一次,减少服务器开销,然后等待数据或者开始执行
预处理的步骤:
1 <?php 2 3 header(‘Content-Type:text/html;charset=utf-8‘); 4 $opts = array( 5 PDO::ATTR_AUTOCOMMIT=>1, 6 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 7 PDO::ATTR_PERSISTENT=>TRUE, 8 ); 9 $db = new PDO(‘mysql:host=localhost;dbname=demo‘, ‘root‘, ‘‘ ,$opts); 10 # 无结果集 11 $dbm = $db->prepare("INSERT INTO pdo(name,sex) VALUES(?,?)");//?是占位符 12 $dbm->bindParam(1,$name);//bindParam()绑定一个参数到指定的变量名。bindValue绑定一个值 13 $dbm->bindParam(2,$sex); 14 $dbn = $db->prepare("INSERT INTO pdo(name,sex) VALUES(:name,sex)");//:name同样是占位符 15 $dbn->bindParam(‘:name‘,$name);//绑定一个参数到指定的变量名。bindValue绑定一个值 16 $dbn->bindValue(‘:sex‘,‘man‘); 17 $name = ‘xiaoli‘; 18 $sex = ‘man‘; 19 20 $dbm->execute(); 21 echo $dbm->rowCount();PHP_EOL;//影响行数,或者总行数 22 # 有结果集 23 $dbl = $db->prepare("SELECT * FROM pdo where sex=:sex"); 24 $dbl->execute(array(‘sex‘=>‘man‘)); 25 echo ‘绑定列输出结果:‘; 26 $dbl->bindColumn(1,$id); 27 $dbl->bindColumn(2,$name); 28 $dbl->bindColumn(3,$sex); 29 while($dbl->fetch(PDO::FETCH_BOUND)){ 30 echo ‘姓名:‘. $name . ‘,性别:‘ . $sex;PHP_EOL; 31 } 32 echo ‘<hr />‘; 33 die; 34 print_r($dbl->fetchAll(PDO::FETCH_ASSOC));
其他:
PDO::lastInsertId()获得上一次插入的ID
PDO::errorCode()错误码
PDO::errorInfo()错误信息
PDO::quote()返回一个添加引号的字符串
标签:
原文地址:http://www.cnblogs.com/dishui/p/5131386.html