首页 > php技术 > php文章> 详细内容
PDO进行sql语句预处理和操作结果集详细介绍
日期:2018-07-11 
  1. <span style="font-size:18px;">一:预处理语句及其绑定参数执行insert  
  2.   
  3. try {  
  4.         $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb""root""123456");  
  5.     }catch(PDOException $e){  
  6.         echo $e->getMessage();  
  7.     }  
  8.       
  9.     /* pdo中有两种占位符号 
  10.      *   
  11.      *  ? 参数             --- 索引数组, 按索引顺序使用 
  12.      *  名字参数           ----关联数组, 按名称使用,和顺序无关 
  13.      */  
  14.       
  15.     $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行  
  16.       
  17.     //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来  
  18. //    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");  
  19.       
  20.     //绑定名字参数   顺序可以不一致和名字对应即可  
  21. /*    $stmt->bindParam(":name", $name); 
  22.     $stmt->bindParam(":num", $num); 
  23.     $stmt->bindParam(":desn", $desn); 
  24.     $stmt->bindParam(":price", $p); 
  25.  */  
  26.     ////绑定  问好?参数---得按顺序绑定  
  27.     $stmt->bindParam(1, $name, PDO::PARAM_STR);//第3个参数是数据类型可不用写,会自动找类型  
  28.     $stmt->bindParam(3, $num, PDO::PARAM_INT);  
  29.     $stmt->bindParam(4, $desn, PDO::PARAM_STR);  
  30.     $stmt->bindParam(2, $p, PDO::PARAM_STR);  
  31.   
  32.     $name="wwww1";  
  33.     $num=101;  
  34.     $desn="hello1";  
  35.     $p=34.51;  
  36.   
  37.     if($stmt->execute()){  
  38.         echo "执行成功";  
  39.         echo "最后插入的ID:".$pdo->lastInsertId();  
  40.     }else{  
  41.         echo "执行失败!";  
  42.     }  
  43.       
  44.     //多次插入------------想执行多次。。。N次,传值即可  
  45.     $name="wwww1";  
  46.     $num=101;  
  47.     $desn="hello1";  
  48.     $p=34.51;  
  49.   
  50.     if($stmt->execute()){  
  51.         echo "执行成功";  
  52.         echo "最后插入的ID:".$pdo->lastInsertId();  
  53.     }else{  
  54.         echo "执行失败!";  
  55.   
  56.     }  
  57.   
  58. 二:预处理语句UPDATE  
  59.   
  60. try {  
  61.         $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb""root""123456");  
  62.     }catch(PDOException $e){  
  63.         echo $e->getMessage();  
  64.     }  
  65.       
  66.     /* pdo中有两种占位符号 
  67.      *   
  68.      *  ? 参数             --- 索引数组, 按索引顺序使用 
  69.      *  名字参数           ----关联数组, 按名称使用,和顺序无关 
  70.      */  
  71.       
  72.     //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来  
  73.     //$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行  
  74.       
  75.     //update和insert一样  
  76.     $stmt=$pdo->prepare("update shop set name=:name,num=:num,price=:price,desn=:desn where id=:id"); //所有SQL都可执行  
  77.       
  78.       
  79.     //绑定名字参数   顺序可以不一致和名字对应即可  
  80.     $stmt->bindParam(":name"$name);  
  81.     $stmt->bindParam(":num"$num);  
  82.     $stmt->bindParam(":desn"$desn);  
  83.     $stmt->bindParam(":price"$p);//变量名字随便写  
  84.     $stmt->bindParam(":id"$id);  
  85.    
  86.   
  87.   
  88.     $name="nnn";  
  89.     $num=101;  
  90.     $desn="hello1";  
  91.     $p=34.51;  
  92.     $id=108;  
  93.   
  94.     if($stmt->execute()){  
  95.         echo "执行成功";  
  96.         //echo "最后插入的ID:".$pdo->lastInsertId();  
  97.     }else{  
  98.         echo "执行失败!";  
  99.     }  
  100.       
  101.     //接着传值执行第二次-----N次,这就是PDO预处理,只会编译一次SQL,其他想执行传值就可以  
  102.     $name="mmm";  
  103.     $num=101;  
  104.     $desn="hello1";  
  105.     $p=34.51;  
  106.     $id=109;  
  107.   
  108.     if($stmt->execute()){  
  109.         echo "执行成功";  
  110.     }else{  
  111.         echo "执行失败!";  
  112.     }  
  113.   
  114. 三:预处理插入多条  
  115.   
  116. try {  
  117.         $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb""root""123456");  
  118.     }catch(PDOException $e){  
  119.         echo $e->getMessage();  
  120.     }  
  121.       
  122.     /* pdo中有两种占位符号 
  123.      *   
  124.      *  ? 参数             --- 索引数组, 按索引顺序使用 
  125.      *  名子参数           ----关联数组, 按名称使用,和顺序无关 
  126.      */  
  127.       
  128.     $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行--syi===  
  129.       
  130.     //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来  
  131. //    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");  
  132.       
  133.     //绑定参数  
  134. /*    $stmt->bindParam(":name", $name); 
  135.     $stmt->bindParam(":num", $num); 
  136.     $stmt->bindParam(":desn", $desn); 
  137.     $stmt->bindParam(":price", $p); 
  138.  */  
  139.     //绑定参数  
  140.     $stmt->bindParam(1, $name, PDO::PARAM_STR);  
  141.     $stmt->bindParam(3, $num, PDO::PARAM_INT);  
  142.     $stmt->bindParam(4, $desn, PDO::PARAM_STR);  
  143.     $stmt->bindParam(2, $p, PDO::PARAM_STR);  
  144.   
  145.     $name="wwww1";  
  146.     $num=101;  
  147.     $desn="hello1";  
  148.     $p=34.51;  
  149.   
  150.     if($stmt->execute()){  
  151.         echo "执行成功";  
  152.         echo "最后插入的ID:".$pdo->lastInsertId();  
  153.     }else{  
  154.         echo "执行失败!";  
  155.     }  
  156.   
  157.   
  158.     $name="ooo";  
  159.     $num=101;  
  160.     $desn="hello1";  
  161.     $p=34.51;  
  162.   
  163.     if($stmt->execute()){  
  164.         echo "执行成功";  
  165.         echo "最后插入的ID:".$pdo->lastInsertId();  
  166.     }else{  
  167.         echo "执行失败!";  
  168.     }  
  169.   
  170.   
  171.     四:不绑定参数,直接execute中带值执行sql  
  172.   
  173.     try {  
  174.         $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb""root""123456");  
  175.     }catch(PDOException $e){  
  176.         echo $e->getMessage();  
  177.     }  
  178.       
  179.     /* pdo中有两种占位符号 
  180.      *   
  181.      *  ? 参数             --- 索引数组, 按索引顺序使用 
  182.      *  名子参数           ----关联数组, 按名称使用,和顺序无关 
  183.      */  
  184.   
  185.   
  186.       
  187.     //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来  
  188.     $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");  
  189.       
  190.     //    $stmt->execute($_POST);  
  191.     //传值是可以不按顺序--这是名字参数  
  192.     $stmt->execute(array(":price"=>99, ":name"=>"kkk1"":num"=>"451"":desn"=>"aaaaaa1"));  
  193.     $stmt->execute(array(":price"=>88, ":name"=>"kkk2"":num"=>"452"":desn"=>"aaaaaa2"));  
  194.     $stmt->execute(array(":price"=>77, ":name"=>"kkk3"":num"=>"453"":desn"=>"aaaaaa3"));  
  195.   
  196.   
  197. 五:获取结果集  
  198.   
  199. try {  
  200.         $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb""root""123456");  
  201.     }catch(PDOException $e){  
  202.         echo $e->getMessage();  
  203.     }  
  204.       
  205.     //获取结果   fetch()取一条--返回的是关联和索引数组一起返回  
  206.     //获取结果   fetchAll();  得到得是二维数组  
  207.       
  208.     $stmt=$pdo->prepare("select id, name, price, num, desn from shops where id > :id order by id");  
  209.   
  210.     $stmt->execute(array(":id"=>100));   //如果预SQL没有参数时,execute也不用带参数 直接问执行就可以  
  211.       
  212.     $stmt->setFetchMode(PDO::FETCH_ASSOC);//设置所有的获取模式,全部是关联数组,下面就不用改啦,也可以卸载fetch里面(PDO::FETCH_ASSOC),不写就是默认的类型关联和索引都返回  
  213. /* 
  214.     while($row=$stmt->fetch()){//获取所有查出来的值  循环 
  215.         print_r($row); 
  216.         echo '<br>'; 
  217.     } 
  218.  */  
  219.   /* 
  220.     $row=$stmt->fetch(PDO::FETCH_ASSOC);获取关联数组 
  221.     $row=$stmt->fetch(PDO::FETCH_NUM);  获取索引数组 
  222.     $row=$stmt->fetch(PDO::FETCH_BOTH); 关联和索引都返回--默认就是这个 
  223.     print_r($row); 
  224.   */  
  225.     $data=$stmt->fetchAll(PDO::FETCH_ASSOC); //同上,也可以直接$stmt->setFetchMode(PDO::FETCH_ASSOC);这么设置  
  226.   
  227.     echo '<pre>';  
  228.     print_r($data);  
  229.     echo '</pre>';</span>