You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C脚本向PostgreSQL表插入buffer变量数据失效,如何修改代码?

问题原因

libpq的PQexec接口原生不支持冒号前缀的变量绑定语法,你用到的:buffer写法是其他高级语言封装的PostgreSQL客户端提供的语法,C语言原生调用libpq不能直接这么用。

正确实现方案

推荐使用PQexecParams做参数绑定,既可以避免SQL注入风险,也不需要手动处理字符串转义逻辑,代码示例如下:

const char *paramValues[1];
paramValues[0] = buffer; // 把你的变量放到参数值数组里

res = PQexecParams(conn,
                   "INSERT INTO pressure(SENSORVAL) VALUES($1)", // 用$1作为第一个参数的占位符
                   1, // 本次查询绑定的参数总数
                   NULL, // 不传参数类型数组,让服务端自动推断类型
                   paramValues, // 绑定的参数值数组
                   NULL, // 参数长度数组,字符串类型参数直接传NULL即可
                   NULL, // 参数格式数组,默认文本格式传NULL即可
                   0); // 返回结果的格式,0代表文本格式

if (PQresultStatus(res) != PGRES_COMMAND_OK) 
    do_exit(conn, res);     

PQclear(res);

特殊场景补充

如果你存在buffer中存储的是二进制数据的场景,需要额外补充参数长度、参数格式配置,示例如下:

const char *paramValues[1];
int paramLengths[1];
int paramFormats[1];

paramValues[0] = buffer;
paramLengths[0] = sizeof(你的二进制数据类型); // 替换为实际的二进制数据长度
paramFormats[0] = 1; // 1代表参数是二进制格式

res = PQexecParams(conn,
                   "INSERT INTO pressure(SENSORVAL) VALUES($1)",
                   1,
                   NULL,
                   paramValues,
                   paramLengths,
                   paramFormats,
                   0);

if (PQresultStatus(res) != PGRES_COMMAND_OK) 
    do_exit(conn, res);     

PQclear(res);

注意:不推荐手动拼接SQL字符串的写法,很容易出现特殊字符转义错误、SQL注入等问题,优先使用参数绑定方案。

内容的提问来源于stack exchange,提问作者Yushantha chathuranga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:21:00