YOMANIGGA Ответов: 4

Проблема синтаксиса Sql с просьбой проверить мою версию SQL для использования рядом с обновлением ресторан set date= customerid= customername= totalc в строке 1


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  
        try { Class.forName("java.sql.DriverManager");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/12C","root","tiger"); 
            Statement stmt = con.createStatement(); {
                
             
               
                 String query="update restaurant set  Date="+dtf.getText()+", CustomerID="+iddtf.getText()+", CustomerName="+cntf.getText()+", TotalCost="+ttf.getText()+", PhoneNumber="+pntf.getText()+", Address="+atf.getText()+"where CustomerID="+idtf.getText()+";"; 
              
           stmt.executeUpdate(query);
                JOptionPane.showMessageDialog(this, "Record Updated");
            stmt.close();
                    con.close();
        } 
} catch(Exception e)
{ JOptionPane.showMessageDialog(null, e.getMessage());
} 
        // TODO add your handling code here:
    }                                        


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

Многие вещи, такие как изменение кодов

4 Ответов

Рейтинг:
2

YOMANIGGA

Спасибо братаны зафиксировал его в одинарные кавычки


Patrice T

примите полезные решения, поэтому вопрос будет закрыт как решенный.

Richard Deeming

Нет, это ты силовой это с одинарными кавычками. Вы оставили основную критическую уязвимость системы безопасности нетронутой.

Ваша база данных не выдержит и пяти минут в реальном мире. SQL-инъекция-это так просто, чтобы использовать, это может сделать и трехлетний ребенок[^].

Сделайте себе одолжение и прочитайте ссылки, которые предоставили другие. Затем вернитесь и исправьте свой код должным образом.

Рейтинг:
1

Afzaal Ahmad Zeeshan

В вашем SQL-операторе есть две ошибки:

String query="update restaurant set  Date="+dtf.getText()+", CustomerID="+iddtf.getText()+", CustomerName="+cntf.getText()+", TotalCost="+ttf.getText()+", PhoneNumber="+pntf.getText()+", Address="+atf.getText()+"where CustomerID="+idtf.getText()+";"; 
Во-первых: слишком плохо написано, чтобы понять, что там происходит, во-вторых: SQL-инъекция. Давайте попробуем решить первую проблему, и я позволю вам решить вторую самостоятельно.

Во-первых, ваш SQL явно не понятен. Что именно там происходит?
UPDATE [Restaurant] 
     SET Data           = 'date', -- see the single quotes around string data
         CustomerID     = '1',
         CustomerName   = 'Name',
         TotalCost      ='123',
         PhoneNumber    = '123456789',
         Address        = 'Some Street'
     WHERE CustomerId   = '1';
Может ли это иметь смысл? Конечно, это показывает, что вы пытаетесь сделать. В вашей сильно сцепленной строке ничего не имеет никакого смысла. Так что же делать? В Java вы можете использовать функцию String.format() для форматирования строк, но это не решает проблему. Для SQL вам нужно не только отформатировать строку, но и убедиться, что ваши строки не содержат каких—либо неанитизированных входных данных—что приводит к SQL-инъекции, см. ссылку, которую я предоставил, - и именно это я бы рекомендовал вам использовать.

Ваше решение состоит в том, чтобы просто процитировать данные, которые вы передаете, потому что они отсутствуют, а SQL требует этого вокруг строковых типов (если только вы не отправляете данные в собственных типах, которые я не вижу).

Проверьте, как этот параметризованный запрос работает в Java:
Использование подготовленных операторов (учебники Java™ > JDBC(TM) Database Access > JDBC Basics)[^]
java - передача параметров в JDBC PreparedStatement - переполнение стека[^]
метод executeQuery (java.lang.Строка) - SQL Server | Microsoft Docs[^]

Ты ведь понимаешь, в чем дело?

Подробнее о SQL-инъекции читайте здесь, SQL-инъекция - Википедия[^]


Рейтинг:
1

Patrice T

Ваша SQL команда подвержена SQL инъекции и имеет много других проблем:

Первым делом сохраните запрос в переменной и повторите его, чтобы увидеть, как он выглядит с пользовательскими данными. Отладчик тоже может помочь.
Если данные представляют собой строку, вам необходимо изменить запрос с

CustomerName="+cntf.getText()+",

к
CustomerName='"+cntf.getText()+"',

Одинарные кавычки говорят sql, что то, что находится между ними, не является sql.

Вам нужно пространство перед "где"
Address="+atf.getText()+"where 

Address="+atf.getText()+" where 

и котировки вокруг адреса клиента
Address='"+atf.getText()+"' where 

если дата-это не число, у вас есть и другая проблема.
Все это только для того, чтобы вы начали.
-----
String query="update restaurant set  Date="+dtf.getText()+", CustomerID="+iddtf.getText()+", CustomerName="+cntf.getText()+", TotalCost="+ttf.getText()+", PhoneNumber="+pntf.getText()+", Address="+atf.getText()+"where CustomerID="+idtf.getText()+";";

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


Рейтинг:
0

MadMyche

Из того, что я могу сказать, Похоже, что в вашем случае происходит то, что ни одно из значений, которые вы вводите, не присваивается как значения, поскольку они не заключены в одинарные кавычки

Я определенно могу сказать вам, что это не тот способ сделать; объединение строк и пользовательского ввода-это источник № 1 SQL-инъекции, и довольно грустно, что люди делают это каждый день, когда эта Топ-10 уязвимостей была идентифицирована более 20 лет назад.

Правильным способом сделать это было бы создать подготовленное заявление, который будет содержать текст вашего запроса и использовать заполнители для значения.
Следующим шагом к подготовке инструкции является присвоение значений этим заполнителям.

Я не являюсь разработчиком Java, но это должно помочь вам начать работу.

PreparedStatement updateStatement = null;

string updateQuery = "update restaurant set  Date = ?, CustomerID = ?, CustomerName = ?, TotalCost = ?, PhoneNumber = ?, Address = ? where CustomerID = ?";

try {
  // create the statement based off of query
  updateStatement = con.prepareStatement(updateQuery);

  // assign variables to the placeholders
  updateStatement.setString(1, dtf.getText());
  updateStatement.setString(2, iddtf.getText());
  updateStatement.setString(3, cntf.getText());
  updateStatement.setString(4, ttf.getText());
  updateStatement.setString(5, pntf.getText());
  updateStatement.setString(6, atf.getText());
  updateStatement.setString(7, idtf.getText());

  // execute the update
  updateStatement.executeUpdate();

Рекомендации:
Использование подготовленных операторов (учебники Java™ > JDBC(TM) Database Access > JDBC Basics)[^]
Java PreparedStatement - пример обновления SQL | alvinalexander.com[^]