Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вывод нескольких переменных из БД в Цикле
Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Начал делать небольшой проект, при помощи книг и гугла справлялся, но в этот раз не приложу ума, что делать.
Говорю сразу - в php новичок, по этому в вопросе могу написать глупость.
Пусть в таблице "тт" есть 3 строки:
id - идентификатор проблемы
description - описание проблемы
equipments - идентификаторы оборудования, у которого есть проблемы (записывается как 1,33,43)
а в таблице equipments есть 2 строки:
id - идентификатор оборудования
name - название оборудования.
Допустим, я нахожусь на странице где выводится список ТТ, в каких то ТТ-шках указано одно оборудование, в каких то несколько, суть в том, чтобы вывести их название. Попробовал применить "foreach" в while, но последней ТТ был выведен список всего оборудования ...
а должно быть так:
Номер: 1 | Описание: описалово | Оборудование: сервер,
Номер: 2 | Описание: описалово | Оборудование: роутер,
Номер: 3 | Описание: описалово | Оборудование: коммутатор
Номер: 4 | Описание: описалово | Оборудование: cisco
Номер: 5 | Описание: описалово | Оборудование: dlink, магистраль (этот пример с несколькими железками)
I need help!!! ...
По факту там все намного сложнее, но чтобы вы не вникали, упростил все как мог.
Благодарен за любую помощь!
tuareg
Отправлено: 19 Декабря, 2011 - 22:46:26
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Если Вы еще далеко не ушли, есть возможность переделать БД, то надо это сделать.
Я бы сделал 3 таблицы(пишу по Вашим)
таблица тт:
id - идентификатор проблемы
description - описание проблемы
таблицу equipments: не трогать
И третья таблица(таблица связей)
id_tt-идентификатор проблемы(не автоинкремент!!!)
id_equipments -идентификаторы оборудования
И тут уже можно, как хочешь и что хочешь выводить.
dnbdrive
Отправлено: 19 Декабря, 2011 - 22:52:33
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Спасибо за столь быстрый ответ, но как на зло уже достаточно далеко ушел ( ...
а других способов никаких нет?
Подобный пример нашел в "не малоизвестном" движке DLE, вывод категорий (от туда я и применил этот способ) ... но как на зло не работает он нормально...
tuareg
Отправлено: 19 Декабря, 2011 - 23:06:35
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Вы только зря MySQL "насилуете", все равно потом придется переделывать.
есть же функции mysql_fetch_assoc() или mysql_fetch_row() зачем забивать код лишним текстом, а вообще в mysql слишком много всего ненужного есть которое тянется со старых версий расширения, не пора ли отказаться от него?
dnbdrive
Отправлено: 20 Декабря, 2011 - 14:29:09
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2011
есть же функции mysql_fetch_assoc() или mysql_fetch_row() зачем забивать код лишним текстом, а вообще в mysql слишком много всего ненужного есть которое тянется со старых версий расширения, не пора ли отказаться от него?
Спасибо, буду знать. Я программирую только месяц, вот и туплю ...
tuareg пишет:
. Получили строку типа 1,2. Сделали запрос id IN(1,2)===>id=1 OR id=2
вот с этого момента поподробнее ...
Попробовал сделать так:
`id` int(11)UNSIGNEDNOTNULLAUTO_INCREMENT,-- уникальный идентификатор услуги
`s_name` varchar(100)NOTNULLDEFAULT'',-- короткое название услуги
`s_fullname` varchar(500)NOTNULLDEFAULT'',-- полное название услуги
`s_description` text NOTNULL,-- описание услуги
`s_tariff`int(11)UNSIGNED(можно сделать mediumint и т.д)NOTNULLDEFAULT'0',-- стоимость услуги (сохраняется id группы тарифов)
`s_tariffing` ENUM('razovai','month')NOTNULLDEFAULT'razovai',-- тарификация услуги, где помесячная-1 или единоразовая-2(аналог, только более понятный человеку)
`id` int(11)NOTNULLAUTO_INCREMENT,-- уникальный идентификатор проблемы
`date_reg` timestamp NOTNULLDEFAULT CURRENT_TIMESTAMP,-- дата регистрации (создания) проблемного билета(при создании записи сам будет вставлять текущую дату и время)
`date_start` date NOTNULLDEFAULT'0000-00-00',-- дата начала решения проблемы
`date_end` date NOTNULLDEFAULT'0000-00-00',-- дата решения проблемы
`responsible` mediumint(8)UNSIGNEDNOTNULLDEFAULT'0',-- id ответственного за решение проблемы
`status` mediumint(8)UNSIGNEDNOTNULLDEFAULT'0',-- статус проблемы
`priority` mediumint(8)UNSIGNEDNOTNULLDEFAULT'0',-- приоритет проблемы
`description` text NOTNULL,-- подробное описание проблемы
`solution` text NOTNULL,-- способ решения проблемыы
id_prob int(11)UNSIGNEDNOTNULLDEFAULT'0',-- идентификатор проблемы
id_usl int(11)UNSIGNEDNOTNULLDEFAULT'0'-- идентификатор оборудования
Но это так вообще на вскидку. Все зависит, от Ваших требований(логики работы).
Что и как будет выдергиваться.
Ну на пример, во второй таблице оставить только описание и способ решения, а остальные данные вынести в еще одну таблицу и связать их по id, тут будет плюс если будут выборки по этим параметрам.(допустим по статусу проблемы или приоритету)
То что вам подсказали это индексы, но на данном этапе их делать нет смысла.
dnbdrive
Отправлено: 20 Декабря, 2011 - 16:09:01
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
tuareg пишет:
`date_reg` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, -- дата регистрации (создания) проблемного билета(при создании записи сам будет вставлять текущую дату и время)
То есть при создании записи, не нужно будет передавать текущую дату с помощью date()
tuareg пишет:
Ну на пример, во второй таблице оставить только описание и способ решения, а остальные данные вынести в еще одну таблицу и связать их по id, тут будет плюс если будут выборки по этим параметрам.(допустим по статусу проблемы или приоритету)
Я реализовал вывод проблем по статусу, с помощью swich и get, с этим вроде разобрался сразу, хотя возможно реализовать это еще проще, но не суть ...
по факту, на сколько я понял, для каждой связи нужно делать еще таблицу, или дотаточно одной таблицы, где будут все связи?
ну например пользователь:группа пользователя или клиент:услуга ... (Добавление)
ну учитывая мое нынешнее состояние отложу "пищу для мозга" на завтра ...
tuareg
Отправлено: 20 Декабря, 2011 - 16:35:42
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
dnbdrive пишет:
То есть при создании записи, не нужно будет передавать текущую дату с помощью date()
да только время сервера MySQL.
dnbdrive пишет:
Я реализовал вывод проблем по статусу, с помощью swich и get...
Идея не в том как вы реализовали у себя. MySQL плохо работает с таблицами где есть поля типа TEXT. Выборка идет медленнее.
dnbdrive пишет:
для каждой связи нужно делать еще таблицу, или дотаточно одной таблицы, где будут все связи
Если их количество одинаковое, то можно одну.
В третью таблицу, можно добавить связь с ответственным за решение проблемы(если он один).
Вообще все зависит от Ваших выборок.
Допустим есть 2 таблицы
страны ==>id,name
города===>id,parent,name
Одним простым запросом оптимально не вытащить
SELECT t1.id,t1.name,t2.id,t2.name FROM страны AS t1 INNERJOIN города AS t2 ON t1.id=t2.parent WHERE t1.id='idстраны';
Вот в этот запрос вернет
1 Россия 1 Новосибирск
1 Россия 2 Москва
...
1 Россия 50 Чита
Видно, что первые два столбика нужны только один раз, все остальное лишнее + объединение таблицы тоже не очень хорошо.
Я в таких случаях предпочитаю делать 2 простых запроса
1-запрос
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.