MySQL客户端/服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。

对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。

预处理语句的另一个优点是,它采用了二进制协议,从而使得客户端和服务器之间的数据传输更有效率。

类似于Oracle里面的占位符概念!!

一般步骤:

用mysql_stmt_init()创建预处理语句句柄。要想在服务器上准备预处理语句,可调用mysql_stmt_prepare(),并为其传递包含SQL语句的字符串 如果语句生成了结果集,调用mysql_stmt_result_metadata()以获得结果集元数据。虽然与包含查询返回列的结果集不同,该元数据本身也采用了结果集的形式。元数据结果集指明了结果中包含多少列,并包含每一列的信息。 使用mysql_stmt_bind_param()设置任何参数的值。必须设置所有参数。否则,语句执行将返回错误,或生成无法预料的结果。 调用mysql_stmt_execute()执行语句。 如果语句生成了结果集,捆绑数据缓冲,通过调用mysql_stmt_bind_result(),检索行值。 通过重复调用mysql_stmt_fetch(),按行将数据提取到缓冲区,直至未发现更多行为止。 通过更改参数值并再次执行语句,重复步骤3到步骤6。

具体看代码#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define STRING_SIZE 50

#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"

#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\

col2 VARCHAR(40),\

col3 SMALLINT,\

col4 TIMESTAMP)"

#define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"

int main(int arg, char *args[])

{

int ret = 0, i=0;

MYSQL *mysql;

MYSQL *connect;

MYSQL_RES *result;

MYSQL_ROW row;

MYSQL_FIELD *fields;

unsigned int num_fields;

//if (arg < 4)

//{

// printf("please enter: %s localhost user password dbname\n", args[0]);

// return -1;

//}

mysql = mysql_init(NULL);

//连接到mysql server

//connect = mysql_real_connect(mysql, args[1], args[2], args[3], args[4],0, 0, 0);

//connect = mysql_real_connect(mysql, "localhost", "root", a, args[4],0, 0, 0);

connect = mysql_real_connect(mysql, "localhost", "root", "123456", "mydb2", 0, NULL, 0 );

if (connect == NULL)

{

printf("connect error, %s\n", mysql_error(mysql));

return -1;

}

ret = mysql_query(connect, "SET NAMES utf8"); //设置字符集为UTF8

if (ret != 0)

{

printf("设置字符集错误, %s\n", mysql_error(mysql));

return ret;

}

MYSQL_STMT *stmt;

MYSQL_BIND bind[3];

my_ulonglong affected_rows;

int param_count;

short small_data;

int int_data;

char str_data[STRING_SIZE];

unsigned long str_length;

my_bool is_null;

if (mysql_query(mysql, DROP_SAMPLE_TABLE))

{

fprintf(stderr, " DROP TABLE failed\n");

fprintf(stderr, " %s\n", mysql_error(mysql));

exit(0);

}

if (mysql_query(mysql, CREATE_SAMPLE_TABLE))

{

fprintf(stderr, " CREATE TABLE failed\n");

fprintf(stderr, " %s\n", mysql_error(mysql));

exit(0);

}

/* Prepare an INSERT query with 3 parameters */

/* (the TIMESTAMP column is not named; the server */

/* sets it to the current date and time) */

stmt = mysql_stmt_init(mysql); //初始化 预处理环境 生成一个预处理句柄

if (!stmt)

{

fprintf(stderr, " mysql_stmt_init(), out of memory\n");

exit(0);

}

if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE))) //预处理环境中 准备sql

{

fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");

fprintf(stderr, " %s\n", mysql_stmt_error(stmt));

exit(0);

}

fprintf(stdout, " prepare, INSERT successful\n");

/* Get the parameter count from the statement */

param_count= mysql_stmt_param_count(stmt); //预处理环境中 求绑定变量的个数

fprintf(stdout, " total parameters in INSERT: %d\n", param_count);

if (param_count != 3) /* validate parameter count */

{

fprintf(stderr, " invalid parameter count returned by MySQL\n");

exit(0);

}

