MySQL 的 C 语言接口

news2024/10/7 17:23:09

1. mysql_init

MYSQL *mysql_init(MYSQL *mysql);

mysql_init函数的作用:创建一个 MYSQL 对象(该对象用于连接数据库)。

mysql_init函数的参数:

① mysql:MYSQL 结构体指针,一般设置为 NULL 。

mysql_init函数的返回值:

① 成功,返回一个指向 MYSQL 对象的指针。

② 失败,返回 NULL 。

MYSQL 对象的定义如下:

typedef struct st_mysql

{

  NET                net;                        /* Communication parameters */

  unsigned char        *connector_fd;                /* ConnectorFd for SSL */

  char                *host,*user,*passwd,*unix_socket,*server_version,*host_info;

  char          *info, *db;

  struct charset_info_st *charset;

  MYSQL_FIELD        *fields;

  MEM_ROOT        field_alloc;

  my_ulonglong affected_rows;

  my_ulonglong insert_id;                /* id if insert on table with NEXTNR */

  my_ulonglong extra_info;                /* Not used */

  unsigned long thread_id;                /* Id for connection in server */

  unsigned long packet_length;

  unsigned int        port;

  unsigned long client_flag,server_capabilities;

  unsigned int        protocol_version;

  unsigned int        field_count;

  unsigned int         server_status;

  unsigned int  server_language;

  unsigned int        warning_count;

  struct st_mysql_options options;

  enum mysql_status status;

  my_bool        free_me;                /* If free in mysql_close */

  my_bool        reconnect;                /* set to 1 if automatic reconnect */

 

  /* session-wide random string */

  char                scramble[SCRAMBLE_LENGTH+1];

  my_bool unused1;

  void *unused2, *unused3, *unused4, *unused5;

 

  LIST  *stmts;                     /* list of all statements */

  const struct st_mysql_methods *methods;

  void *thd;

  /*

    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag

    from mysql_stmt_close if close had to cancel result set of this object.

  */

  my_bool *unbuffered_fetch_owner;

  /* needed for embedded server - no net buffer to store the 'info' */

  char *info_buffer;

  void *extension;

} MYSQL;

MYSQL 对象里有很多连接基本参数,它也包含了一个叫 st_mysql_methods 的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。

2. mysql_real_connect

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,

  const char *user,

  const char *passwd,

  const char *db,

  unsigned int port,

  const char *unix_socket,

  unsigned long clientflag);

mysql_real_connect函数的作用:连接数据库。

mysql_real_connect函数的参数:

① mysql:MYSQL 对象指针。

② host:要连接的 MySQL 服务器的 IP 地址。

③ user:用户名,以哪个用户身份连接。

④ passwd:用户密码。

⑤ db:要连接的数据库。

⑥ port:要连接的 MySQL 服务器的端口号。

⑦ unix_socket:通常设置为 NULL 。

⑧ clientflag:通常设置为 0 。

mysql_real_connect函数的返回值:

① 成功,返回一个指向 MYSQL 对象的指针,与第一个参数 mysql 的值相同。

② 失败,返回 NULL 。

3. mysql_close

void mysql_close(MYSQL *sock);

mysql_close函数的作用:关闭数据库连接。

mysql_close函数的参数:

① sock:MYSQL 对象指针。

mysql_close函数的返回值:无。

4. mysql_set_character_set

在连接数据库之后,需要先统一客户端和服务器的编码格式,避免在数据交互的过程中出现乱码。
int mysql_set_character_set(MYSQL *mysql, const char *csname);

mysql_set_character_set函数的作用:设置编码格式。

mysql_set_character_set函数的参数:

① mysql:MYSQL 对象指针。

② csname:要设置成哪种字符集。

mysql_set_character_set函数的返回值:

① 成功,为 0 。

② 失败,为非 0 。

5. mysql_query
int mysql_query(MYSQL *mysql, const char *q);

mysql_query函数的作用:下发 SQL 请求。

mysql_query函数的参数:

① mysql:MYSQL 对象指针。

② q:要执行的 SQL 语句(语句结尾可以不带分号)。

mysql_query函数的返回值:

① 成功,为 0 。

② 失败,为非 0 。

6. mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *mysql);

mysql_store_result函数的作用:获取查询结果。

mysql_store_result函数的参数:

① mysql:MYSQL 对象指针。

mysql_store_result函数的返回值:

① 成功,返回一个指向 MYSQL_RES 对象的指针。

② 失败,返回 NULL 。

该函数会调用 MYSQL 变量中的 st_mysql_methods 中对应的函数指针来获取查询结果。

