来源:
基于驱动的。
php_pdo.dll
php_pdo_mysql.dllphp.ini
打开扩展。三个类:
PDO类 PDOsatement PDOexcaption 常量PDO __construct();一,创建PDO对象
dsn(data source name)数据源名
$pdo=new PDO();
$pdo=new PDO("url=pash","","");php.ini 配置pdo.dsn.mysqlpdo=mysql:host= ;dbname= try{ $pdo=new PDO("mysql:host= ;dbname= ","","");}catch(PDOException $w){ echo "数据库连接成功:".$w->getMessage(); exit;}
----------------------
<?phptry{ //调优参数
$driver_opts=array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_PERSISTENT=>true); $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", $driver_opts); //设置属性 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); $pdo->setAttribute(PDO::ATTR_PERSISTENT, true);}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage(); exit; } //获取信息echo $pdo->getAttribute(PDO::ATTR_PERSISTENT)."<br>"; 持久连接
echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)."<br>"; echo $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION)."<br>"; echo $pdo->getAttribute(PDO::ATTR_SERVER_INFO)."<br>"; echo $pdo->getAttribute(PDO::ATTR_SERVER_VERSION)."<br>"; echo $pdo->getAttribute(PDO::ATTR_DRIVER_NAME)."<br>";------------------------------------方法
<?php
try{ $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", array(PDO::ATTR_AUTOCOMMIT=>0)); //设置错误模式 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); exit; }执行SQL语句 exec() query() prepare()
一种有结果集的query(), 执行select语句 另一种exec()用来执行有影响行数的,update, delete insert, other exec()返回的是影响的行数echo "影响的行数".$pdo->exec("insert into shops(name1, price, num, desn) values('aa', '12.1', '10', 'good')");
设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING 警告模式 echo $pdo->errorCode()."<br>"; print_r($pdo->errorInfo());$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION/2)
$affected_rows 影响行数
if(!$affected_rows){ echo $pdo->errorCode()."<br>"; print_r($pdo->errorInfo()); }else{ echo "执行成功!"; } --------------------------------------------使用这样模式try{ $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//异常模式设置1,2,3 }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); exit; }//执行SQL语句 exec() query() prepare()
//一是有结果集的query(), 执行select语句 //exec()用来执行有影响行数的,update, delete insert, other //exec()返回的是影响的行数 try{ $affected_rows=$pdo->exec("insert into shops(name1, price, num, desn) values('aa', '12.1', '10', 'good')"); }catch(PDOException $e){ echo $e->getMessage(); }---------------------------------------------------try{ $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); exit; }//执行SQL语句 exec() query() prepare()
//一是有结果集的query(), 执行select语句 //exec()用来执行有影响行数的,update, delete insert, other //exec()返回的是影响的行数 try{ $affected_rows=$pdo->exec("insert into shops(name, price, num, desn) values('bb', '12.1', '10', 'good')");echo "最后插入的自动增长的ID:".$pdo->lastInsertId();//获取自动增长的ID
}catch(PDOException $e){ echo $e->getMessage(); }--------------------------------------------------------------执行查询语句
try{ $stmt=$pdo->query("select * from shops");foreach($stmt as $row){ 支持遍历
print_r($row); echo '<br>'; }}catch(PDOException $e){
echo $e->getMessage(); } ------------------------------------------------------------- 事务处理 * 张三从李四那里买了一台 2000 元的电脑 * * 从张三帐号中扣出 2000元 * * 向李四账号中加入 2000元 * * 从商品表中减少一台电脑 * * MyIsAM InnoDB支持事务处理,速度慢 //type=InnoDB PDO::ATTR_AUTOCOMMIT, 0 //关闭自动提交try{
$pdo->beginTransaction();//开启事务 $price=500;$sql="update zhanghao set price=price-{$price} where id=1";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows)
throw new PDOException("张三转出失败");$sql="update zhanghao set price=price+{$price} where id=3";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows) throw new PDOException("向李四转入失败");echo "交易成功!";
$pdo->commit(); }catch(PDOException $e){ echo $e->getMessage(); $pdo->rollback();//回滚 } $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);//开启自动提交 //设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING--------------------------------------------------------
PDOStatement类 预处理语句 帮我们准一个语句和在PDO中对象的exec()以及query()相比 优点: 执行效率高 安全性更高帮我们处理结果集
prepare();
是推荐使用
/* pdo中有两种占位符号
* * ? 参数 --- 索引数组, 按索引顺序使用 * 名子参数 ----关联数组, 按名称使用,和顺序无关 */ try { $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456"); }catch(PDOException $e){ echo $e->getMessage(); } //获取结果 fetch(常量)关联 索引 一条一条获取 fetchAll(); 关联 索引setFetchMode(常量);设置模式
$stmt=$pdo->prepare("select id, name, price, num, desn from shops where id > :id order by id"); //绑定列 顺序或列名 $stmt->bindColumn("id", $id, PDO::PARAM_INT); $stmt->bindColumn("price", $price); $stmt->bindColumn("name", $name, PDO::PARAM_STR); $stmt->bindColumn(4, $num); $stmt->bindColumn(5, $desn);$stmt->execute(array(":id"=>100)); 返回的是BOOL
echo '<table border=1 width=900 align="center">';
echo '<tr>';
//获取列信息 for($i=0; $i<$stmt->columnCount(); $i++){ $field=$stmt->getColumnMeta($i); echo '<th>'.$field["name"]."</th>"; }echo '</tr>';
while($stmt->fetch()){
echo '<tr>'; echo '<td>'.$id.'</td>'; echo '<td>'.$name.'</td>'; echo '<td>'.$price.'</td>'; echo '<td>'.$num.'</td>'; echo '<td>'.$desn.'</td>'; echo '</tr>'; } echo '</table>';echo "总记录数:".$stmt->rowCount()."<br>";
echo "总字段数:".$stmt->columnCount()."<br>";---------------------------------------------------------try { $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456"); }catch(PDOException $e){ echo $e->getMessage(); }pdo中有两种占位符号
* * ? 参数 --- 索引数组, 按索引顺序使用 * 名子参数 ----关联数组, 按名称使用,和顺序无关$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行 //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来// $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)"); //绑定名字参数/* $stmt->bindParam(":name", $name); $stmt->bindParam(":num", $num); $stmt->bindParam(":desn", $desn); $stmt->bindParam(":price", $p); */ //绑定?参数 顺序绑定 $stmt->bindParam(1, $name, PDO::PARAM_STR);//预定义常量类型 $stmt->bindParam(3, $num, PDO::PARAM_INT); $stmt->bindParam(4, $desn, PDO::PARAM_STR); $stmt->bindParam(2, $p, PDO::PARAM_STR);
$name="wwww1";
$num=101; $desn="hello1"; $p=34.51;if($stmt->execute()){
echo "执行成功"; echo "最后插入的ID:".$pdo->lastInsertId(); }else{ echo "执行失败!"; }------------------------------------------------/ $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)"); // $stmt->execute($_POST);$stmt->execute(array(":price"=>99, ":name"=>"kkk1", ":num"=>"451", ":desn"=>"aaaaaa1"));
$stmt->execute(array(":price"=>88, ":name"=>"kkk2", ":num"=>"452", ":desn"=>"aaaaaa2")); $stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3"));-------------------------------------------------------------】$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行$stmt->execute(array("myname1", 11.2, 55, "very good"));
$stmt->execute(array("myname2", 11.2, 54, "very good")); $stmt->execute(array("myname3", 11.2, 56, "very good"));