Member 14870365 Ответов: 3

Синтаксическая ошибка рядом с ")" @ строка 1


#! /usr/bin/env python3
print('Content-type: text/html\n')

import MySQLdb, cgi

def results_table(records):
    html = """ <!doctype html>
    <html>
    <head><meta charset="utf-8">
    <link rel="stylesheet" href="http://cgi.soic.indiana.edu/~dpierz/i211.css">
    <title>Employee Add</title></head>
        <body>
            <h1>New Employee Added!</h1>
            <table border='1' width='100%'>
           <tr><th>Employee_ID</th><th>Email</th><th>FirstName</th><th>LastName</th><th>Phone</th><th>Admin</th><th>Active</th></tr>
            {content}
            </table>
            <p><a href="EmployeeAdd.html">Go Back</a></p>
        </body>
    </html>"""

    table = ""
    for row in records:
            table += "<tr>"
            for item in row:
                table += "<td  align='center'>"+str(item)+"</td>"
            table += "</tr>"
    print(html.format(content = table))

form = cgi.FieldStorage()

email = form.getfirst("email", "")
first_name = form.getfirst("first_name", "")
last_name = form.getfirst("last_name", "")
phone = form.getfirst("phone", "")
admin = form.getfirst("admin", "")
active = form.getfirst("active", "")
    



try:				#Always surround .execute with a try!
        SQL = "INSERT INTO Employee (Email, First_name, Last_name,  Phone, Admin, Active)"
        SQL += "VALUES('" + email + "','" + first_name + "','" + last_name + "','" + phone + "','" + admin + "','" + active + "',);"
        cursor.execute(SQL)
        db_con.commit()            

        SQL = "SELECT * FROM Employee; "
        cursor.execute(SQL)
        results = cursor.fetchall()
except Exception as e:		#Here we handle the error
        print('<p>Something went wrong with the SQL!</p>')
        print(SQL)
        print("\nError:", e)
else:				#This runs if there was no error
        results_table(results)


Что я уже пробовал:

Нигде в коде не удается найти синтаксическую ошибку

0x01AA

В конце высказывания слишком много запятых.
Этот ...."','" + active + "',);"
должно быть ...."','" + active + "');"

3 Ответов

Рейтинг:
1

MadMyche

Как отметили Патрис и 0x01AA, вы должны следить за пробелами и другими разделителями. В вашем операторе нет пробела между значениями круглых скобок, а затем пустого значения в конце оператора
INSERT... , Active)VALUES(... '" + active + "',);"

Ничего особенного, и также, как указала Патрис; этот запрос уязвим для SQL-инъекции. Вот недавняя статья о том, как этого избежать
https://pynative.com/python-mysql-execute-parameterized-query-using-prepared-statement/[^]

Python параметризовал запрос и подготовил инструкцию для вставки данных в таблицу MySQL
Иногда вам нужно вставить переменную python в качестве значения столбца в запрос insert. Например, пользователь заполнил онлайн-форму и нажал кнопку Отправить. Таким образом, вам нужно вставить эти значения в таблицу MySQL, которую вы можете сделать с помощью параметризованного запроса. Во-первых, вам нужно ввести пользовательский ввод в переменную и передать эту переменную в запрос INSERT в качестве заполнителя ( %s ).


Maciej Los

5ed!

0x01AA

Я не знаю MariaDB, но я думаю, что и MariaDB не нуждается в пространстве там. Это больше похоже на то, что конец высказывания имеет запятую для многого "',);"

MadMyche

Я думаю, ты поймал что-то, что я пропустил. Обновление

0x01AA

"Ваше утверждение не имеет пробела между значениями круглых скобок": оно не нуждается в нем ;)
INSERT INTO(<Field List>)VALUES(<Value List>)работает также в MariaDB. Проверено здесь:
https://paiza.io/projects/cVqtF6OnXc4YFOrhHn5HJQ?language=mysql[^]

Рейтинг:
1

Maciej Los

Не ответ, а предложение.

Я бы посоветовал использовать PyPika · PyPI[^].

Почему?

Цитата:
Мотивация PyPika заключается в том, чтобы обеспечить простой интерфейс для построения SQL-запросов, не ограничивая гибкость рукописного SQL. Разработанный с учетом анализа данных, PyPika использует шаблон проектирования builder для построения запросов, чтобы избежать беспорядочного форматирования строк и конкатенации. Он также легко расширяется, чтобы в полной мере использовать специфические возможности поставщиков баз данных SQL.



Если вы хотите знать, как строить параметризованные запросы с помощью python, пожалуйста, прочтите это: Python to MariaDB Connector | MariaDB[^]

Примеры:
#select
cursor.execute("SELECT first_name,last_name FROM employees WHERE first_name=%s", (some_name,))
#insert
cursor.execute("INSERT INTO employees (first_name,last_name) VALUES (%s,%s)", (first_name, last_name))


Рейтинг:
0

Patrice T

Цитата:
Нигде в коде не удается найти синтаксическую ошибку

Синтаксическая ошибка в SQL-команду
Я бы начал с того, что:
SQL = "INSERT INTO Employee (Email, First_name, Last_name,  Phone, Admin, Active)"
'                                                                                ^ add a space here

Затем ваша SQL-команда подвергается инъекции.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Maciej Los

5ed!

Patrice T

Спасибо

0x01AA

Я не знаю MariaDB, но я думаю, что и MariaDB не нуждается в пространстве там. Это больше похоже на то, что конец высказывания имеет запятую для многого "',);"

Patrice T

Точный