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

