我试图用Flask创建一个搜索引擎,它可以在我的MySQL数据库中找到结果,但是我在引入数据时遇到了问题,这些数据并没有完全按照保存的方式写入。
我的模型函数
@classmethod
def search(cls, data):
instance_results = []
query = "SELECT * FROM users WHERE first_name LIKE '" + data + "%' ORDER BY id DESC"
results = connectToMySQL('lab_bd').query_db(query, data)
for result in results:
instancia = cls(result)
instance_results.append(instancia)
return instance_results
我的控制器功能
@app.route('/show/patients', methods = ['GET', 'POST'])
def show_patients():
if request.method=='POST' and 'txtname' in request.form:
name = request.form["txtname"]
data = name
print ("DATA NAMER RUTA", data)
users = User.search(data)
print("SEARCH USUARIOS ", users)
else:
users = User.get_all()
print("USUARIOS ", users)
return render_template("searcher.html", users = users)
**之前我这样做,它的工作,但只是我说的描述之前。**我的数据对我的路线是data = {"first_name": name}
和我的query = "SELECT * FROM users WHERE first_name LIKE %(first_name)s ORDER BY id DESC"
这是我的数据库连接,我不确定问题是否是因为这个,我这样做是因为老师告诉我们,这是一个更好的方法,因为sql注入
import pymysql.cursors
class MySQLConnection:
def __init__(self, db):
connection = pymysql.connect(host = 'localhost',
user = 'root',
password = '',
db = db,
charset = 'utf8mb4',
cursorclass = pymysql.cursors.DictCursor,
autocommit = True)
self.connection = connection
def query_db(self, query, data=None):
with self.connection.cursor() as cursor:
try:
query = cursor.mogrify(query, data)
print("Running Query:", query)
executable = cursor.execute(query, data)
if query.lower().find("insert") >= 0:
self.connection.commit()
return cursor.lastrowid
elif query.lower().find("select") >= 0:
result = cursor.fetchall()
return result
else:
self.connection.commit()
except Exception as e:
print("Something went wrong", e)
return False
finally:
self.connection.close()
def connectToMySQL(db):
return MySQLConnection(db)
1条答案
按热度按时间kkbh8khc1#
看起来你试图用Flask创建一个搜索引擎,它使用LIKE子句查询MySQL数据库。但是,当输入与保存的不完全匹配时,您将面临数据检索问题。问题可能与SQL查询构造和数据处理有关。让我们来解决代码中的一些改进和潜在问题:
重要!=> SQL注入预防:您提到使用查询参数来防止SQL注入,这是一个很好的实践。但是,您似乎没有在query_db方法中正确使用参数化。您应该将参数作为元组传递,但您当前将数据同时作为查询和参数传递。您应该按如下所示更改查询构造:
LIKE子句中的通配符:要使用LIKE子句执行部分匹配,需要在数据变量后添加%通配符。这样,它将匹配以提供的数据开头的任何值。例如,如果数据是“John”,则它将匹配**“John Doe”、*“Johnny”、**等。
调试查询:您可以在query_db方法中添加一些调试语句,打印出执行的查询和可能发生的异常。这可以帮助您更轻松地识别问题。
大小写敏感度:MySQL中LIKE子句默认不区分大小写。如果您希望区分大小写匹配,可以在查询中使用COLLATE。
下面是代码的更新版本:
通过遵循这些建议,您应该能够使用LIKE子句以更安全和更有效的方式对MySQL数据库中的first_name列执行部分匹配。
我希望这个解释对你有用。