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 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
在windows iis5下安装php4.0+mysql之我见
Oct 09 PHP
开发大型 PHP 项目的方法
Jan 02 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php命名空间学习详解
Feb 27 PHP
php中删除、清空session的方式总结
Oct 09 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 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
德生PL330测评
2021/03/02 无线电
PHP学习笔记之数组篇
2011/06/28 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
浅谈js闭包理解
2019/04/01 Javascript
vue实现图片上传功能
2020/05/28 Javascript
Python实现建立SSH连接的方法
2015/06/03 Python
python开发之list操作实例分析
2016/02/22 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
基于python实现简单日历
2018/07/28 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
党委书记岗位职责
2013/11/24 职场文书
创业计划书的内容步骤和要领
2014/01/04 职场文书
社区食品安全实施方案
2014/03/28 职场文书
公司放假通知范文
2015/04/14 职场文书
学校党员干部承诺书
2015/05/04 职场文书
亮剑精神观后感
2015/06/05 职场文书
走进科学观后感
2015/06/18 职场文书
校运会加油稿大全
2015/07/22 职场文书
2016年教师节感言
2015/12/09 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL