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
相关产品推荐
相关产品推荐

