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 相关文章推荐
我的论坛源代码(七)
Oct 09 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 PHP
laravel-admin 中列表筛选方法
Oct 03 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
德生PL550的电路分析
2021/03/02 无线电
PHP教程 预定义变量
2009/10/23 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
php实现源代码加密的方法
2015/07/11 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP实现小偷程序实例
2016/10/31 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
微信小程序日历效果
2018/12/29 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python之父谈Python的未来形式
2016/07/01 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
自荐书4要点
2014/01/25 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
钱学森电影观后感
2015/06/04 职场文书