gpt4 book ai didi

c - 如何为查询字符串正确分配内存?

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:28 25 4
gpt4 key购买 nike

我需要在 C 程序中执行一个 sql 查询。我使用 libpq 连接到 Postgresql。

char *formatted_query = "SELECT * FROM table LIMIT %d OFFSET %d";
char *query;
PGconn *conn;
PGresult *res;
int limit;
int offset;
/* here is connect to base get some data from user (like limit, offset etc.) */
sprintf(query, formatted_query, limit, offset);
res = PQexec(conn, query);

问题是我不知道如何为query分配足够的内存当然我可以这样做:

char query[999]; 

但我认为这种方式是错误的。如果我这样做:

char *query = (char *)malloc(sizeof(char) * sizeof(formatted_query));

可能会发生没有分配足够的内存(例如,limit 或 offset 将是 MAX_INT)。如何为查询字符串正确分配内存?

最佳答案

你真的应该使用 PQexecParams。不幸的是,对于整数,您仍然必须将它们格式化为文本,但您可以为此使用一个简单的静态缓冲区。

PGconn *conn;
PGresult *res;

#define MAX_INT4_DIGITS 11

const char *query = "SELECT * FROM table LIMIT $1 OFFSET $2";
Oid paramtypes[] = {INT4OID, INT4OID};
char *paramvalues[2];
char limitstr[MAX_INT4_DIGITS];
char offsetstr[MAX_INT4_DIGITS];

snprintf(offsetstr, MAX_INT4_DIGITS, "%d", limit);
snprintf(limitstr, MAX_INT4_DIGITS, "%d", offset);

paramvalues[0] = limitstr;
paramvalues[1] = offsetstr;

res = PQexecParams(conn, query, 2, paramtypes, paramvalues, NULL, NULL, 0);

当您只有几个整数参数时,使用参数化查询并不是什么大问题,但当您使用用户提供的字符串时,它就变得至关重要。否则,您会因引用和转义 SQL 注入(inject)而陷入可怕的困惑之中。

libpq 二进制协议(protocol)接口(interface)实际上更方便,但不幸的是它不能跨不同的体系结构(字节序、字长等)工作。

要获得一个更方便的界面来自动处理 libpq 的一些低级操作,请查看 libpqtypes .

关于c - 如何为查询字符串正确分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com