怎样才能把单引号双引号这些特殊字符存到数据库里?

2016-07-08 23:24:42 +08:00
 omg21
aa='''
<td valign="top" align='left'><p class="p"><span style="font-family: 微软雅黑; font-size: 12pt;">根据工作需要,经学校人社处批准,电子科学与工程学院公开招聘实验技术人员</span><font face="Times New Roman" style="font-size: 12pt;">2</font><font face="微软雅黑" style="font-family: 微软雅黑; font-size: 12pt;">人。有关事宜公布如下:</font></p><p class="p"><span style="mso-spacerun:'yes';font-family:微软雅黑;mso-ascii-font-family:'Times New Roman';mso-hansi-font-family:'Times New Roman';mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;mso-font-kerning:0.0000pt;">一、招聘条件</span><span style="mso-spacerun:'yes';...</td>
'''

dbstr = "insert into zwlist(a1) values('%s')"%(aa)
db.execute(dbstr)
db.commit()
在保存网页内容到数据库里时,出现这个错误:

pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] 语法错误 (操作符丢失) 在查询表达式 \'\'<td valign="top" align=\'left\'><p class="p"><span style="font-family: 微软雅黑; font-size: 12pt;">根据工作需要,经学校人社处批准,电子科学与工程学院公开招聘实验技术人员</span>\'\'

这是因为网页里有单引号双引号,还有一些其他 字符 ,执行到 db.execute(dbstr)这条时就出现了错误,怎样才能把这些特殊字符存到数据库里?
9028 次点击
所在节点    Python
20 条回复
raptium
2016-07-08 23:27:52 +08:00
都 2016 年了,你还在用字符串拼接 SQL ……
raptium
2016-07-08 23:29:09 +08:00
dbstr = "insert into zwlist(a1) values('%s')"
db.execute(dbstr, [aa])
murmur
2016-07-08 23:30:36 +08:00
如果是 php 的话用 addslashes 就可以了 其他语言直接自己实现一个 addslashes 就可以了
有的时候还真得拼接一下 比如说 like 而且像 oracle 他对%和_都敏感。。那就不安逸了
cxbig
2016-07-08 23:45:45 +08:00
ORM 在哪?
quadpixels
2016-07-09 01:45:35 +08:00
我就记得单引号在转义中是写成连续两个单引号(`''`)…
omg21
2016-07-09 06:27:58 +08:00
@raptium
dbstr = "insert into zwlist(a1) values('%s')"
db.execute(dbstr, [aa])
这样写报错:
pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 0 parameter markers, but 1 parameters were supplied')
omg21
2016-07-09 06:29:25 +08:00
@murmur
我记得以前用 VB 是用 ' " & & " '
aprikyblue
2016-07-09 06:46:43 +08:00
为什么不查查文档呢。。
argsno
2016-07-09 07:23:36 +08:00
dbstr = "insert into zwlist(a1) values(%s)"
db.execute(dbstr, (a,)])
laoyur
2016-07-09 08:03:24 +08:00
目测一大波 sql 注入党正对楼主的服务器虎视眈眈中
magicdawn
2016-07-09 08:22:15 +08:00
Node.js 的话, 有 driver, 例如 require('mysql').escape(val) 就可以了...
不知道 python 有没...
klesh
2016-07-09 10:09:42 +08:00
@magicdawn 我觉得正确的使用方式是这样的:
connection.query('INSERT INTO table VALUES (?, ?)', [a, b], cb)
kaneg
2016-07-09 10:54:15 +08:00
直接上 base64 ,不过什么符号照单全收
iyaozhen
2016-07-09 12:19:01 +08:00
搞过和楼主类似的需求。
1 解析 HTML 然后格式化存储
2 base64 存进去,不过长度会增加大概 1/3
3 转义特殊字符,每个语言都有标准方法吧
freestyleyoo
2016-07-09 12:21:38 +08:00
新手不懂 2 楼所说呀,能否教教我那个语法是什么意思呢,老师只教过我 ps.setint(1,a)这样的啊, oracle 的数据库,很多时候都要用到字符串萍姐啊,真心求教,我是不是太新手了
bdbai
2016-07-09 13:16:23 +08:00
@freestyleyoo 搜索引擎和文档是你最好的老师。
magicdawn
2016-07-09 15:00:19 +08:00
@klesh

Node.js 中的 mysql.escape 以及 mysql.format, escape 输入单个值, format 调用 escape. 然后 query 调用 format
就是你说的这样...
freestyleyoo
2016-07-09 17:15:19 +08:00
@bdbai 好的,谢谢你
omg21
2016-07-09 20:35:44 +08:00
@iyaozhen 可是 base64 编码后的字符串会有 b'开头,这个也没法代换到 SQL 的 values('%s')里啊
chuxiwen
2016-07-10 13:56:17 +08:00
Prepared Statements 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/291272

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX