Как найти причину неожиданного токена при вставке в базу данных? - PullRequest
0 голосов
/ 05 января 2019

Я создаю функцию для добавления товара в свою базу данных, но продолжаю сталкиваться с неожиданной ошибкой токена при попытке добавить новый товар для одежды.

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

неожиданный токен: L требуется:)

- выходной журнал (L - ввод для текстового поля измерения в соответствующей форме).

public int addProduct(Product newProduct)
{
    String measurement = "NULL";
    int size = 0;

    if(newProduct.getClass().getSimpleName().equalsIgnoreCase("Clothing"))
    {

        Clothing newClothing = (Clothing)newProduct;
        measurement = "'" + newClothing.getMeasurement() + "'";
    }
    else
    {

        Footwear newFootwear = (Footwear)newProduct;
        size = newFootwear.getSize();
    }


    try (Connection conn = setupConnection())
    {                   

        String sql = "INSERT INTO  Products (ProductId, ProductName, Price, StockLevel, Measurement, Size) " +
                "VALUES " +
                "('" + 
                newProduct.getProductId() + "', '" +
                newProduct.getProductName() + "', '" + 
                newProduct.getPrice() + "', '" + 
                newProduct.getStockLevel() + "', '" + 
                measurement + "', '" + 
                size +
                "')";

        Statement stmt = conn.createStatement();   

        int rowsAffected = stmt.executeUpdate(sql);

        return rowsAffected;
    }
    catch(Exception ex)
    {
        String message = ex.getMessage();
        System.out.println(message);

        return 0;
    }
}      

Это код.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Ваш запрос выглядит хорошо, но ваши числовые значения вставляются как VarChar. Я предполагаю, что newProduct.getPrice и Size являются числовыми значениями. Числовые столбцы нельзя вставлять в одинарные кавычки.

0 голосов
/ 05 января 2019

Прежде всего, вы делаете очень плохую вещь с точки зрения безопасности SQL-инъекций, создавая оператор SQL String.

Вместо этого вы должны использовать PreparedStatement с параметрами.

и второе: из-за этого, если одно из ваших значений (Measurement?) Содержит символ ', у вас есть точная проблема с SQL-инъекцией :-) результирующий оператор SQL не работает.

Как пример: вы можете получить SQL (упрощенно)

INSERT INTO  Products (ProductId, Measurement) VALUES ('123', ' 25' x 15'') 

, что определенно дает вам ошибку, которую вы получили

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...