如何使用web2py中的executionql更新表

时间:2016-10-30 12:02:20

标签: sql web2py

我想更新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()

2 个答案:

答案 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_idrequest.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(),因为最终可能会泄漏非公开数据。最好只返回一个包含视图所需数据的字典。