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数据缓存的使用说明
May 10 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
PHP随机生成唯一HASH值自定义函数
Apr 20 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
php变量与字符串的增删改查操作示例
May 07 PHP
PHP http请求超时问题解决方案
Nov 13 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购物车代码
2020/06/05 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python+pyqt5编写md5生成器
2019/03/18 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
Python常用外部指令执行代码实例
2020/11/05 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
英文导游欢迎词
2014/01/11 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
转预备党员政审材料
2014/02/06 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
校长新学期致辞
2015/07/30 职场文书
初中班干部工作总结
2015/08/10 职场文书
python not运算符的实例用法
2021/06/30 Python
gateway网关接口请求的校验方式
2021/07/15 Java/Android