За последние 24 часа нас посетили 59264 программиста и 1841 робот. Сейчас ищут 911 программистов ...

Упорядочить (упаковать) поля

Тема в разделе "PHP для новичков", создана пользователем ShamahN, 8 сен 2010.

  1. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Думаю, у каждого бывали моменты когда в бд надо хранить несколько однотипных данных. Предположим, зто будет ссылки на собственные страницы в разных сервисах. Сильно тут на нормализации не выиграешь, да и заранее известно что их (предположим) 3 и тогда мы дружно добавляем в инфу о юзере еще 3 поля:
    url1, url2, url3. Задачка больше чисто для примера - так что не придирайтесь =)
    И для заполнения этих полей юзеру предоставляется 3 инпут поля (чтобы не сильно париться). Предположим (юзерам никогда нельзя доверять) какой-нить нихороший заполнил только последнее поле, или первое и последнее. Ну, в общем, как-то некрасиво. Я решил хранить данные, как введены. А перед выводом ложить данные в красивый массив 0...х
    Я нашел для себя след выход. Будет ли это сильным извратом?
    PHP:
    1.  
    2. <?php
    3. $data['urls'] = explode( "secret",  preg_replace("/(secret)+/", "secret", implode("secret", array($row->url1, $row->url2, $row->url3) ) );
    Как думаете? =)
     
  2. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Наверное лучше 1 раз перед записью в бд их аккуратно сложить =)
     
  3. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    То-есть у юзверя есть неизвестное кол-во полей для ввода и надо их как-то хранить, а перед этим проверять? А кол-во полей заранее известно или у каждого юзверя своё кол-во полей?
     
  4. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Hight
    заранее известно, что таких полей у любого юзера может быть не больше 3х, предположим
    Допиливать еще одну таблицу с урлами пользователей не хочется.
    А вывести их надо (при условии заполненности)
    1. url1,
    2. url2,
    3. url3.

    И если будет не заполнено допустим, url1 будет немного некрасиво
    1. ,
    2. url2,
    3. url3.
     
  5. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Я бы сделал так (наверное):
    [sql]CREATE TABLE IF NOT EXISTS `users_data` (
    `user_id` int(11) DEFAULT NULL, /* понятне дело - айдишник юзверя */
    `name` varchar(255) DEFAULT NULL, /* название поля */
    `value` text /* значение поля */
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql]
    Если известны поля, то никаких проблем предварительно проверить их, я не вижу. А после проверки загнать в такую таблицу. Дёргать оттуда по айдишнику юзверя.

    upd. Соответственное если поле не заполнено, то и загонять его в таблицу не нужно.
     
  6. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    как-то не хочется делать еще одну таблицу, при условии что известно, что таких полей будет не больше 3х. Потом, чтобы обновить значение какого-нить урла надо будет знать ид записи с данными.
     
  7. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Hight
    тогда я еще немного подумаю) главное, что в моей реализации нет ничего преступного ;)
     
  8. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а что должно быть, если не заполнено какое-то из полей? просто игнорировать? или перенести все последующие на позицию выше?
    имею в виду, есть три поля. пользователь заполнил только 2 и 3, а 1 оставил пустым. значение 2-го должно встать на место 1-го, а 3-го - на место 2-го ?

    может тогда лучше сделать так?
    HTML:
    1.  
    2. URL1: <input type="text" name="urls[]">
    3. URL2: <input type="text" name="urls[]">
    4.  
    на стороне сервера будешь получать массив элементов
    PHP:
    1.  
    2. <?php
    3. $urls = $_POST['urls'];
    4. $data = array();
    5. foreacy($urls as $url){
    6.   if(!empty($url)) $data[] = $url;
    7. }
    8.  
    9. ?>
    10.  
     
  9. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Gromo
    я думал над такой реализацией. =) в принципе, тогда проблем с выводом нет. Но прикинь, я юзер. Заполнил 1 и 3е поле. Записал. Захожу посмотреть что же у меня заполнено, а тут мегоадмин подвинул за меня данные =) ууухх, я зол
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Тогда просто пиши сериализованный массив в поле таблицы юзверей.

    Вот это:
    PHP:
    1. <?php
    2. $data['urls'] = explode( "secret",  preg_replace("/(secret)+/", "secret", implode("secret", array($row->url1, $row->url2, $row->url3) ) );
    ИМХО - изврат =)

    Может загонять так: serialize(array('name1'->$url1, 'name2'->$url2, 'name3'->$url3));
    Пусть там будут null`ы, если null - поле не заполнено. Типа того.
     
  11. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Hight
    запихну серилизованное, ок. Вытяну, ансериализую. Получу массив "с дырками" (null) =) вывести надо

    1. url1,
    2. url3,
    если любого из значений не будет =)

    upd: а то что изврат - согласен =)

    Наверное все таки, при записи в бд чистить и сериализовать, чтобы одно поле было
     
  12. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а чего ожидает юзер?
    если поля идут строго привязанными к названиям/назначению, то да, тут двигать нельзя.
    а если это просто список ссылок, то какая разница в какой последовательности?

    я вообще подобное делаю на javascript.
    всего одно поле для заполнения, рядом кнопка "добавить", при нажатии на которую в список
    чуть ниже добавляется содержимое поля, а само поле обнуляется.
    просто если у тебя всего 3 поля, то это излишне :)
     
  13. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    с произвольным количеством все гораздо проще ;) согласен
    Hight, Gromo спасибо за беседу.
    Плохо когда не с кем покурить 5 минут. Почему у меня жена не кодер