该函数会 malloc 出一个 MYSQL_RES 结构体变量,将获取到的查询结果保存到该变量中,最后返回该变量的指针。

由于 MYSQL_RES 的内存空间是 malloc 出来的,所以在使用完之后一定要记得调用 free 函数(mysql_free_result函数)来释放对应的内存空间,否则会造成内存泄漏。

执行完mysql_store_result以后,其实要查询的数据都已经在 MYSQL_RES 变量中了,下面的函数基本就是读取 MYSQL_RES 中的数据,参数都是 MYSQL_RES 对象指针:

// 获取结果的行数

my_ulonglong mysql_num_rows(MYSQL_RES *res);

// 获取结果的列数

unsigned int mysql_num_fields(MYSQL_RES *res);

// 获取结果的列属性

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

// 获取结果中的一行记录

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

关于mysql_fetch_row函数的返回值 MYSQL_ROW:

MYSQL_ROW,即结果中的一行记录,对应着多个列信息,实际上就是一个字符串数组,因此,MYSQL_ROW 类型,本质就是 char** 类型,其定义如下:

typedef char **MYSQL_ROW;                /* return data as array of strings */

7.mysql_free_result()

void mysql_free_result(MYSQL_RES *result);

作用:用于释放前面 mysql_store_result 分配的内存。

三、使用示例

1.连接数据库和关闭数据库连接

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

printf("数据库连接成功!\n");

//3、访问数据库

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

2.访问数据库

mysql_query

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "utf8");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from orderitems;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// insert 操作

char sql_insert[] = "insert into man values (\'小刚\', 19);";

int res = mysql_query(ms, sql_insert);

if(res != 0){

printf("execute: %s failed\n", sql_insert);

return 2;

}

printf("execute: %s success\n", sql_insert);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// delete 操作

char sql_delete[] = "delete from man where name=\'小刚\'";

int res = mysql_query(ms, sql_delete);

if(res != 0){

printf("execute: %s failed\n", sql_delete);

return 2;

}

printf("execute: %s success\n", sql_delete);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// update 操作

char sql_update[] = "update man set age = 20 where name=\'小明\'";

int res = mysql_query(ms, sql_update);

if(res != 0){

printf("execute: %s failed\n", sql_update);

return 2;

}

printf("execute: %s success\n", sql_update);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

  • 执行 update 操作:
  • 执行 delete 操作:
  • 执行 insert 操作:
  • 执行 select 操作:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产5G手机20天销量不及苹果一天,被iPhone15按在地上摩擦

iPhone15的上市销售&#xff0c;最大竞争对手无疑是国产5G手机&#xff0c;如今iPhone15上市首日的销量数据也已经出炉&#xff0c;高达200万台&#xff0c;这比国产5G手机卖20天的销量还要多&#xff0c;iPhone15让国产手机领教了什么叫遥遥领先。 据了解苹果对iPhone15的预期…

【动手学深度学习-Pytorch版】门控循环单元GRU

关于GRU的笔记 支持隐状态的门控&#xff1a;这意味着模型有专门的机制来确定应该何时更新隐状态&#xff0c; 以及应该何时重置隐状态。 这些机制是可学习的&#xff0c;并且能够解决了上面列出的问题。 例如&#xff0c;如果第一个词元非常重要&#xff0c; 模型将学会在第一…

SpringMVC基础(一)——Servlet简介

1. Hello Servlet (1) 创建父工程 删除src文件夹 引入一些基本的依赖 <!--依赖--> <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

Spring学习笔记8 Bean的循环依赖问题

Spring学习笔记7 Bean的生命周期_biubiubiu0706的博客-CSDN博客 什么是Bean的循环依赖 A对象中有B属性,B对象中有A属性.这就是循环依赖,我依赖你,你依赖我。你侬我侬 这种情况下会不会出问题? 1.singleton下的set注入产生的循环依赖 2.prototype下的set注入产生的循环依赖 B…

010_第一代软件开发(二)

第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字&#xff1a; Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff…

论文《Enhancing Hypergraph Neural Networks with Intent Disentanglement for SBR》阅读

论文《Enhancing Hypergraph Neural Networks with Intent Disentanglement for Session-based Recommendation》阅读 IntroductionPreliminaries问题形式化Hypergraph Methodology嵌入层 &#xff08;Intent-Aware Embedding&#xff09;会话超图构建 微观解耦宏观解耦预测层模…

SpringMVC+入门案例

一、入门案例 1.依赖导入 <!--1. 导入SpringMVC与servlet的坐标--> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scop…

postgresql-数据库与模式

