python-bot

jqjz2hbq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(249)

我总是无法从我的电报机器人向mysql数据库插入数据,并且总是运行异常。仅限 tanggald 总是插不进去。我发现日期插入查询的格式错误。如何写正确的格式? tanggald 列详细信息:数据类型=日期
这是一段代码:

def process_lanjut(message):
    try:
        chat_id = message.chat.id
        qlanjut = message.text
        user = user_dict[chat_id]
        user.qlanjut=qlanjut

        d = datetime.datetime.now().date()
        next_monday = next_weekday(d, 4) 
        user.next_monday = next_monday
        print(user.next_monday)

        with con.cursor() as cursor:
            sql = "INSERT INTO diagnosa(sex, tanggald) VALUES('" + user.sex + "','" +next_monday+ "')"
            cursor.execute(sql)

        con.commit()
        con.close()

        msg = bot.send_message(chat_id, 'thanks')
        bot.register_next_step_handler(msg, send_end)

    except Exception as e:
        bot.reply_to(message,'oops lanjut')

命令行输出:2018-04-20(应插入tanggald的数据)

gj3fmq9x

gj3fmq9x1#

这不是向表中插入数据的正确方法。尽管您的方法可能有效,但它不安全,而且缺少数据转义( ' , " ,等等):
许多数据类型的sql表示常常不同于它们的python字符串表示。典型的例子是字符串中的单引号:在sql中,单引号用作字符串文本分隔符,因此必须对字符串本身中出现的单引号进行转义,而在python中,如果字符串由双引号分隔,则可以不转义单引号。
由于数据类型表示法之间的差异(有时很微妙),naï查询字符串组合的ve方法,例如使用python字符串连接,是解决可怕问题的良方。
如果包含要发送到数据库的数据的变量来自不受信任的源(如网站上发布的表单),攻击者很容易生成格式错误的字符串,从而访问未经授权的数据或对数据库执行破坏性操作。这种形式的攻击称为sql注入,已知是对数据库服务器最广泛的攻击形式之一。在继续之前,请把这一页打印成备忘录并挂在table上。
所以在你的情况下 INSERT 语句应如下所示:

with con.cursor() as cursor:
    sql = 'INSERT INTO diagnosa (sex, tanggald) VALUES (%s, %s)'
    data = (user.sex, next_monday)
    cursor.execute(sql, data)

进一步阅读:
mysql文档及示例
postgresql的类似文章(包含对潜在问题的更好解释)

相关问题