PHP简单实现防止SQL注入的方法


Posted in PHP onMarch 13, 2018

本文实例讲述了PHP简单实现防止SQL注入的方法。分享给大家供大家参考,具体如下:

方法一:execute代入参数

<?php
if(count($_POST)!= 0) {
  $host = 'aaa';
  $database = 'bbb';
  $username = 'ccc';
  $password = '***';
  $num = 0;
  $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  foreach ($_POST as $var_Key => $var_Value) {
    //获取POST数组最大值
    $num = $num + 1;
  }
  //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  for($i=0;$i<$num;$i=$i+2)
  {
    //库存下标
    $j = $i+1;
    //判断传递过来的数据合法性
    if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
      //禁用prepared statements的仿真效果
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      //查询数据库中是否存在该ID的商品
      //当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据
      $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
      //当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
      $stmt->execute(array($_POST[$i]));
      //返回查询结果
      $count = $stmt->rowCount();
      //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
      if($count != 0)
      {
        $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
        $stmt->execute(array($_POST[$j], $_POST[$i]));
      }
      //如果本地数据库没有该商品ID和库存记录,就新增该条记录
      if($count == 0)
      {
        $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
        $stmt->execute(array($_POST[$i], $_POST[$j]));
      }
    }
  }
  $pdo = null;
  //关闭连接
}
?>

方法二:bindParam绑定参数

<?php
if(count($_POST)!= 0) {
  $host = 'aaa';
  $database = 'bbb';
  $username = 'ccc';
  $password = '***';
  $num = 0;
  $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  foreach ($_POST as $var_Key => $var_Value) {
    //获取POST数组最大值
    $num = $num + 1;
  }
  //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  for($i=0;$i<$num;$i=$i+2)
  {
    //库存下标
    $j = $i+1;
    //判断传递过来的数据合法性(此数据为商品编号以及库存,严格来说字符串全是由数字组成的)
    if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
      //查询数据库中是否存在该ID的商品
      $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
      $stmt->execute(array($_POST[$i]));
      $stmt->bindParam(1,$_POST[$i]);
      $stmt->execute();
      //返回查询结果
      $count = $stmt->rowCount();
      //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
      if($count != 0)
      {
        $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
        $stmt->execute(array($_POST[$j], $_POST[$i]));
        $stmt->bindParam(1,$_POST[$j]);
        $stmt->bindParam(2,$_POST[$i]);
        $stmt->execute();
      }
      //如果本地数据库没有该商品ID和库存记录,就新增该条记录
      if($count == 0)
      {
        $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
        $stmt->bindParam(1,$_POST[$i]);
        $stmt->bindParam(2,$_POST[$j]);
        $stmt->execute();
      }
    }
  }
  $pdo = null;
  //关闭连接
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
php 短链接算法收集与分析
Dec 30 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
php输出xml必须header的解决方法
Oct 17 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 #PHP
PHP实现的简单路由和类自动加载功能
Mar 13 #PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 #PHP
php把字符串指定字符分割成数组的方法
Mar 12 #PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 #PHP
php取出数组单个值的方法
Mar 12 #PHP
php合并数组并保留键值的实现方法
Mar 12 #PHP
You might like
php实现水仙花数示例分享
2014/04/03 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python异常处理总结
2014/08/15 Python
Python Queue模块详解
2014/11/30 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
python 对象和json互相转换方法
2018/03/22 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
python爬虫用mongodb的理由
2020/07/28 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
财务总监管理职责范文
2014/03/09 职场文书
高考备战决心书
2014/03/11 职场文书
审计专业自荐信范文
2014/04/21 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技