sqlite3入门之sqlite3_mprintf
sqlite3_mprintf
- sqlite3_mprintf()函数原型:
char *sqlite3_mprintf(const char*,...);
- sqlite3_mprintf()的作用是将结果写入到sqlite3_malloc()获取的内存中,例程返回的字符串应该使用sqlite3_free()进行释放,如果无法申请到足够的内存,则会返回NULL指针;
- 它同c库函数 sprintf()类似,实现一些额外的格式化。对所有常用的printf()格式化选项都适用。另外还有非常用选项:%q, %Q, %z;
- %q选项的作用类似于%s,它会替换了参数列表中以空字符结尾的字符串%q,同时他会将单引号字符转义,有助于防止SQL注入攻击;
- 示例:
char * zText =“这是快乐的一天!”;
char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES('%q')”,zText);
sqlite3_exec(db,zSQL,,,);
sqlite3_free(ZSQL)- 因为使用了%q格式字符串,所以zText中的'\''字符被转义,生成的SQL如下所示:
INSERT INTO table1 VALUES('这是快乐的一天!')
- 作为一般规则,在将文本插入字符串文字时,应始终使用%q而不是%s。
- %Q选项的作用类似于%q,除了它还在整个字符串的外部添加单引号。此外,如果参数列表中的参数是NULL指针,则%Q替换文本“NULL”(不带单引号);
char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES(%Q)”,zText);
sqlite3_exec(db,zSQL,,,);
sqlite3_free(ZSQL);- 即使zText变量是NULL指针,上面的代码也会在zSQL变量中呈现正确的SQL语句。
- “%z”格式化选项的作用类似于“%s”,但添加了在读取字符串并将其复制到结果中之后,在输入字符串上调用sqlite3_free()。
从程序看 %s, %q, %Q之间的区别
char *str_he = "合";
char *str_fen = "分"; //初始化表
for(rc = ; rc < ; rc++) {
sql = sqlite3_mprintf("INSERT INTO RELAY VALUES ('%d', '%s','%s', '2019-7-12');", rc, str_he, str_fen);
sqlite3_exec(db, sql, , , &zErrMsg);
} rc = sqlite3_get_table(db, "SELECT * FROM RELAY", &dbresult, &nRow, &nColum, &zErrMsg);
if(rc == SQLITE_OK) {
index = nColum;
for(i = ; i < nRow; i++) {
for(j = ; j < nColum; j++) {
printf("%d--%s : %s\n", i, dbresult[j], dbresult[index++]);
// ++index;
}
printf("----------------------------------------------\n");
}
}
- 输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。
- 将 %s 改为 %q ,输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。。
- 将 %s 改为 %Q,输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。。
- 从上面的结果来看,当插入的字符串不为空指针时,三者之间并没有多大差别。
- 将字符串设置为NULL
char *str_he = NULL;
char *str_fen = NULL;- %s 输出结果
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
。。。。。。- %q 输出结果
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
。。。。。。- %Q输出结果
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
。。。。。。- 当需要插入的字符为NULL时,%s 并没有将NULL插入到表中,但是%q, %Q能够将NULL插入到表中,只是大小写不一样;
sqlite3入门之sqlite3_mprintf的更多相关文章
- python sqlite3 入门 (视频讲座)
python sqlite3 入门 (视频讲座) an SQLite mini-series! - Simple Databases with Python 播放列表: YouTube https:/ ...
- Sqlite3入门简记
一,安装Sqlite3 1.入门时看http://www.runoob.com/sqlite/sqlite-intro.html,说的简单,但是适合入门 2.在终端输入sqlite3,没有返回信息,表 ...
- sqlite3入门之sqlite3_get_table,sqlite3_free_table
sqlite3_get_table sqlite3_get_table函数原型: int sqlite3_get_table( sqlite3 *db, /* An open database */ ...
- sqlite3 入门
SQLite3 C语言API入门下载SQLite3 我们下载sqlite源码包,只需要其中的sqlite3.c.sqlite.h即可.最简单的一个创建表操作#include <stdio.h&g ...
- sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close
sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...
- sqlite3使用入门
sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...
- SQLite3简单入门及C++ API
转载请注明出处:http://www.cnblogs.com/StartoverX/p/4660487.html 项目用到SQLite3,简单记录一下. MySQL不同,SQLite3的数据库基于文件 ...
- Django入门实践(3)
Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子是创建一个简单应用wiki ...
- 使用数据库sqlite3 C语言实现登陆注册的功能
//此代码为注册功能 void create_regtable() { int rc; //rc为返回值,判断函数是否执行成功 rc=0函数执行成功,rc !=0函数执行失败 sqlite3 *db; ...
随机推荐
- C#对泛型实例化对像的方法
最近在搞一个小东东,用到了泛型的处理,用到了对泛型的实例化问题.下面来讲讲对泛型的实例化,以代码为例,如: public class A { } public class B<T> { p ...
- 解决在manjaro下,vscode无法将chrome作为默认浏览器打开
Same issue. The solution is simple. Find the name of the exec command, for google chrome in arch lin ...
- 【Java语言特性学习之一】设计模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- docker+k8s基础篇三
Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...
- VyOS 关于dhcp server 和dhcp relay 切换需要注意的
dhcp server : /config/dhcpd.leases dhcp relay 两个dhcp 模式切换需要删除这个配置文件
- 自己实现简单版SpringMVC
SpringMVC的主要作用是:从http请求中得到一个url字符串和对应的请求参数,根据该字符串找到Controller中的一个方法,利用反射执行该方法,将结果返回给前端 1,初始化 将url请求路 ...
- JavaWeb实现增删查改(图书信息管理)之删除功能实现
—————————————————————————————————————————————————————————— 删除按钮对应的servlet -->DeleteBooks.java ↓ ...
- 【scratch3.0教程】1.2 下载安装scratch
第2课 下载安装Scratch 1 . 什么是Scratch? Scratch将程序语言设计成一块块积木,你只要用拖拉的方式,将程序积木 ...
- OAuth2实现原理
现在开放平台非常流行,例如微信开放平台.微博开放平台等,开放平台都涉及用户授权问题,OAuth2就是目前的主流授权解决方案 OAuth2是什么 OAuth(Open Authorization,开放授 ...
- JSON省市区
省: [ { "ProID": 1, "name": "北京市", "ProSort": 1, "ProRem ...