预处理语句对于防止 MySQL 注入是非常有用的。

预处理语句及绑定参数

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

预处理语句的工作原理如下:预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:

INSERT

INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比于直接执行SQL语句,预处理语句有两个主要优点:预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。

绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。

预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

MySQLi 预处理语句

以下实例在 MySQLi 中使用了预处理语句,并绑定了相应的参数:

实例 (MySQLi 使用预处理语句)

$servername = "localhost";

$username = "username";

$password =

"password";

$dbname =

"myDB";

// 创建连接

$conn = new mysqli($servername,

$username, $password, $dbname);

// 检测连接

if ($conn->connect_error)

{

die("连接失败: " . $conn->connect_error);

}

// 预处理及绑定

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)

VALUES(?, ?, ?)");

$stmt->bind_param("sss", $firstname, $lastname,

$email);

// 设置参数并执行

$firstname = "John";

$lastname

= "Doe";

$email = "john@example.com";

$stmt->execute();

$firstname

= "Mary";

$lastname = "Moe";

$email = "mary@example.com";

$stmt->execute();

$firstname = "Julie";

$lastname = "Dooley";

$email = "julie@example.com";

$stmt->execute();

echo "新记录插入成功";

$stmt->close();

$conn->close();

?>解析以下实例的每行代码:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。

接下来,让我们来看下 bind_param() 函数:

$stmt->bind_param("sss", $firstname, $lastname, $email);该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。

参数有以下四种类型:i - integer(整型)

d - double(双精度浮点型)

s -

string(字符串)

b - BLOB(binary large object:二进制大对象)

每个参数都需要指定类型。

通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。

PDO 中的预处理语句

以下实例我们在 PDO 中使用了预处理语句并绑定参数:

实例 (PDO 使用预处理语句)

$servername = "localhost";

$username = "username";

$password =

"password";

$dbname =

"myDBPDO";

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname",

$username, $password);

// 设置 PDO 错误模式为异常

$conn->setAttribute(PDO::ATTR_ERRMODE,

PDO::ERRMODE_EXCEPTION);

// 预处理 SQL 并绑定参数

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)

VALUES (:firstname, :lastname, :email)");

$stmt->bindParam(':firstname', $firstname);

$stmt->bindParam(':lastname',

$lastname);

$stmt->bindParam(':email', $email);

// 插入行

$firstname =

"John";

$lastname = "Doe";

$email = "john@example.com";

$stmt->execute();

// 插入其他行

$firstname = "Mary";

$lastname = "Moe";

$email = "mary@example.com";

$stmt->execute();

// 插入其他行

$firstname = "Julie";

$lastname = "Dooley";

$email = "julie@example.com";

$stmt->execute();

echo "新记录插入成功";

}

catch(PDOException $e)

