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

C++中包裹字符串的引号消失问题及SQL插入代码求助

问题分析与解决

嘿,我一眼就发现你代码里的问题啦!你明明已经贴心地给pictureName、picturePath这些变量加上了单引号,但最后拼接INSERT语句的时候,完全没用到这些变量,反而直接调用了picture.getName()、picture.getPath()这些原始的无引号字符串,这可不就导致引号“消失”了嘛!

第一步:修复直接拼接的问题

你需要把INSERT语句里的原始字段替换成你已经加好引号的变量,修改后的代码大概是这样:

int pictureId = picture.getId();
std::string pictureName = "'" + picture.getName() + "'";
std::string picturePath = "'" + picture.getPath() + "'";
std::string pictureCreationTime = "'" + picture.getCreationDate() + "'";
// 假设你已经有albumId变量
std::string insertSql = "Insert Into Pictures(Id, Name, Location, Creation_Date, Album_id) Values(" 
    + std::to_string(pictureId) 
    + ',' + pictureName  // 这里用加了引号的变量
    + "," + picturePath  // 这里也是
    + ',' + pictureCreationTime  // 还有这个
    + ',' + std::to_string(albumId) + ")";

这样拼接出来的SQL语句里,字符串字段就会带上单引号了。

第二步:更安全的做法——避免手动拼接(强烈推荐)

不过得提醒你,手动给字符串加引号拼接SQL是非常危险的,很容易遭遇SQL注入攻击,比如如果图片名称里包含单引号(比如O'Neil.jpg),你的SQL语句会直接报错甚至被恶意利用。

更好的方式是用参数化查询,不同的C数据库库(比如MySQL Connector/C、SQLite3、ODBC等)都支持参数绑定,举个MySQL的例子:

// 假设你已经建立了数据库连接conn
std::string insertSql = "Insert Into Pictures(Id, Name, Location, Creation_Date, Album_id) Values(?, ?, ?, ?, ?)";
sql::PreparedStatement *pstmt = conn->prepareStatement(insertSql);
pstmt->setInt(1, pictureId);
pstmt->setString(2, picture.getName());
pstmt->setString(3, picture.getPath());
pstmt->setString(4, picture.getCreationDate());
pstmt->setInt(5, albumId);
pstmt->executeUpdate();
// 记得释放资源
delete pstmt;

参数化查询会自动处理字符串的引号转义,既安全又省心,完全不用你手动加引号~

内容的提问来源于stack exchange,提问作者Aviel Ovadiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:35:55