Помогите Ошибка конвертанции ip

  • Автор темы Автор темы Sergeo
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Sergeo

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Solomka
Сама ошибка
Код:
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "какой.то.ай.пи" - Cпециально сделано так
Data conversion error converting "какой.то.ай.пи"; SQL statement:
SELECT id FROM USERS WHERE ip = какой.то.ай.пи [22018-200]

Caused by: java.lang.NumberFormatException: Character array contains more than one decimal point.
    at java.base/java.math.BigDecimal.<init>(BigDecimal.java:493)
    at java.base/java.math.BigDecimal.<init>(BigDecimal.java:402)
    at org.h2.command.Parser.readDecimal(Parser.java:5348)

Тип строки `ip` VARCHAR(15)


Код:
        statement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + DB_FILE + "` (" +
                "`id` INT NOT NULL AUTO_INCREMENT, " +
                "`login` VARCHAR(15) NOT NULL, " +
                "`password` VARCHAR(10) NOT NULL, " +
                "`permission` VARCHAR(45) NOT NULL, " +
                "`banned` TINYINT NOT NULL, " +
                "`ip` VARCHAR(15) NOT NULL, " +
                "PRIMARY KEY (`id`))");
    }

Само получение айпи адреса:

Код:
    public String checkIp() {
        URL url;
        BufferedReader in;
        String ipAddress = null;
        try {
            url = new URL("http://bot.whatismyipaddress.com");
            in = new BufferedReader(new InputStreamReader(url.openStream()));
            ipAddress = in.readLine().trim();
            if (!(ipAddress.length() > 0)) {
                try {
                    InetAddress ip = InetAddress.getLocalHost();
                    ipAddress = (ip.getHostAddress());
                } catch (Exception exp) {
                    exp.printStackTrace();
                    return null;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        assert ipAddress != null;
        return ipAddress;
    }

Занесение в таблицу

Код:
            try {
                DatabaseHandler db = new DatabaseHandler();

                db.addUser(login.getText().trim(), password.getText().trim(), Groups.USER.getS(), false, new Ip().checkIp());

                window.closeWindow(singUpButton);
                window.openWindow("/launcher/files/launcher.fxml", "PIXEL LAUNCHER", 708, 417);
            } catch (SQLException | ClassNotFoundException | InvocationTargetException
                    | NoSuchMethodException | InstantiationException
                    | IllegalAccessException e) {
                e.printStackTrace();
            }


Ошибка вылезает при попытке получить логин пользователя в таблице

Код:
        lk.setOnMouseExited(event -> {
            lk.setUnderline(false);
            lk.setText("Личный кабинет");
        });

        lk.setOnMouseEntered(event -> {
            lk.setUnderline(true);
            try {
                lk.setText("Здравствуйте, " + db.getUserLogin(String.valueOf(db.getUserId(new Ip().checkIp()))));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });
 
Последнее редактирование:
А где код получения id? На первый взгляд, ты тупо забыл кавычки.
Метод получения айди
Код:
    public int getUserId(String ip) throws SQLException {
        String get = "SELECT id FROM " + DB_FILE + " WHERE ip = " + ip;
        Statement stmt = getConnection().createStatement();
        ResultSet rs = stmt.executeQuery(get);
        while (rs.next()) return rs.getInt("id");

        return 0;
    }
 
Метод получения айди
Код:
    public int getUserId(String ip) throws SQLException {
        String get = "SELECT id FROM " + DB_FILE + " WHERE ip = " + ip;
        Statement stmt = getConnection().createStatement();
        ResultSet rs = stmt.executeQuery(get);
        while (rs.next()) return rs.getInt("id");

        return 0;
    }
И где здесь кавычки, лол? Переменную ip в строке следует окружить, например, 'одинарными кавычками'.
Вместо обычного Statement следует юзать PreparedStatement, как минимум для защиты от sql инъекций, да и просто вводом данных в запрос лучше заниматься самому драйверу. Конкретно в этом случае толку мало, но на будущее.
Алсо, после завершения работы Statement следует закрывать (Statement#close()) во избежание утечек памяти. ResultSet тоже, но он сам закроется со Statement.
 
И где здесь кавычки, лол? Переменную ip в строке следует окружить, например, 'одинарными кавычками'.
Вместо обычного Statement следует юзать PreparedStatement, как минимум для защиты от sql инъекций, да и просто вводом данных в запрос лучше заниматься самому драйверу. Конкретно в этом случае толку мало, но на будущее.
Алсо, после завершения работы Statement следует закрывать (Statement#close()) во избежание утечек памяти. ResultSet тоже, но он сам закроется со Statement.
Огромное спасибо! Возьму на заметку.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх