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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
PHP获取当前文件的父目录方法汇总
Jul 21 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP时间处理类操作示例
Sep 05 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
实用函数2
2007/11/08 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
javascript preload&amp;lazy load
2010/05/13 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
linux面试相关问题
2012/08/11 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
计算机应用专业毕业生求职信
2013/10/24 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
论文答谢词
2015/01/20 职场文书
办公室岗位职责
2015/02/04 职场文书
五一晚会主持词
2015/07/01 职场文书
运动会通讯稿300字
2015/07/20 职场文书
担保书怎么写 ?
2019/04/22 职场文书
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL