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 相关文章推荐
截获网站title标签之家内容的例子
Oct 09 PHP
怎样才能成为PHP高手?学会“懒惰”的编程
Dec 05 PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
PHP4中session登录页面的应用
Jul 25 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
php 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
PHP预定义接口――Iterator用法示例
Jun 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
提升PHP速度全攻略
2006/10/09 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python使用KNN算法手写体识别
2018/02/01 Python
Python切片工具pillow用法示例
2018/03/30 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python命令 -u参数用法解析
2019/10/24 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
Django多数据库联用实现方法解析
2020/11/12 Python
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
大学生志愿者感言
2014/01/15 职场文书
资料员岗位职责
2015/02/10 职场文书
MySQL优化及索引解析
2022/03/17 MySQL
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis