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

Помогите удалить все строки из бд

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

  1. Автор темы
    reZero

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

    Баллы:
    76
    Сразу извиняюсь за, возможно, очень глупый вопрос, но погуглив, а скорее всего я плохо искал, я ничего толкового не нашел...
    Допустим, у меня есть таблица с полями( name | x | y | z | nameTwo | nameThree )
    Какой командой можно удалить все эти поля, если известен name ?
    Возможно я не правильно выразился, но я надеюсь, что вы меня поймете
     
  2. DeethzzCoder

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

    Баллы:
    76
    Что-то типо такого.
    Код:
    DELETE FROM table WHERE name = 'name';
     
  3. Автор темы
    reZero

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

    Баллы:
    76
    Не совсем то, что мне надо...

    Вот у меня таблица
    upload_2018-11-27_22-45-58.png
    Мне нужно, чтобы при вводе команды с аргументом из столбца name, удалялись все значения для этого name (name, x, y, z, yaw, pitch), то есть, если проще, то просто удалить одну строчку из списка.
    Приведу пример: Игрок вводит команду /remove jail2, из таблицы должен удалится этот jail2 вместе с другими полями (x, y, z, yaw, pitch)
     
  4. DeethzzCoder

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

    Баллы:
    76
    Ну так это и происходит в этом запросе.
     
  5. Автор темы
    reZero

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

    Баллы:
    76
    Чет ваще туплю, никак не врублюсь
    PHP:
    PreparedStatement delete sql.getConnection().prepareStatement("DELETE FROM JailInfo WHERE name="+name);
                
    delete.executeUpdate();  //name - это аргумент команды       
    PHP:
    [23:54:13] [Server thread/WARN]: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionUnknown column 'jail' in 'where clause'
    [23:54:13] [Server thread/WARN]:     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    [
    23:54:13] [Server thread/WARN]:     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    [
    23:54:13] [Server thread/WARN]:     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    [
    23:54:13] [Server thread/WARN]:     at java.lang.reflect.Constructor.newInstance(Unknown Source)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.Util.getInstance(Util.java:408)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098)
    [
    23:54:13] [Server thread/WARN]:     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
    [
    23:54:13] [Server thread/WARN]:     at ru.ReZero.JS.Utils.JailManager.removeJail(JailManager.java:75)
    [
    23:54:13] [Server thread/WARN]:     at ru.ReZero.JS.Commands.RemovePrison.onCommand(RemovePrison.java:43)
    [
    23:54:13] [Server thread/WARN]:     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    [
    23:54:13] [Server thread/WARN]:     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
    [
    23:54:13] [Server thread/WARN]:     at org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchCommand(CraftServer.java:650)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.PlayerConnection.handleCommand(PlayerConnection.java:1354)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:1189)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13)
    [
    23:54:13] [Server thread/WARN]:     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    [
    23:54:13] [Server thread/WARN]:     at java.util.concurrent.FutureTask.run(Unknown Source)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:747)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678)
    [
    23:54:13] [Server thread/WARN]:     at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576)
    [
    23:54:13] [Server thread/WARN]:     at java.lang.Thread.run(Unknown Source)
    upload_2018-11-27_23-57-28.png
     
  6. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    А для чего тут используется препаред стейтмент
     
  7. Nikolai_Faint

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

    Баллы:
    96
    Для таких целей придумали id.
    PHP:
    //Создаем таблицу и называем её
    CREATE TABLE `MyTestName` (
        
    //1 столбик идёт как id. Мы сюда ничего не пишем
        
    `id`    int PRIMARY KEY AUTOINCREMENT,
        
    //2 столбик jail. В нём будет хранится название тюрьмы, а так же если запрос имеет пустое обращение, то он будет сброшен, ибо стоит параметр NOT NULL
        
    `jail`    varchar(255NOT NULL
    );
    PHP:
    //Вставляем данные в нашу таблицу. jail - столбик, test - значение.
    INSERT INTO `MyTestName` (jailvalues ('test');
    upload_2018-11-28_5-31-32.png
    PHP:
    //Удаляем данные с таблицы (Вместо 1 подставляешь свое значение)
    DELETE from `MyTestNamewhere `id`='1';
    p.s Если проект не использует для Jail 2 и более серверов, а так же там нет синхронизированной информации, я настоятельно рекомендую использовать SQLite.
     
    Последнее редактирование: 28 ноя 2018
  8. Nikolai_Faint

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

    Баллы:
    96
    Привел как использование локальной базы данных, он может поставить и другую, это просто пример.
     
  9. Code

    Code Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    у тебя кавычек не хватает вокруг строки
    Код:
    PreparedStatement delete = sql.getConnection().prepareStatement("DELETE FROM JailInfo WHERE name='" + name + "'");
    delete.executeUpdate();
    
    либо можно сделать еще лучше
    Код:
    PreparedStatement delete = sql.getConnection().prepareStatement("DELETE FROM JailInfo WHERE name=?");
    delete.setString(1, name);
    delete.executeUpdate();
    
    а остальных дурачков не слушай, они походу на своей волне
     
  10. Nikolai_Faint

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

    Баллы:
    96
    +++ полностью с тобой согласен! Куда лучше юзать удаление по имени, чем по ID.
     
  11. Code

    Code Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    то есть когда вводят /remove jail2
    ты предлагаешь сначала селекнтуть его id? а потом удалить по id?
    или хранить маппинг id на name? предлагаешь, так предлагай до конца. а то советчиков много, а толку мало
    наверно потому что топикстартер именно этого и хочет? а не ваши все советы как всё непонятно зачем переписать
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Да хер его знает. Короче сами без меня.
     
  13. Nikolai_Faint

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

    Баллы:
    96
    Я предлагаю сделать систему вывода по команде /jail list, а потом определив id для удаления, удалить его из базы данных командой к примеру /jail delete 2 (Где 2 это наш id)
     
  14. Автор темы
    reZero

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

    Баллы:
    76
    Всем спасибо, реально просто забыл переменную кавычками обнести =(
    Также учту ваши предложения)
    Есть еще у меня один вопрос, спрошу тут чтоб новую тему не плодить.
    Вот у меня есть класс с подключением к бд
    PHP:
        private Connection connection;
        private 
    String hostdatabaseusernamepassword;
        private 
    int port;
        public 
    ConnectSQL(String hostString databaseString usernameString passwordint port)
        {
            
    this.host host;
            
    this.database database;
            
    this.username username;
            
    this.password password;
            
    this.port port;
            
    setupMySQL();
        }
      
        public 
    void setupMySQL()
        {
            try
            {
                
    synchronized(Main.getInstance())
                {
                    if(
    getConnection() != null && !getConnection().isClosed())
                    {
                        return;
                    }
                    Class.
    forName("com.mysql.jdbc.Driver");
                    
    setConnection((ConnectionDriverManager.getConnection("jdbc:mysql://"+this.host+":"+this.port+"/"+this.databasethis.usernamethis.password));
                    
    Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN "MYSQL CONNECTED SUCCESSFUL");
                }
            }
            catch(
    SQLException e)
            {
                
    e.printStackTrace();
            }
            catch(
    ClassNotFoundException e)
            {
                
    e.printStackTrace();
            }
        }
      
        public 
    Connection getConnection()
        {
            return 
    connection;
        }
      
        public 
    void setConnection(Connection connection)
        {
            
    this.connection connection;
        }
    Когда плагин включается, я подключаюсь таким способом
    PHP:
    private ConnectSQL sql = new ConnectSQL(Main.getInstance().getConfig().getString("MySQL.host"), Main.getInstance().getConfig().getString("MySQL.database"), Main.getInstance().getConfig().getString("MySQL.username"), Main.getInstance().getConfig().getString("MySQL.password"), Main.getInstance().getConfig().getInt("MySQL.port"));
    sql.setupMySQL();
    Но при взаимодействии с бд (например мне нужно было записать в бд инфу) мне sql.getConnection() выдавал npe, то есть, как я понял, не было соединения с бд..
    Теперь при обращении к бд у меня всегда запускается метод setupMySQL() из первого спойлера и все вроде работает нормально...
    В чем суть вопроса.. Я делаю что-то не так? Так и должно быть? Или мне нужно каким-то образом поддерживать подключение к бд?
     
    Последнее редактирование: 28 ноя 2018
  15. Klavy

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

    Баллы:
    66
    Ты метод то свой не запросил. У тебя только instance класса есть, а в нём переменная connection так и осталась null, ибо дефайнит у тебя её метод, который ты благополучно забыл запросить

    Код:
    private ConnectSQL sql = new ConnectSQL(Main.getInstance().getConfig().getString("MySQL.host"), Main.getInstance().getConfig().getString("MySQL.database"), Main.getInstance().getConfig().getString("MySQL.username"), Main.getInstance().getConfig().getString("MySQL.password"), Main.getInstance().getConfig().getInt("MySQL.port"));
    sql.setupMySQL();
     
  16. Автор темы
    reZero

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

    Баллы:
    76
    Я просто не дописал выше. Я при включении получаю sql и через него вызываю setupMySQL()
     
  17. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
    public class MySQL implements Database {
        private Connection conn;
    
        public MySQL(String url, String dbName, String user, String pass) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection(
                        "jdbc:mysql://" + url + "/" + dbName + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true",
                        user, pass);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
  18. Автор темы
    reZero

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

    Баллы:
    76
    И что тут отличается от моего метода, кроме того что ты конектишься в конструкторе?
    Все равно у меня при каждом запросе заново конектиться к mysql
     
  19. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ого, умный наверно? При каждом запросе заново создавать коннект)
     
  20. Автор темы
    reZero

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

    Баллы:
    76
    Так я и спрашиваю, плохо это или нет. Я сразу начал подозрнвать что что-то делаю не так, поэтому и спрашиваю здесь. Как правильно делать?
     

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