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 文件上传源码分析(RFC1867)
Oct 30 PHP
php session和cookie使用说明
Apr 07 PHP
php中全局变量global的使用演示代码
May 18 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
PHP微信分享开发详解
Jan 14 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 PHP
php中数组最简单的使用方法
Dec 27 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 采集获取指定网址的内容
2010/01/05 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
Python logging模块handlers用法详解
2020/08/14 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
Yahoo-PHP面试题4
2012/05/05 面试题
入党自我鉴定范文
2013/10/04 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
诉讼授权委托书
2014/10/15 职场文书
公司员工辞职信范文
2015/05/12 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
vue首次渲染全过程
2021/04/21 Vue.js