/* Bind the data for all 3 parameters */

memset(bind, 0, sizeof(bind));

/* INTEGER PARAM */

/* This is a number type, so there is no need to specify buffer_length */

bind[0].buffer_type= MYSQL_TYPE_LONG; //为第一个绑定变量设置类型和 输入变量的内存首地址

bind[0].buffer= (char *)&int_data;

bind[0].is_null= 0;

bind[0].length= 0;

/* STRING PARAM */

bind[1].buffer_type= MYSQL_TYPE_STRING; //为第2个绑定变量设置类型和 输入变量的内存首地址

bind[1].buffer= (char *)str_data;

bind[1].buffer_length= STRING_SIZE;

bind[1].is_null= 0;

bind[1].length= &str_length;

/* SMALLINT PARAM */

bind[2].buffer_type= MYSQL_TYPE_SHORT; //为第3个绑定变量设置类型和 输入变量的内存首地址

bind[2].buffer= (char *)&small_data;

bind[2].is_null= &is_null;

bind[2].length= 0;

/* Bind the buffers */

if (mysql_stmt_bind_param(stmt, bind)) //把绑定变量设置到 预处理环境中

{

fprintf(stderr, " mysql_stmt_bind_param() failed\n");

fprintf(stderr, " %s\n", mysql_stmt_error(stmt));

exit(0);

}

/* Specify the data values for the first row */ //插入第一条记录

int_data= 10; /* integer */

strncpy(str_data, "MySQL", STRING_SIZE); /* string */

str_length= strlen(str_data);

/* INSERT SMALLINT data as NULL */

is_null= 1;

/* Execute the INSERT statement - 1*/

if (mysql_stmt_execute(stmt))

{

fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");

fprintf(stderr, " %s\n", mysql_stmt_error(stmt));

exit(0);

}

/* Get the total number of affected rows */

affected_rows= mysql_stmt_affected_rows(stmt);

fprintf(stdout, " total affected rows(insert 1): %lu\n",

(unsigned long) affected_rows);

if (affected_rows != 1) /* validate affected rows */

{

fprintf(stderr, " invalid affected rows by MySQL\n");

exit(0);

}

/* Specify data values for second row, then re-execute the statement */

int_data= 1000; //插入第一条记录

strncpy(str_data, "The most popular Open Source database", STRING_SIZE);

str_length= strlen(str_data);

small_data= 1000; /* smallint */

is_null= 0; /* reset */

/* Execute the INSERT statement - 2*/

if (mysql_stmt_execute(stmt))

{

fprintf(stderr, " mysql_stmt_execute, 2 failed\n");

fprintf(stderr, " %s\n", mysql_stmt_error(stmt));

exit(0);

}

/* Get the total rows affected */

affected_rows= mysql_stmt_affected_rows(stmt);

fprintf(stdout, " total affected rows(insert 2): %lu\n",

(unsigned long) affected_rows);

if (affected_rows != 1) /* validate affected rows */

{

fprintf(stderr, " invalid affected rows by MySQL\n");

exit(0);

}

/* Close the statement */

if (mysql_stmt_close(stmt))

{

fprintf(stderr, " failed while closing the statement\n");

fprintf(stderr, " %s\n", mysql_stmt_error(stmt));

exit(0);

}

mysql_close(connect); //断开与SQL server的连接

}

以上就是MySQL入门之预处理语句的使用的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