postgresql-数据库 基本概念创建数据库修改数据库删除数据库管理模式 基本概念 数据库管理系统&#xff08;DBMS&#xff09;是用于管理数据库的软件系统。常见的关系型DBMS有PostgreSQL、 MySQL、Oracle、Microsoft SQL Server、SQLite 等。常见的 NoSQL 数据库有 Redis、Mon…

vue3-ts-vite:Google 多语言调试 / 翻译

一、实现目标 二、代码实现 2.1、项目vue3 - ts - vite 2.2、index.html 引入文件 <script>window.onload function () {const script document.createElement(SCRIPT)script.src https://translate.google.com/translate_a/element.js?cbgoogleTranslateElementI…

kr 第三阶段(六)C++ 逆向

结构体 结构体对齐 设置结构体对齐值 方法1&#xff1a;在 Visual Studio 中可以在 项目属性 -> 配置属性 -> C/C -> 所有选项 -> 结构体成员对齐 中设置结构体对齐大小。方法2&#xff1a;使用 #pragma pack(对齐值) 来设置&#xff0c;不过要想单独设置一个结…

2023 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|数学建模完整代码+建模过程全解全析

问题一&#xff1a;区域碳排放量以及经济、人口、能源消费量的现状分析 思路&#xff1a; 定义碳排放量 Prediction 模型: CO2 P * (GDP/P) * (E/GDP) * (CO2/E) 其中: CO2:碳排放量 P:人口数量 GDP/P:人均GDP E/GDP:单位GDP能耗 CO2/E:单位能耗碳排放量 2.收集并统计相关…

vuereact质检工具(eslint)安装使用总结

1、ESLint ESLint工具主要类似java中的checkStyle和findbugs&#xff0c;是检查代码样式和逻辑规范的工具。 1.1、ESLint安装流程 打开VSCode软件&#xff0c;打开扩展中心&#xff0c;下载ESLint插件 图1.1 点击后面的install按进行安装&#xff0c;如图1.2所示&#xff1…

MySQL(8) 优化、MySQL8、常用命令

一、MySQL优化 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 服务端参数配置&#xff1b; max_connections3000 连接的创建和销毁都需要系统资源&#xff0c;比如内存、文件句柄&#xff0c;业务说的支持…

代码随想录算法训练营第四十二天| 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

正式开始背包问题&#xff0c;背包问题还是挺难的&#xff0c;虽然大家可能看了很多背包问题模板代码&#xff0c;感觉挺简单&#xff0c;但基本理解的都不够深入。 如果是直接从来没听过背包问题&#xff0c;可以先看文字讲解慢慢了解 这是干什么的。 如果做过背包类问题&…

网络安全深入学习第七课——热门框架漏洞(RCE— Fastjson反序列化漏洞)

文章目录 一、什么是json?二、Fastjson介绍三、Fastjson-历史漏洞四、Fastjson特征1、在请求包里面有json格式的2、报错信息中会显示fastjson字眼 五、Fastjson序列化和反序列化六、Fastjson反序列化漏洞原理七、Fastjson反序列化漏洞过程八、Fastjson反序列化漏洞&#xff08…

农林种植类VR虚拟仿真实验教学整体解决方案

传统的葡萄嫁接需要在固定月份&#xff0c;实操成本高&#xff0c;管理周期长&#xff0c;葡萄嫁接VR虚拟仿真实训是VR虚拟仿真公司深圳华锐视点通过在虚拟环境中模拟葡萄嫁接过程&#xff0c;融入教学和实训考核多种模式&#xff0c;打造了全新的职业技能培训方式。 葡萄嫁接V…

【Java实战项目】【超详细过程】—— 大饼的图片服务器6

目录 前言一、引入MD51.引入md5计算依赖2.按照md5值查找图片属性3.存储图片4.删除图片 二、防盗链三、分类查看图片1.思路&#xff1a;2.数据库3.Image4.from表单5.ImageDao类中原有方法6.按照类型sort在数据库中查找图片属性7.ImageServlet 类8.ImageSortServlet类9.WEB.xml绑…

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpress WinForms全面的2D和3D图表类型的集合&#xff0c;DevExpress WinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完…

[python 刷题] 739 Daily Temperatures

[python 刷题] 739 Daily Temperatures 题目&#xff1a; Given an array of integers temperatures represents the daily temperatures, return an array answer such that answer[i] is the number of days you have to wait after the ith day to get a warmer temperatur…

记一次实战案例

1、目标&#xff1a;inurl:news.php?id URL&#xff1a;https://www.lghk.com/news.php?id5 网站标题&#xff1a;趋时珠宝首饰有限公司 手工基础判断&#xff1a; And用法 and 11: 这个条件始终是为真的, 也就是说, 存在SQL注入的话, 这个and 11的返回结果必定是和正常页…