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安全配置 如何配置使其更安全
Dec 16 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP队列用法实例
Nov 05 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
学习php设计模式 php实现备忘录模式(Memento)
Dec 09 PHP
Yii框架上传图片用法总结
Mar 28 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
详解Go与PHP的语法对比
May 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分页时出现的Fatal error的解决方法
2011/04/18 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
分页栏的web标准实现
2011/11/01 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
JavaScript手机振动API
2016/06/11 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python入门篇之面向对象
2014/10/20 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
django+echart数据动态显示的例子
2019/08/12 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
应届生保险求职信
2013/11/11 职场文书
产品售后服务承诺书
2014/05/21 职场文书
2015年酒店工作总结
2015/04/28 职场文书
纪录片信仰观后感
2015/06/08 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
德劲DE1108畅想
2021/04/22 无线电