python Flask MySQL搜索引擎在MVC模式下不工作

laawzig2  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(72)

我试图用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)
kkbh8khc

kkbh8khc1#

看起来你试图用Flask创建一个搜索引擎,它使用LIKE子句查询MySQL数据库。但是,当输入与保存的不完全匹配时,您将面临数据检索问题。问题可能与SQL查询构造和数据处理有关。让我们来解决代码中的一些改进和潜在问题:
重要!=> SQL注入预防:您提到使用查询参数来防止SQL注入,这是一个很好的实践。但是,您似乎没有在query_db方法中正确使用参数化。您应该将参数作为元组传递,但您当前将数据同时作为查询和参数传递。您应该按如下所示更改查询构造:

query = "SELECT * FROM users WHERE first_name LIKE %s ORDER BY id DESC"
results = connectToMySQL('lab_bd').query_db(query, (data + '%',))

LIKE子句中的通配符:要使用LIKE子句执行部分匹配,需要在数据变量后添加%通配符。这样,它将匹配以提供的数据开头的任何值。例如,如果数据是“John”,则它将匹配**“John Doe”、*“Johnny”、**等。

调试查询:您可以在query_db方法中添加一些调试语句,打印出执行的查询和可能发生的异常。这可以帮助您更轻松地识别问题。
大小写敏感度:MySQL中LIKE子句默认不区分大小写。如果您希望区分大小写匹配,可以在查询中使用COLLATE
下面是代码的更新版本:

# MODEL function
@classmethod
def search(cls, data):
    instance_results = []
    query = "SELECT * FROM users WHERE first_name LIKE %s 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

# CONTROLLER function
@app.route('/show/patients', methods=['GET', 'POST'])
def show_patients():
    if request.method == 'POST' and 'txtname' in request.form:
        name = request.form["txtname"]
        users = User.search(name)
    else:
        users = User.get_all()
    return render_template("searcher.html", users=users)

通过遵循这些建议,您应该能够使用LIKE子句以更安全和更有效的方式对MySQL数据库中的first_name列执行部分匹配。
我希望这个解释对你有用。

相关问题