我想更新pull_out.po_det
等于变量sr_id
的表sr_id
,当我执行下面的代码时,我得到了一个
发生错误,请重新加载页面。
有人可以告诉我下面的代码有什么问题吗?
def editpo():
getvars=request.vars.a
sr_id=request.args(0,cast=int,default=0)
query=db.pull_out.sr_id==sr_id
update_po=db.executesql('UPDATE pull_out SET po_det=%s WHERE %s;' %str(getvars) %str(query))
if update_po:
response.flash="Pull Out edit successful!"
return locals()
答案 0 :(得分:0)
您的代码中存在多个错误。首先你的更新查询的sql语法是错误的,你错过了值的引用,你的where
子句是错误的,字符串格式化语法也是错误的。您将DAL查询语法与sql语法混合在一起。
您可以使用DAL查询轻松实现此目的:
update_po = db(db.pull_out.sr_id == sr_id).update(po_det=getvars)
如果您想使用executesql
:
update_query = "UPDATE pull_out SET po_det='%s' WHERE sr_id='%s';"
update_po = db.executesql(update_query, placeholders=(getvars, sr_id))
答案 1 :(得分:0)
我同意this answer,但仍存在两个安全问题。
首先,您的服务器端代码不会执行任何身份验证,也不会验证sr_id
或request.vars.a
的值。这意味着任何人都可以向此终端发出HTTP请求,并使用任何值更新db.pull_out
中的任何记录。
其次,如果您使用建议的.executesql
方法,您将接受SQL注入攻击,因为它只是将(可能是恶意的)客户端发送的值直接插入到SQL语句中。您应该使用placeholders
参数:
update_query = "UPDATE pull_out SET po_det='%s' WHERE sr_id='%s';"
update_po = db.executesql(update_query, placeholders=(getvars, sr_id))
但是,只要您已经定义了db.pull_out
表,就可以使用DAL API来进行更新。
最后,请注意返回locals()
,因为最终可能会泄漏非公开数据。最好只返回一个包含视图所需数据的字典。