MySQLdb._exceptions.ProgrammingError - PullRequest
0 голосов
/ 11 января 2020

Это мой исходный код:

@app.route('/pythonlogin/register', methods=['GET', 'POST'])
def register():
    # Output message if something goes wrong...
    msg = ''
    # Check if "username", "password" and "email" POST requests exist (user submitted form)
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form and 'email' in request.form:
        # Create variables for easy access
        username = request.form['username']
        password = request.form['password']
        email = request.form['email']
                # Check if account exists using MySQL
        cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        cursor.execute("SELECT * FROM accounts WHERE username = %s", (username))
        account = cursor.fetchone()
        # If account exists show error and validation checks
        if account:
            msg = 'Account already exists!'
        elif not re.match(r'[^@]+@[^@]+\.[^@]+', email):
            msg = 'Invalid email address!'
        elif not re.match(r'[A-Za-z0-9]+', username):
            msg = 'Username must contain only characters and numbers!'
        elif not username or not password or not email:
            msg = 'Please fill out the form!'
        else:
            # Account doesnt exists and the form data is valid, now insert new account into accounts table
            cursor.execute("INSERT INTO accounts VALUES (NULL, %s, %s, %s)", (username, password, email))
            mysql.connection.commit()
            msg = 'You have successfully registered!'
    elif request.method == 'POST':
        # Form is empty... (no POST data)
        msg = 'Please fill out the form!'
    # Show registration form with message (if any)
    return render_template('register.html', msg=msg)

Я не могу понять, почему я получаю эту ошибку, мой логин работает нормально, но у меня в реестре такая маленькая проблема, я запускаю на сервере myswl, спасибо за ваше время

1 Ответ

0 голосов
/ 11 января 2020

Существует небольшая проблема с вашим первым запросом.

cursor.execute("SELECT * FROM accounts WHERE username = %s", (username))

Это распаковывает значения, переданные в качестве второго параметра, и помещает их в ваш запрос, обычно это делается с помощью кортеж Похоже, это именно то, что вы намеревались, однако здесь есть небольшая, но очень важная часть. Кортежу с одним значением требуется конечная запятая, т.е. (username,), иначе это всего лишь скобки вокруг вашей строки. В связи с этим ваша строка фактически распаковывается, и каждый символ передается в качестве аргумента в ваш запрос!

TL; DR

Для передачи необходимо добавить запятую в конце кортеж, а не строка в качестве аргумента.

cursor.execute("SELECT * FROM accounts WHERE username = %s", (username,))

...