MySQL预处理语句
2023-06-13 09:14:07 时间
前言
SQL语句的执行处理,分为即时语句和预处理语句。
即时语句,顾名思义,一条SQL语句直接是走流程处理,一次编译,单次运行,此类普通语句被称作Immediate Statements
(即时语句)。
预处理语句(Prepared Statements
,也称为参数化语句)只是一个SQL查询模板,其中包含占位符而不是实际参数值。在执行语句时,这些占位符将被实际值替换。预处理语句用于执行多个相同的SQL语句,并且执行效率更高。
预处理语句能够有效地防御MySQL注入。
工作原理
相比于直接执行SQL语句,预处理语句有如下优势:
- 预处理语句大大减少了分析时间。一个预处理语句可以高效地重复执行同一条语句,因为该语句仅被再次解析一次。
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
- 使用不同的协议将参数值与查询分开发送到数据库服务器,保证了数据的合法性,有效地防范了SQL注入。因此预处理语句被认为是数据库安全性中最关键的元素之一。
预处理
创建SQL语句模板并发送到数据库。预留的值使用参数?
标记 。
例如:
INSERT INTO grade (id, name, phonenum, grades) VALUES(?, ?, ?, ?)
数据库解析
服务端数据库解析,编译并对SQL语句模板执行查询优化和语法检查,并将其存储以备后用。
执行
执行阶段,参数值将发送到服务器,将绑定的值传递给参数(?
标记)。服务端数据库将语句模板和这些值合成一个语句然后执行它。
PHP实现(Demo)
index.html
文件如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form action="db.php" method="get">
学号:<input type="num" name="id"><br>
姓名:<input type="string" name="name"><br>
电话:<input type="string" name="phonenum"><br>
成绩:<input type="num" name="grades"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
db.php
文件如下:
<?php
// 自己的数据库信息
$servername = "localhost";
$username = "yourname";
$password = "yourpassword";
$dbname = "youdb";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 预处理及绑定
$stmt = $conn->prepare("INSERT INTO grade (id, name, phonenum, grades) VALUES(?, ?, ?, ?)");
$stmt->bind_param("issi", $id, $name, $phonenum, $grades);
// 设置参数并执行
if (isset($_GET['id'])&&isset($_GET['name'])&&isset($_GET['phonenum'])&&isset($_GET['grades'])) {
$id = $_GET['id'];
$name = $_GET['name'];
$phonenum = $_GET['phonenum'];
$grades = $_GET['grades'];
$stmt->execute();
echo "数据插入成功";
}
$stmt->close();
$conn->close();
?>
输入数据,点击提交。
查看数据库,发现插入成功。
代码解析
在SQL语句中,我们使用了问号?
,在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔型。
$stmt = $conn->prepare("INSERT INTO grade (id, name, phonenum, grades) VALUES(?, ?, ?, ?)");
bind_param()
函数。该函数绑定了SQL
的参数,且告诉数据库参数的值。issi
参数列处理其余参数的数据类型。s
字符告诉数据库该参数为字符串,i
字符告诉数据库该参数为整型。后面的每个参数都需要为其指定类型。
参数可以为以下四种类型:
- i - integer(整型)
- d - double(双精度浮点型)
- s - string(字符串)
- b - BLOB(Binary Large Object:二进制大对象)
$stmt->bind_param("issi", $id, $name, $phonenum, $grades);
将用户通过GET
方式传入的数据设为参数,然后execute()
执行语句。
$id = $_GET['id'];
$name = $_GET['name'];
$phonenum = $_GET['phonenum'];
$grades = $_GET['grades'];
$stmt->execute();
相关文章
- MySQL语句执行迅速!(执行mysql语句)
- MySQL外键约束:编写完美的SQL语句(mysql外键约束怎么写)
- MySQL汉化版:免费下载、优质使用体验(mysql汉化版下载)
- MySQL中使用编辑语句快速完成操作(mysql编辑语句)
- MySQL添加字段的简单操作方法(mysql加字段语句)
- MySQL教程:知乎上的深入学习(mysql教程知乎)
- MySQL中使用Delete语句删除数据(mysql中删除语句)
- 优化MySQL库表优化:加快数据库性能运行(mysql库表)
- MySQL实现多字段同时更新(mysql多字段更新)
- MySQL事务中的锁机制(mysql锁事务)
- 数据MySQL Bin: Efficiently Deleting Data(mysqlbin删除)
- 优化MySQL中大数据表的优化技巧(mysql大数据表)
- 如何在MySQL中保留两位小数?(mysql去小数点后两位)
- 使用MySQL查询语句进行模糊搜索:了解如何使用LIKE操作符快速检索数据库中的数据。(mysql查询like)
- 如何使用MySQL存储过程生成自动化的数据处理流程?(mysql存储过程生成)
- Mysql在处理数据方面,能够适应多大的数据量?(mysql适合多大数据量)
- MySQL语句考验,挑战你的SQL能力!(mysql语句考试)
- MySQL高性能之路:提高并发连接数(mysql 并发 连接数)
- MySQL修改列名简洁明了的语句(mysql中修改列名语句)
- 如何在MySQL中保留小数(mysql中保留小数)
- MySQL中Choose语句优化你的查询操作(mysql中choose)
- 使用MySQL计算一组数据的差值(mysql一组数据 差值)
- 解析MySQL语句的重要性mysqlparse(mysql_parse)
- 如何使用MySQL查询不包含某些ID的数据(mysql不包含某些id)
- MySQL三表联查查询语句详解(mysql三表连查语句)