前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL预处理语句

MySQL预处理语句

作者头像
Andromeda
发布2022-10-27 14:48:05
1.6K0
发布2022-10-27 14:48:05
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏

前言

SQL语句的执行处理,分为即时语句预处理语句

即时语句,顾名思义,一条SQL语句直接是走流程处理,一次编译,单次运行,此类普通语句被称作Immediate Statements(即时语句)。

预处理语句(Prepared Statements,也称为参数化语句)只是一个SQL查询模板,其中包含占位符而不是实际参数值。在执行语句时,这些占位符将被实际值替换。预处理语句用于执行多个相同的SQL语句,并且执行效率更高。

预处理语句能够有效地防御MySQL注入

工作原理

相比于直接执行SQL语句,预处理语句有如下优势:

  • 预处理语句大大减少了分析时间。一个预处理语句可以高效地重复执行同一条语句,因为该语句仅被再次解析一次。
  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
  • 使用不同的协议将参数值与查询分开发送到数据库服务器,保证了数据的合法性,有效地防范了SQL注入。因此预处理语句被认为是数据库安全性中最关键的元素之一。

预处理

创建SQL语句模板并发送到数据库。预留的值使用参数?标记 。

例如:

代码语言:javascript
复制
INSERT INTO grade (id, name, phonenum, grades) VALUES(?, ?, ?, ?)

数据库解析

服务端数据库解析,编译并对SQL语句模板执行查询优化和语法检查,并将其存储以备后用。

执行

执行阶段,参数值将发送到服务器,将绑定的值传递给参数(?标记)。服务端数据库将语句模板和这些值合成一个语句然后执行它。

PHP实现(Demo)

index.html文件如下:

代码语言:javascript
复制
<!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文件如下:

代码语言:javascript
复制
<?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语句中,我们使用了问号?,在此我们可以将问号替换为整型字符串双精度浮点型布尔型

代码语言:javascript
复制
$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:二进制大对象
代码语言:javascript
复制
$stmt->bind_param("issi", $id, $name, $phonenum, $grades);

将用户通过GET方式传入的数据设为参数,然后execute()执行语句。

代码语言:javascript
复制
$id = $_GET['id'];
$name = $_GET['name'];
$phonenum = $_GET['phonenum'];
$grades = $_GET['grades'];
$stmt->execute();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 工作原理
    • 预处理
      • 数据库解析
        • 执行
        • PHP实现(Demo)
          • 代码解析
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档