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 相关文章推荐
php中通过curl smtp发送邮件
Jun 05 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
cakephp常见知识点汇总
Feb 24 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
php 文件上传至OSS及删除远程阿里云OSS文件
Jul 04 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
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
PHP输出时间差函数代码
2013/01/28 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
详解Bootstrap插件
2016/04/25 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
浅谈django orm 优化
2018/08/18 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
用Python写一个自动木马程序
2019/09/17 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
大学生的应聘自我评价
2013/12/13 职场文书
合同专员岗位职责
2013/12/18 职场文书
自我鉴定书面格式
2014/01/13 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
关爱残疾人标语
2014/06/25 职场文书
党性教育心得体会
2014/09/03 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
婚育证明格式
2015/06/17 职场文书
解析目标检测之IoU
2021/06/26 Python
Vue.Draggable实现交换位置
2022/04/07 Vue.js