博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PDO exec() query() prepare() PDOException 事务处理
阅读量:4706 次
发布时间:2019-06-10

本文共 7110 字,大约阅读时间需要 23 分钟。

来源:

基于驱动的。

php_pdo.dll

php_pdo_mysql.dll

php.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;

}

----------------------

<?php

 try{    //调优参数

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

转载于:https://www.cnblogs.com/hasayaki/archive/2013/03/15/2960715.html

你可能感兴趣的文章
【Android】如何创建自己的证书文件,如何为apk以及zip文件签名 openssl
查看>>
DIV+CSS兼容解决DIV最大宽度和最小宽度问题
查看>>
IIC总线的FPGA实现
查看>>
Standard C++ Episode 1
查看>>
记一次Linux服务器上查杀木马经历
查看>>
Winform Timer用法,Invoke在Timer的事件中更新控件状态
查看>>
多线程同步技术(一)
查看>>
HDU 1829 并查集up
查看>>
rabbitmq3.7集群搭建实战
查看>>
深入理解Asp.net MVC路由
查看>>
正则化方法:L1和L2 regularization、数据集扩增、dropout
查看>>
java是编译型语言还是解释型语言?
查看>>
day4 小结
查看>>
语系/地区码
查看>>
【非原创】LightOJ - 1284 Lights inside 3D Grid【概率期望】
查看>>
【前端优化之拆分CSS】前端三剑客的分分合合
查看>>
Sublime Python3编译环境修改
查看>>
Linux系统修改防火墙配置
查看>>
cocos2d 触屏事件
查看>>
技术人生:他们的毅力超过才力
查看>>