无法使用 MySQL 在烧瓶中执行查询

Posted

技术标签:

【中文标题】无法使用 MySQL 在烧瓶中执行查询【英文标题】:Unable to execute a query on flask using MqSQL 【发布时间】:2021-09-09 01:11:18 【问题描述】:

您好,我正在尝试使用带有 mysqldatabase 的 Flask 执行 SQL 查询,该查询以 JSON 形式返回,我在前端管理我的 JQuery。目标是使用搜索栏查找与数据库的任何匹配项。例如,如果我只使用一个“喜欢”句子,查询就可以正常工作。

query = "SELECT terapia.*,terapeuta.nombre,cliente.nombres, especialidad.descripcion FROM terapia LEFT JOIN terapeuta ON terapeuta.id_terapueta = terapia.terapeuta_id_terapueta LEFT JOIN cliente ON cliente.id_cliente = terapia.cliente_id_cliente LEFT JOIN especialidad ON especialidad.id_especialidad = terapeuta.id_especialidad WHERE especialidad.descripcion LIKE '%'".format(searchbox)

但在我使用“或”句进行多次搜索时,如下所示:

query = "SELECT terapia.*,terapeuta.nombre,cliente.nombres, especialidad.descripcion FROM terapia LEFT JOIN terapeuta ON terapeuta.id_terapueta = terapia.terapeuta_id_terapueta LEFT JOIN cliente ON cliente.id_cliente = terapia.cliente_id_cliente LEFT JOIN especialidad ON especialidad.id_especialidad = terapeuta.id_especialidad WHERE especialidad.descripcion LIKE '%' or terapeuta.nombre LIKE '%'".format(searchbox)

查询根本不起作用,输出这个错误

error for jQuery

好奇地在 Dbebaber 上执行相同的查询工作得很好,显然用 'string%' 替换了 '%',我不知道为什么查询拒绝工作,此外我还包括完整的 python 和 Jquery代码。

烧瓶:

from flask import render_template, request, redirect, url_for, session, flash, jsonify
@terapia.route('/livesearch', methods=["POST","GET"])
def livesearch():
    searchbox = request.form.get('text')
    cur = mysql.connection.cursor()
    query = "SELECT terapia.*,terapeuta.nombre,cliente.nombres, especialidad.descripcion FROM terapia LEFT JOIN terapeuta ON terapeuta.id_terapueta = terapia.terapeuta_id_terapueta LEFT JOIN cliente ON cliente.id_cliente = terapia.cliente_id_cliente LEFT JOIN especialidad ON especialidad.id_especialidad = terapeuta.id_especialidad WHERE especialidad.descripcion LIKE '%' or terapeuta.nombre LIKE '%'".format(searchbox)
    cur.execute(query)
    result = cur.fetchall()
    return jsonify(result)

html 和 JQUERY

<div class="col-md-12">
        <input type="text" id="livebox">
        <p id="search-response"></p>
    </div>
    <script>
        $(document).ready(function()
            $("#livebox").on("input", function(e)
                let textinlivebox = $("#livebox").val();
                $.ajax(
                    method: "POST",
                    url: "/terapia/livesearch",
                    data:text: textinlivebox,
                    success: function(res)
                        //document.getElementById('search-response').innerHTML = res;
                        console.log(res)
                    
                )
            );
        );
    </script>

欢迎任何帮助或建议。

【问题讨论】:

【参考方案1】:

请阅读 SQL 注入漏洞,并使用:

query = 'SELECT ... FROM ... WHERE especialidad.descripcion LIKE %s or terapeuta.nombre LIKE %s'
cur.execute(query, (searchbox, searchbox))

这会转义用户输入,因此恶意用户无法将 SQL 命令写入搜索框。

【讨论】:

非常感谢,这个解决方案很好用。也感谢关于 SQL 注入的建议。【参考方案2】:

请查看here 以了解如何在 sql alchemy(负责 sql 注入)中使用“like”。

此外,我建议您阅读有关sqlalchemy 的更多信息,以便编写尽可能可读的查询。

【讨论】:

以上是关于无法使用 MySQL 在烧瓶中执行查询的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶躁动无法构造查询

TypeError:无法将未定义或空值转换为对象 - 尝试在路由器中执行 MySQL 查询时

为啥 MySQL DELETE 无法对子查询使用索引?

MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询

PyInstaller 包烧瓶应用程序无法加载 Python 库,dlopen -> 找不到图像

无法使用烧瓶邮件python将附件添加到邮件