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模拟SQL Server的两个日期处理函数
Oct 09 PHP
mysql 全文搜索 技巧
Apr 27 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
php分页函数示例代码分享
Feb 24 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
PHP写日志的实现方法
Nov 05 PHP
php短址转换实现方法
Feb 25 PHP
PHP自定义错误用法示例
Sep 28 PHP
php进行md5加密简单实例方法
Sep 19 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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冒泡排序算法的深入理解
2013/06/09 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
动手学习无线电
2021/03/10 无线电
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
python3实现弹弹球小游戏
2019/11/25 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
Python实现微信表情包炸群功能
2021/01/28 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
上班离岗检讨书
2014/01/27 职场文书
装修设计师求职信
2014/02/26 职场文书
保密承诺书范文
2014/03/27 职场文书
心理健康活动总结
2014/04/30 职场文书
村党支部书记承诺书
2014/05/29 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
工程技术员岗位职责
2015/04/11 职场文书
毕业论文致谢信
2015/05/14 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL
zabbix配置nginx监控的实现
2022/05/25 Servers