За последние 24 часа нас посетили 58186 программистов и 1683 робота. Сейчас ищет 1321 программист ...

Подскажите правильно ли я удаляю пользователя из списка?

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 16 окт 2018.

  1. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день, есть таблица в ячейке которой хранятся ID пользователей через ;
    Мне нужно достать эту строку из таблицы, удалить пользователя и сделать update ячейки с оставшимися пользователями.
    Делаю так:
    PHP:
    1. function deleteUser($userID){
    2.    $this->db->select('user'); //ячейка с пользователями
    3.    $this->db->where('ip', $ip);   //необходимая мне строка
    4.    $query = $this->db->get('database');  // необходимая мне таблица
    5.    $row = $query->row(); //тащим строку
    6.    $split = preg_split("/;/", $row->Operator, -1, PREG_SPLIT_NO_EMPTY); // сплитим ;  ,без этого (-1, PREG_SPLIT_NO_EMPTY) оставался один пустой массив.
    7.    $result =""; //строка для заполнения
    8.    foreach (array_keys($split, $userID) as $key) {
    9.         unset($split[$key]);  // проходимся по массиву ищем нашего пользователя которого надо удалить, удаляем.
    10.    }
    11.    foreach ($split as $item) {
    12.        $result .= $item.';';  //вставляем оставшихся пользователей в строку через ;    
    13.    }
    14.    $this->db->set('user', $result);
    15.    $this->db->where('ip', $ip);
    16.    $this->db->update('database'); //вставляем все обратно
    17. }
    Меня тут смущает два foreach и вообще правильно ли все делаю? Работать работает все o_O
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Artur_hopf, какую СУБД используете?
    Кроме того:
    В массиве можно искать не перебором, функцией array_search()
    Ну и ещё есть функции implode() и explode()
     
    Artur_hopf нравится это.
  3. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Использую mssql, спасибо, переписал так:
    PHP:
    1. //вместо этого:
    2. foreach (array_keys($split, $userID) as $key) {
    3.      unset($split[$key]);
    4. }
    5.  
    6. //вот так:
    7. $key = array_search($userID, $split);
    8. unset($split[$key]);
    Только вопрос, если несколько совпадений(такого не бывает, но все же), то как array_search отработает?
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, хранение в одной ячейке нескольких значений это прямое нарушение первого закона нормализации БД. В 99% случаев - это говорит о неправильной архитектуре БД. И только 1% оставляю для сознательной денормализации, в 99% которой такое хранение не отменяет хранение тех же самых данных в нормальной форме. Да и то лишь в том случае когда актуальность данных не равна 100%.
     
  5. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Valick Да, перепишу когда нибудь, но там одновременно хранится не больше трех пользователей, пока так оставлю (что временно то постоянно =) )
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Там-же ясно написано: " и возвращает ключ первого найденного элемента в случае удачи". И ещё:
     
  7. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Sail понятно, спасибо.