mysql的初始化语句是_MySQL入门之预处理语句的使用相关推荐

  1. mysql倍增表的内容_MySQL入门(7)——表数据的增、删、改

    MySQL入门(7)--表数据的增.删.改 插入数据 使用INSERT···VALUES语句插入数据 INSERT语句最常用的格式是INSERT···VALUES: INSERT [LOW_PRIOR ...

  2. mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程

    mysql基础架构 示意图 首先 mysql  大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...

  3. mysql中insert into含义_MySQL中insert into语句的用法

    insert into是mysql中最常用的插入语句,通过 INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中,目标表中任何已存在的行都不会受影响. 今天我们 ...

  4. mysql insert语句大全_MySQL中insert into语句的6种写法

    insert into是mysql中最常用的插入语句,它有6种写法. 1向原表中某些字段中插入一条记录. 语法:insert into +表名(表中的字段,,)value(字段所对应的记录,,); m ...

  5. mysql无法初始化数据库引擎_mysql使用模板解决旧数据处理,默认初始化数据的通用方法!...

    一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...

  6. mysql主从同步部分表_Mysql入门MySQL 主从同步部分数据表

    <Mysql入门MySQL 主从同步部分数据表>要点: 本文介绍了Mysql入门MySQL 主从同步部分数据表,希望对您有用.如果有疑问,可以联系我们. 导读:在配置MySQL主从同步的时 ...

  7. 实战派mysql高阶应用指南_MySQL高阶SQL语句(学会这些,让你对于数据库游刃有余)_Gengchenchen的博客-CSDN博客...

    ------GROUP BY------对GROUP BY后面的栏位的查询结果进行汇总分组,通常是结合聚合函数一起使用的 GROUP BY 有一个原则,就是 SELECT 后面的所有列中,没有使用聚合 ...

  8. mysql oracle sql区别吗_mysql数据库的SQL语句和oracle的有什么区别?详细点

    匿名用户 1级 2017-08-20 回答 区别如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Or ...

  9. mysql排序由低到高_MySQL入门系列(四)—— 排序查询

    一.排序查询 语法 SELECT 查询列表 FROM 表 [WHERE 筛选条件] ORDER BY 排序列表 [ASC] 一般ORDER BY语句放在查询语句的最后[LIMIT子句除外] 案例 案例 ...

  10. mysql case when then 函数_MySQL case when then 语句使用和时间函数使用

    Laravel上使用: $list = Article::where('status',2)->where('category_id',$category_id) ->select(DB: ...

最新文章

  1. matlab从入门到精通-matlab计算机仿真与蒙特卡洛法【数学建模】
  2. 深入理解分布式技术 - 分布式缓存总结回顾
  3. mysql caching_sha2_password异常分析
  4. 关于uint8_t/uint16_t/uint32_t/uint_fast16_t
  5. Django中的核心思想ORM---元类实现ORM
  6. python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字
  7. 各种门锁的内部结构图_便宜超好用:小米智能门锁 E上手体验报告
  8. go语言和java比_Go VS Java:一位资深程序员对两种语言的解读
  9. 统计sql server数据库中所有表的记录数
  10. 《Reids 设计与实现》第九章 事件
  11. Linux内存管理:知识点总结(ARM64)
  12. 使用计算机系统管理商品存货,ERP管理系统中编码的意义
  13. webservice 调用慢问题解决
  14. C++对象绑定到Lua
  15. 世界国家中英文名称以及地区区号json格式
  16. matlab 四叉树表达,已知二值图像,如题图8.4所示。 (1)对该图像使用四叉树进行划分; (2)用四叉树表达该图像。 - 试题答案网问答...
  17. 全民 https!使用 FreeSSL 申请免费的 https 证书
  18. RIP光栅图像处理器
  19. python列表转化为数字信号的过程_如何用python写一个简单的数字信号处理计算器(文章末公开代码)?...
  20. 华为荣耀鸿蒙3.0,2.0解决此设备未获得play保护机制认证框架,安装谷歌Play商店服务框架

热门文章

  1. VMwear安装Centos7超详细过程
  2. WinCE6.0 BootloaderMain源码分析之DownloadImage
  3. 【转】推荐一款Java反编译器,比较好用
  4. 关于Xcode的Other Linker Flags
  5. 案例:如何解决难以重现的BUG
  6. 微信短信验证码注意事项(tp3.2-腾讯云)
  7. adapter中的数据错误原因和解决方案
  8. Apple 隐私政策
  9. git 基于master分支 创建其他本地分支,并关联
  10. phpspider 爬取汉谜网