个人理解
pdo是进程和各种数据库之间的中间层, 用来抹平数据库的差异,从而降低使用各种版本品牌数据库的复杂性.类似于linux的VFS.
难以逾越的地方在于如果想一键切换数据库必须要写个个数据库都兼容的sql语句.
于是, PDO成为了支持多种数据库的框架的利器.(框架一般会封装一个ActiveRecord类避免使用原生SQL);
综上所述:开发效率提高, 执行效率下降
connection
<?php
/*
DSN = "mysql:host=服务器地址/名称;port=端口号;dbname=数据库名";
Options = array[
PDO::MYSQL_ATTR_INIT_COMMAND=>’set names utf8’
PDO::ATTR_PERSISTENT => true //开启持久化连接, 在swoole里用, fpm不使用
];
$pdo = new pdo(DSN, "用户名", "密码", Options);
*/
$dsn = "mysql:host=localhost; port=3306; dbname=php39";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8');
$pdo = new PDO($dsn, 'root', '123', $opt);
var_dump($pdo);
?>
statements
<?php
$dsn = "mysql:host=localhost; port=3306; dbname=php39";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8');
$pdo = new PDO($dsn, 'root', '123', $opt);
$sql = "select * from tab_int limit 0, 3";
$stmt = $pdo->query($sql); //得到pdo的结果集
$arr1 = $stmt->fetch(PDO::FETCH_ASSOC); //返回关联数组
$arr2 = $stmt->fetch(PDO::FETCH_NUM); //返回索引数组
$arr3 = $stmt->fetch(); //相当于fetch(PDO::FETCH_BOTH)
echo "<br />"; print_r($arr1);
echo "<br />"; print_r($arr2);
echo "<br />"; print_r($arr3);
?>
prepare
<?php
$dsn = "mysql:host=localhost; port=3306; dbname=php39";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8');
$pdo = new PDO($dsn, 'root', '123', $opt);
$sql = "select user_id, user_name, age,edu from user_list where user_id= ? and user_name = ? ";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 6); //占位符按自然顺序,从1开始
$stmt->bindValue(2, 'user2');//第2项给值为“user2”;
$stmt->execute();
$arr = $stmt->fetch(PDO::FETCH_ASSOC);
//PRINT_R($arr);
//echo "<hr />";
$sql = "select user_id, user_name, age,edu from user_list where user_id= :v1 and user_name = :v2 ";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":v1", 6); //命名参数,直接使用该名字
$stmt->bindValue(":v2", 'user2');
$stmt->execute();
$arr = $stmt->fetch(PDO::FETCH_ASSOC);
PRINT_R($arr);
?>
获取错误信息
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>网页标题</title>
<meta name="keywords" content="关键字列表" />
<meta name="description" content="网页描述" />
<link rel="stylesheet" type="text/css" href="" />
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<?php
$dsn = "mysql:host=localhost; port=3306; dbname=php39";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8');
$pdo = new PDO($dsn, 'root', '123', $opt);
var_dump($pdo);
$sql = "updateeeee tab_int set f1 = 1; "; //这个sql语句肯定是错误
$result = $pdo->exec($sql);
if($result === false){
echo "<p>发生错误:";
echo "<br />错误代号:" . $pdo->errorcode();
$e = $pdo->errorinfo(); //这是一个数组!第3项才是错误信息
//var_dump($e);
echo "<br />错误信息:" . $e[2];
}
//下面,让pdo对象“进入”异常模式,以处理出错信息:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//然后,下面开始演示异常模式的代码:
try{
$sql = "deleteeeeee from user_list;";
$result = $pdo->exec($sql);
echo "执行成功";
}
catch(Exception $e){ //这个$e就是错误对象
echo "<p>发生错误:";
echo "<br />错误代号:" . $e->GetCode(); //获取该错误的对象的错误代号
echo "<br />错误信息:" . $e->GetMessage(); //获取该错误的对象的错误提示
}
?>
</body>
</html>
PDO事物操作
<?php
//实例化PDO对象
$dsn = "mysql:host=127.0.0.1;dbname=php_7;port=3306;charset=utf8";
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn,$user,$pass);
//先开启事务
$pdo -> beginTransaction();
//先从宋江的账号上扣3000
$sql = "UPDATE cash SET money=money-3000 WHERE name='宋江'";
$res1 = $pdo -> exec($sql);
//李逵的账号上加 3000
$sql = "UPDATE cash SET money=money+3000 WHERE name='李逵'";
$res2 = $pdo -> exec($sql);
if($res1 && $res2){
//一组操作都成功则提交
$pdo -> commit();
}else{
//有任何一个单元出错则回滚
$pdo -> rollBack();
}