无法使用 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 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询