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 fsockopen写的HTTP下载的类
Feb 22 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
PHPThumb图片处理实例
May 03 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
PHP类的封装与继承详解
Sep 29 PHP
关于php中一些字符串总结
May 05 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
PHP中include和require的区别实例分析
May 07 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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
超级简单的发送邮件程序
2006/10/09 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
js DOM的事件常见操作实例详解
2019/12/16 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
python实现数据分析与建模
2019/07/11 Python
python多线程分块读取文件
2019/08/29 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
Python无损压缩图片的示例代码
2020/08/06 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
医院合作意向书范本
2015/05/08 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL