最适合网络开发者的网站

PHP 教程

PHP 主页 PHP 简介 PHP 安装 PHP 语法 PHP 注释 PHP 变量 PHP 回显/打印 PHP 数据类型 PHP 字符串 PHP 数字 PHP 数学 PHP 常量 PHP 运算符 PHP 如果...否则...Elseif PHP 开关 PHP 循环 PHP 函数 PHP 数组 PHP 超全局变量 PHP 正则表达式

PHP 形式

PHP 表单处理 PHP 表单验证 需要 PHP 表单 PHP 表单 URL/电子邮件 PHP 表单完成

PHP 先进的

PHP 日期和时间 PHP 包含 PHP 文件处理 PHP 文件打开/读取 PHP 文件创建/写入 PHP文件上传 PHP 饼干 PHP 会话 PHP 过滤器 PHP 过滤器高级 PHP 回调函数 PHP 的 JSON PHP 异常

PHP 面向对象

PHP 什么是OOP PHP 类/对象 PHP 构造函数 PHP 析构函数 PHP 访问修饰符 PHP 继承 PHP 常量 PHP 抽象类 PHP 接口 PHP 特征 PHP 静态方法 PHP 静态属性 PHP 命名空间 PHP 可迭代对象

MySQL 数据库

MySQL 数据库 MySQL 连接 MySQL 创建数据库 MySQL 创建表 MySQL 插入数据 MySQL 获取最后一个 ID MySQL 插入多个 MySQL 已准备 MySQL 选择数据 MySQL 哪里 MySQL 排序依据 MySQL 删除数据 MySQL 更新数据 MySQL 限制数据

PHP XML

PHP XML 解析器 PHP SimpleXML 解析器 PHP SimpleXML - 获取 PHP XML 扩展 PHP XML DOM

PHP - 阿贾克斯

AJAX 简介 AJAX PHP AJAX 数据库 AJAX XML AJAX实时搜索 AJAX 民意调查

PHP 例子

PHP 示例 PHP 编译器 PHP 测验 PHP 练习 PHP 证书

PHP 参考

PHP 概述 PHP 数组 PHP 日历 PHP 日期 PHP 目录 PHP 错误 PHP 异常 PHP 文件系统 PHP 过滤器 PHP FTP PHP 的 JSON PHP 关键字 PHP 库 PHP 邮件 PHP 数学 PHP 杂项 PHP MySQLi PHP 网络 PHP 输出控件 PHP 正则表达式 PHP 简单 XML PHP 流 PHP 字符串 PHP 变量处理 PHP XML解析器 PHP 压缩文件 PHP 时区

PHP。初学者课程

尿素

PHP MySQL 准备语句


准备好的语句对于防御 SQL 注入非常有用。


准备好的语句和绑定参数

准备好的语句是一种用于高效地重复执行相同(或相似)的SQL语句的功能。

准备好的语句基本上是这样工作的:

  1. 准备:创建 SQL 语句模板并将其发送到数据库。某些值未指定,称为参数(标记为“?”)。示例:INSERT INTO MyGuests VALUES(?, ?, ?)
  2. 数据库对SQL语句模板进行解析、编译、查询优化,并将结果存储起来而不执行
  3. 执行:稍后,应用程序将值绑定到参数,然后数据库执行该语句。应用程序可以使用不同的值多次执行该语句

与直接执行 SQL 语句相比,准备好的语句有三个主要优点:

  • 准备好的语句减少了解析时间,因为查询的准备只进行一次(尽管语句执行多次)
  • 绑定参数可最大限度地减少服务器的带宽,因为您每次只需发送参数,而不是整个查询
  • 准备好的语句对于防范 SQL 注入非常有用,因为稍后使用不同协议传输的参数值不需要正确转义。如果原始语句模板不是从外部输入派生的,则不会发生 SQL 注入。

MySQLi 中的准备好的语句

以下示例使用 MySQLi 中的准备好的语句和绑定参数:

示例(带有准备好的语句的 MySQLi)

<?php
$服务器名称 = “本地主机”;
$用户名 = “用户名”;
$password = "密码";
$数据库名称 = “myDB”;

// 创建连接
$conn = new mysqli($服务器名称,$用户名,$密码,$数据库名称);

// 检查连接
如果 ($conn-&gt;connect_error) {
die("连接失败: " . $conn-&gt;connect_error);
}

// 准备并绑定
$stmt = $conn-&gt;prepare("插入 MyGuests (firstname, lastname, email) 值 (?, ?, ?)");
$stmt-&gt;bind_param("sss", $firstname, $lastname, $email);

//设置参数并执行
$firstname =“约翰”;
$lastname =“Doe”;
$email = "john@example.com";
$stmt-&gt;执行();

$firstname =“玛丽”;
$lastname =“Moe”;
$email = "mary@example.com";
$stmt-&gt;执行();

$firstname =“朱莉”;
$lastname =“Dooley”;
$email = "julie@example.com";
$stmt-&gt;执行();

echo "新记录创建成功";

$stmt-&gt;关闭();
$conn-&gt;关闭();
?>

从上面的例子中解释代码行:

“插入 MyGuests(名字,姓氏,电子邮件)值(?,?,?)”

在我们的 SQL 中,我们在想要替换整数、字符串、双精度或 blob 值的地方插入一个问号(?)。

然后,看一下bind_param()函数:

$stmt-&gt;bind_param("sss", $firstname, $lastname, $email);

此函数将参数绑定到 SQL 查询,并告诉数据库参数是什么。“sss”参数列出了参数的数据类型。s 字符告诉 mysql 该参数是一个字符串。

该论点可能是以下四种类型之一:

  • i - 整数
  • d - 双倍
  • s - 字符串
  • b——BLOB

对于每个参数,我们必须有其中之一。

通过告诉 mysql 预期什么类型的数据,我们可以最大限度地降低 SQL 注入的风险。

笔记: 如果我们想从外部来源插入任何数据(如用户输入),那么对数据进行清理和验证非常重要。


PDO 中的准备好的语句

以下示例在 PDO 中使用准备好的语句和绑定参数:

示例(带有准备好的语句的 PDO)

<?php
$服务器名称 = “本地主机”;
$用户名 = “用户名”;
$password = "密码";
$dbname =“myDBPDO”;

尝试 {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 将 PDO 错误模式设置为异常
$conn-&gt;设置属性(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

// 准备sql并绑定参数
$stmt = $conn-&gt;prepare("插入 MyGuests (名字, 姓氏, 电子邮件)
值(:firstname,:lastname,:email)”);
$stmt-&gt;bindParam(':firstname', $firstname);
$stmt-&gt;bindParam(':lastname', $lastname);
$stmt-&gt;bindParam(':email', $email);

// 插入一行
$firstname =“约翰”;
$lastname =“Doe”;
$email = "john@example.com";
$stmt-&gt;执行();

// 插入另一行
$firstname =“玛丽”;
$lastname =“Moe”;
$email = "mary@example.com";
$stmt-&gt;执行();

// 插入另一行
$firstname =“朱莉”;
$lastname =“Dooley”;
$email = "julie@example.com";
$stmt-&gt;执行();

echo "新记录创建成功";
} 捕获(PDOException $e){
echo "错误: " . $e-&gt;getMessage();
}
$conn = 空;
?>