{

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

php mysql预处理_PHP MySQL 预处理语句相关推荐

  1. php mysql mysql_set_charset()._PHP:MySQL函数mysql_set_charset()的用法

    mysql_set_charset (PHP 5 >= 5.2.3) mysql_set_charset - 设置客户端的字符集 本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除.应使用 ...

  2. php mysql 预处理_PHP MySQL 预处理语句

    PHP MySQL 预处理语句 在本教程中,您将学习如何使用PHP在MySQL中使用预处理语句. 预处理语句是什么 预处理语句(也称为参数化语句)只是一个SQL查询模板,其中包含占位符而不是实际参数值 ...

  3. php pdo mysql 预处理_php -- PDO预处理

    可以使用多种方式实现预处理:指的是在绑定数据进行执行的时候,可以有多种方式. 预处理语句中为变量 使用数组指定预处理变量 1.准备预处理语句(发送给服务器,让服务器准备预处理语句) PDOStatem ...

  4. mysql+基本代码_PHP+MySQL扎实基本功十句话_php

    2.写程序前看看怎么用error_reporting. 3.不懂就问本身没错,但你需要在那之前查查手册. 4.当然,你需要懂得使用手册.手册上找不到答案的时候,应该考虑下网络上的搜索引擎. 5.刚学会 ...

  5. php mysql 类型_php mysql bigint 类型

    在mysql里设置了字段类型是bigint的,20位 然后通过php读取数组出来,使用json_encode 在不同的环境下,有不同的表现 1.这个字段在json中是字符串类型的, 2.这个字段读取出 ...

  6. php与mysql列表_PHP+Mysql+jQuery实现的查询和列表框选择

    本篇文章主要介绍PHP+Mysql+jQuery实现的查询和列表框选择,感兴趣的朋友参考下,希望对大家有所帮助. 本文讲解如何通过ajax查询mysql数据,并将返回的数据显示在待选列表中,再通过选择 ...

  7. php如何对mysql加锁_PHP+MySQL高并发加锁事务处理问题解决方法

    本文实例讲述了PHP+MySQL高并发加锁事务处理问题解决方法.分享给大家供大家参考,具体如下: 1.背景: 现在有这样的需求,插入数据时,判断test表有无username为'mraz"的 ...

  8. php mysql 空值_PHP / MySQL插入空值

    这是一个使用准备好的语句确实可以省去您麻烦的示例. 在MySQL中,为了插入一个空值,您必须及时指定它INSERT或将字段留在外面,这需要附加的分支: INSERT INTO table2 (f1, ...

  9. php mysql n 转义,mysql转义字符_php mysql转义特殊字符函数

    摘要 腾兴网为您分享:php mysql转义特殊字符函数,中英翻译,小天才,完美root,听中国等软件知识,以及小苹果cf抽奖,宝贝,街兔电单车app,windows壁纸软件,自制表情包app,守卫剑 ...

最新文章

  1. JavaScript为unicode编码转换为中文
  2. 房间计费系统改造——数据库设计
  3. android studio怎样运行uniapp打包项目_uni app系列002:离线打包apk(2)
  4. 还在用Matplotlib? 又一可视化神器pyecharts登场
  5. python如何自定义函数_python如何自定义函数_后端开发
  6. 解决: Elements in iteration expect to have ‘v-bind:key‘ directives
  7. (王道408考研数据结构)第六章图-第二节1:图的存储结构(邻接矩阵、邻接表、十字链表和邻接多重表)
  8. python不用模块调用麦克风_python调用pyaudio使用麦克风录制wav声音文件的教程
  9. meteor 结合mysql_Meteor: 关于Template实例(instance)和数据(data)
  10. Gstreamer衬垫(pad)支持的媒体类型(三)
  11. VC6.0 2 VC2008 移植 中多字节字符集和Unicode之间的互换
  12. 游戏手柄延迟测试软件,六款免费网络延迟测试工具
  13. 最新Chrome插件开发 api 解析
  14. 51单片机最小系统板
  15. linux x99 测试,超频测试总结 - 技嘉X99 Phoenix SLI主板评测:综合素质爆表的主板 - 超能网...
  16. 操作系统—CPU调度与内存管理
  17. 华为HCNA路由与交换eNSP实战(3)缺省路由
  18. EulerOS 2.0 SP5 - 华为欧拉(CentOS 7 华为版)下载
  19. hdu 2224(dp)
  20. c语言中短整形字节,C语言中各种整型类型所占字节数

热门文章

  1. JQuery——选择器分类
  2. 《Linux嵌入式实时应用开发实战(原书第3版)》——1.6 资源
  3. “此文件来自其他计算机,可能被阻止以帮助保护该计算机” 教你win7解除阻止程序运行怎么操作...
  4. 将MongoDB服务加入随机启动
  5. 如何判断是否丢掉用户请求(转载)
  6. k-d tree算法的研究
  7. C# Trim 的使用
  8. Cisco路由器安全配置必用10条命令
  9. github创建静态页面_如何在10分钟内使用GitHub Pages创建免费的静态站点
  10. valve 的设计_向Valve Portal开发人员学习游戏设计原则