Думаю, у каждого бывали моменты когда в бд надо хранить несколько однотипных данных. Предположим, зто будет ссылки на собственные страницы в разных сервисах. Сильно тут на нормализации не выиграешь, да и заранее известно что их (предположим) 3 и тогда мы дружно добавляем в инфу о юзере еще 3 поля: url1, url2, url3. Задачка больше чисто для примера - так что не придирайтесь =) И для заполнения этих полей юзеру предоставляется 3 инпут поля (чтобы не сильно париться). Предположим (юзерам никогда нельзя доверять) какой-нить нихороший заполнил только последнее поле, или первое и последнее. Ну, в общем, как-то некрасиво. Я решил хранить данные, как введены. А перед выводом ложить данные в красивый массив 0...х Я нашел для себя след выход. Будет ли это сильным извратом? PHP: <?php $data['urls'] = explode( "secret", preg_replace("/(secret)+/", "secret", implode("secret", array($row->url1, $row->url2, $row->url3) ) ); Как думаете? =)
То-есть у юзверя есть неизвестное кол-во полей для ввода и надо их как-то хранить, а перед этим проверять? А кол-во полей заранее известно или у каждого юзверя своё кол-во полей?
Hight заранее известно, что таких полей у любого юзера может быть не больше 3х, предположим Допиливать еще одну таблицу с урлами пользователей не хочется. А вывести их надо (при условии заполненности) 1. url1, 2. url2, 3. url3. И если будет не заполнено допустим, url1 будет немного некрасиво 1. , 2. url2, 3. url3.
Я бы сделал так (наверное): [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. Соответственное если поле не заполнено, то и загонять его в таблицу не нужно.
как-то не хочется делать еще одну таблицу, при условии что известно, что таких полей будет не больше 3х. Потом, чтобы обновить значение какого-нить урла надо будет знать ид записи с данными.
а что должно быть, если не заполнено какое-то из полей? просто игнорировать? или перенести все последующие на позицию выше? имею в виду, есть три поля. пользователь заполнил только 2 и 3, а 1 оставил пустым. значение 2-го должно встать на место 1-го, а 3-го - на место 2-го ? может тогда лучше сделать так? HTML: URL1: <input type="text" name="urls[]"> URL2: <input type="text" name="urls[]"> на стороне сервера будешь получать массив элементов PHP: <?php $urls = $_POST['urls']; $data = array(); foreacy($urls as $url){ if(!empty($url)) $data[] = $url; } ?>
Gromo я думал над такой реализацией. =) в принципе, тогда проблем с выводом нет. Но прикинь, я юзер. Заполнил 1 и 3е поле. Записал. Захожу посмотреть что же у меня заполнено, а тут мегоадмин подвинул за меня данные =) ууухх, я зол
Тогда просто пиши сериализованный массив в поле таблицы юзверей. Вот это: PHP: <?php $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 - поле не заполнено. Типа того.
Hight запихну серилизованное, ок. Вытяну, ансериализую. Получу массив "с дырками" (null) =) вывести надо 1. url1, 2. url3, если любого из значений не будет =) upd: а то что изврат - согласен =) Наверное все таки, при записи в бд чистить и сериализовать, чтобы одно поле было
а чего ожидает юзер? если поля идут строго привязанными к названиям/назначению, то да, тут двигать нельзя. а если это просто список ссылок, то какая разница в какой последовательности? я вообще подобное делаю на javascript. всего одно поле для заполнения, рядом кнопка "добавить", при нажатии на которую в список чуть ниже добавляется содержимое поля, а само поле обнуляется. просто если у тебя всего 3 поля, то это излишне
с произвольным количеством все гораздо проще согласен Hight, Gromo спасибо за беседу. Плохо когда не с кем покурить 5 минут. Почему у меня жена не кодер