php_pdo 预处理语句详解


Posted in PHP onNovember 21, 2016

这篇文章主要介绍的是关于php_pdo 预处理语句,下面话不多说,我们来看看详细的内容。

一、预处理语句可以带来两大好处:

1、查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化
执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大
大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因
而运行得更快。

2、提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会
发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

二、预处理实例:

<?php

//?号式的预处理语句 一共有3种绑定方式
//1.连接数据库 
try{
  $pdo = new PDO("mysql:host=localhost;dbname=jikexueyuan","root","");
}catch(PDOException $e){
  die("数据库连接失败".$e->getMessage());
}

//2.预处理的SQL语句
$sql = "insert into stu(id,name,sex,age) values(?,?,?,?)";
$stmt = $pdo->prepare($sql);

//3.对?号的参数绑定
//(第一种绑定方式)

/* $stmt->bindValue(1,null);
$stmt->bindValue(2,'test55');
$stmt->bindValue(3,'w');
$stmt->bindValue(4,22); */

//第二种绑定方式
/* $stmt->bindParam(1,$id);
$stmt->bindParam(2,$name);
$stmt->bindParam(3,$sex);
$stmt->bindParam(4,$age);
$id=null;
$name="test66";
$sex="m";
$age=33; */

//第三种绑定方式
//$stmt->execute(array(null,'test77','22',55)); 
//4.执行

$stmt->execute(array(null,'test77','22',55));

echo $stmt->rowCount();
<?php

//别名式号式的预处理语句 一共有3种绑定方式
//1.连接数据库 
try{
  $pdo = new PDO("mysql:host=localhost;dbname=jikexueyuan","root","");
}catch(PDOException $e){
  die("数据库连接失败".$e->getMessage());
}

//2.预处理的SQL语句
$sql = "insert into stu(id,name,sex,age) values(:id,:name,:sex,:age)";
$stmt = $pdo->prepare($sql);

//3.对?号的参数绑定
//(第一种绑定方式)
/* $stmt->bindValue("id",null);
$stmt->bindValue("name",'ceshi1');
$stmt->bindValue("sex",'w');
$stmt->bindValue("age",22); */

//第二种绑定方式
/* $stmt->bindParam("id",$id);
$stmt->bindParam("name",$name);
$stmt->bindParam("sex",$sex);
$stmt->bindParam("age",$age);
$id=null;
$name="ceshi2";
$sex="m";
$age=33; */

//第三种绑定方式
//$stmt->execute(array(null,'test77','22',55)); 
//4.执行

$stmt->execute(array("id"=>null,"name"=>"ceshi3","sex"=>"w","age"=>66));

echo $stmt->rowCount();
<?php

//采用预处理SQL执行查询,并采用绑定结果方式输出
//1.连接数据库 
try{
  $pdo = new PDO("mysql:host=localhost;dbname=jikexueyuan","root","");
}catch(PDOException $e){
  die("数据库连接失败".$e->getMessage());
}

//2.预处理的SQL语句
$sql = "select id,name,sex,age from stu";
$stmt = $pdo->prepare($sql);
//3.执行
$stmt->execute();

$stmt->bindColumn(1,$id);
$stmt->bindColumn(2,$name);
$stmt->bindColumn("sex",$sex);
$stmt->bindColumn("age",$age);

while($row=$stmt->fetch(PDO::FETCH_COLUMN)){
  echo "{$id}:{$name}:{$sex}:{$age}<br>";
}
/* foreach($stmt as $row){
  echo $row['id']."--------".$row['name']."<br>";
}
 */

最佳方式:

//1.连接数据库 
try{
  $pdo = new PDO("mysql:host=localhost;dbname=jikexueyuan","root","");
}catch(PDOException $e){
  die("数据库连接失败".$e->getMessage());
}

//2.预处理的SQL语句
$sql = 'select catid,catname,catdir from cy_category where parentid = :parentid';
$stmt = $pdo->prepare($sql);
$params = array(
  'parentid' => $subcatid
);
$stmt->execute($params); 
//$row = $stm->fetchAll(PDO::FETCH_ASSOC);
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
  var_dump($row);
  echo "<br>";
}

预处理批量操作实例:

<?php
//用预处理语句进行重复插入
//下面例子通过用 name 和 value 替代相应的命名占位符来执行一个插入查询
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();

// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

//用预处理语句进行重复插入
//下面例子通过用 name 和 value 取代 ? 占位符的位置来执行一条插入查询。
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();

// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

//使用预处理语句获取数据
//下面例子获取数据基于键值已提供的形式。用户的输入被自动用引号括起来,因此不会有 SQL 注入攻击的危险。
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
 while ($row = $stmt->fetch()) {
  print_r($row);
 }
}
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用php能有所帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
dede全站URL静态化改造[070414更正]
Apr 17 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
php UBB 解析实现代码
Nov 27 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
php学习笔记之面向对象
Nov 08 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PHP生成图表pChart的示例解析
Jul 31 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 PHP
CI框架表单验证实例详解
Nov 21 #PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 #PHP
静态html文件执行php语句的方法(推荐)
Nov 21 #PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 #PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 #PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 #PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 #PHP
You might like
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
两种php实现图片上传的方法
2016/01/22 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
微信小程序动态添加分享数据
2017/06/14 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python中input和raw_input的一点区别
2014/10/21 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
keras 权重保存和权重载入方式
2020/05/21 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
python math模块的基本使用教程
2021/01/16 Python
10个顶级Python实用库推荐
2021/03/04 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
事业单位请假制度
2014/01/13 职场文书
酒店个人求职信范文
2014/01/25 职场文书
优质服务活动实施方案
2014/05/02 职场文书
大学新闻系自荐书
2014/05/31 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
网络研修随笔感言
2015/11/18 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang