1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Sergeo, 27 июл 2021.

Статус темы:
Закрыта.
  1. Автор темы
    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();
                }
            });
     
    Последнее редактирование: 27 июл 2021
  2. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    А где код получения id? На первый взгляд, ты тупо забыл кавычки.
     
  3. Автор темы
    Sergeo

    Sergeo Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Solomka
    Кавычки там присутствуют, метод я скину немного позже
     
  4. Автор темы
    Sergeo

    Sergeo Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Solomka
    Метод получения айди
    Код:
        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;
        }
     
  5. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    И где здесь кавычки, лол? Переменную ip в строке следует окружить, например, 'одинарными кавычками'.
    Вместо обычного Statement следует юзать PreparedStatement, как минимум для защиты от sql инъекций, да и просто вводом данных в запрос лучше заниматься самому драйверу. Конкретно в этом случае толку мало, но на будущее.
    Алсо, после завершения работы Statement следует закрывать (Statement#close()) во избежание утечек памяти. ResultSet тоже, но он сам закроется со Statement.
     
  6. Автор темы
    Sergeo

    Sergeo Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Solomka
    Огромное спасибо! Возьму на заметку.
     
Статус темы:
Закрыта.

Поделиться этой страницей