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
Форумы портала PHP.SU :: Версия для печати :: Нужен совет
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Нужен совет

Страниц (2): [1] 2 »
 

1. Nikola - 14 Августа, 2009 - 16:36:27 - перейти к сообщению
Здравствуйте. Прошу совета по организации сайта. Только начал изучать PHP, опыта нет.
Хочу создать кулинарный сайт такого плана: пользователь вводит ингредиенты и делает запрос, а в ответ получает рецепты блюд, состоящие из указанных пользователем ингредиентов. Пользователь может добавлять рецепты.
Количество ингредиентов, которые введет пользователь, не известно. Список всех ингредиентов есть в базе, планирую его загружать в select, мыслю в сторону того, что пользователь выбирает в select ингредиент и жмет кнопку добавить, таким образом выбираются основные ингредиенты и отображаются в каком ни будь элементе (пусть текстарей). Затем пользователь нажимает кнопку запроса и производится поиск в базе рецептов, состоящих из указанных пользователем ингредиентов.

Не прошу писать код, просто нужен совет, как это организовать.
2. Ch_chov - 14 Августа, 2009 - 19:57:42 - перейти к сообщению
Посчтитай примерно сколько всего ингредиентов будет.
Выпадающий список будет огромный...
Разбей ингредиенты на категории: овощи, мясо, рыба и т.д. Для каждой категории сделай свой выпадающий список, который кстати можно сделать с множественным выбором (MULTIPLE).
3. Nikola - 14 Августа, 2009 - 20:39:54 - перейти к сообщению
Ch_chov
Идею понял большее спасибо, остается вопрос о том, как это писать в базу а затем каким запросом искать совпадение ингредиентов.
4. EuGen - 15 Августа, 2009 - 15:46:21 - перейти к сообщению
На входе у Вас (то есть у Вашего скрипта) будет список ингридиентов, которые ввел пользователь - вне зависимости от того, каким образом ввел.
В БД их хранить целесообразно как обычно - парой: идентификатор-значение. В данном случае значением будет просто название.
Рецепты - тоже таблица. С отношением "многие-ко-многим" с таблицей ингридиентов.
Организовать можно так - сама таблица рецептов - есть просто такой же список строк "идентификатор-значение". То есть номер рецепта-название рецепта.
Затем сделаете таблицу-связку, где будете хранить идентификатор рецепта-идентификатор ингридиента.
Для примера (не силен в кулинарной области) - есть рецепт "Яичница". В нее входят ингридиенты "яйцо", "молоко". Вот как будет выглядеть:
recepts
CODE (text):
скопировать код в буфер обмена
  1.  
  2. +-----------+---------+
  3. | recept_id |  title  |
  4. +-----------+---------+
  5. |     1     | Яичница |
  6. +-----------+---------+
  7.  


ingridients
CODE (text):
скопировать код в буфер обмена
  1.  
  2. +---------------+--------+
  3. | ingridient_id | title  |
  4. +---------------+--------+
  5. |       1       |  Яйцо  |
  6. +---------------+--------+
  7. |       2       | Молоко |
  8. +---------------+--------+
  9.  


recepts_ingridients
CODE (text):
скопировать код в буфер обмена
  1.  
  2. +-----------+---------------+
  3. | recept_id | ingridient_id |
  4. +-----------+---------------+
  5. |     1     |       1       |
  6. +-----------+---------------+
  7. |     1     |       2       |
  8. +-----------+---------------+
  9.  

Соответственно при поиске - нужно в таблице recepts_ingridients найти все идентификаторы рецептов, которые попадут в условие пользователя. Другими словами, мы найдем рецепты, в которые входит хотя бы один из указанных ингридиентов (слабое условие).

Вообще почитайте про теорию реляционных БД. Специально не привожу подхода на случай, если нужны рецепты, в которые входят все из указанных ингридиентов (задача чуть сложнее, найдете сами).
5. Nikola - 15 Августа, 2009 - 22:17:23 - перейти к сообщению
EuGen
Большое спасибо за помощь, дальше, я думаю, разберусь.
6. Nikola - 24 Августа, 2009 - 22:16:28 - перейти к сообщению
Ну вот я слепил свой первый сайт http://kitchen[dot]50gigs[dot]net/www/index.php его конечно нужно дорабатывать и наполнить немного. В меню поиск можно искать блюда, правда есть только одна запись в базе, поэтому можно выбрать : тип-второе, продукты-молоко коровье, яйца куриные. В меню добавить можно добавить рецепт. Вот только кнопочки не изменяются при нажатии и наведении, но может это из-за моего медленного жпрс интернета.
Код кнопочки:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <a href="index.php"><img src="../../www/res/11.png"
  3. onMouseOut=" this.src='../../www/res/11.png' " onMouseOver="this.src='../../www/res/12.png' " onMouseDown=" this.src='../../www/res/13.png'"  width="180" height="35">
  4.  


Структура базы:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. DROP TABLE IF EXISTS `data`;
  3. CREATE TABLE `data` (
  4.   `id` int(10) unsigned NOT NULL auto_increment,
  5.   `id_r` int(10) unsigned NOT NULL default '0',
  6.   `id_p` int(10) unsigned NOT NULL default '0',
  7.   `id_t` int(10) unsigned NOT NULL default '0',
  8.   PRIMARY KEY  (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
  10.  
  11. INSERT INTO `data` (`id`,`id_r`,`id_p`,`id_t`) VALUES
  12.  (1,1,25,2),
  13.  (2,1,21,2),
  14.  (3,6,1,2),
  15.  (4,6,2,2),
  16.  (5,6,6,2),
  17.  (6,6,23,2),
  18.  (7,6,25,2);
  19.  
  20.  
  21. DROP TABLE IF EXISTS `product`;
  22. CREATE TABLE `product` (
  23.   `id` int(10) unsigned NOT NULL auto_increment,
  24.   `name` varchar(45) NOT NULL default '',
  25.   `type` int(10) unsigned NOT NULL default '0',
  26.   PRIMARY KEY  (`id`)
  27. ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
  28.  
  29.  
  30. /*!40000 ALTER TABLE `product` DISABLE KEYS */;
  31. INSERT INTO `product` (`id`,`name`,`type`) VALUES
  32.  (1,'говядина',1),
  33.  (2,'свинина',1),
  34.  (3,'курица',1),
  35.  (4,'окунь',2),
  36.  (5,'карась',2),
  37.  (6,'семга',2),
  38.  (7,'сельдь',2),
  39.  (8,'огурец',3),
  40.  (9,'помидор',3),
  41.  (10,'капуста',3),
  42.  (11,'буряк',3),
  43.  (12,'яблуко',4),
  44.  (13,'груша',4),
  45.  (14,'апельсин',4),
  46.  (15,'лимон',4),
  47.  (16,'вишня',5),
  48.  (17,'черешня',5),
  49.  (18,'виноград',5),
  50.  (19,'клубника',5),
  51.  (20,'вода',6),
  52.  (21,'молоко коровье',6),
  53.  (22,'молоко козье',6),
  54.  (23,'вино красное',6),
  55.  (24,'вино белое',6),
  56.  (25,'яйцо куриное',7);
  57.  
  58. DROP TABLE IF EXISTS `recept`;
  59. CREATE TABLE `recept` (
  60.   `id` int(10) unsigned NOT NULL auto_increment,
  61.   `name` varchar(45) NOT NULL default '',
  62.   `text` text NOT NULL,
  63.   PRIMARY KEY  (`id`)
  64. ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
  65.  
  66. INSERT INTO `recept` (`id`,`name`,`text`) VALUES
  67.  (1,'яишница','яйца молоко коровье соль подсолнечное масло.
  68.  
  69. Рецепт...'),
  70.  (6,'test','    
  71.  
  72. sasdaassasdas\r\nasda\r\n\r\nas\r\nd\r\nas\r\nd\r\nasd\r\nas  
  73.  
  74.   ');
  75.  
  76.  
  77. DROP TABLE IF EXISTS `type`;
  78. CREATE TABLE `type` (
  79.   `id` int(10) unsigned NOT NULL auto_increment,
  80.   `name` varchar(45) NOT NULL default '',
  81.   PRIMARY KEY  (`id`)
  82. ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
  83.  
  84.  
  85. INSERT INTO `type` (`id`,`name`) VALUES
  86.  (1,'первое'),
  87.  (2,'второе'),
  88.  (3,'закуска'),
  89.  (4,'выпечка'),
  90.  (5,'дисерт'),
  91.  (6,'напиток');
  92.  
  93.  
  94. DROP TABLE IF EXISTS `vid`;
  95. CREATE TABLE `vid` (
  96.   `id` int(10) unsigned NOT NULL auto_increment,
  97.   `name` varchar(45) NOT NULL default '',
  98.   PRIMARY KEY  (`id`)
  99. ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
  100.  
  101.  
  102. INSERT INTO `vid` (`id`,`name`) VALUES
  103.  (1,'мясо'),
  104.  (2,'рыба'),
  105.  (3,'овощи'),
  106.  (4,'фрукты'),
  107.  (5,'ягоды'),
  108.  (6,'жидкости'),
  109.  (7,'другое');
  110.  


Еще раз большее спасибо за помощь, буду рад любой критике.
7. SAD - 24 Августа, 2009 - 22:24:19 - перейти к сообщению
bed, very bed.
десерт, а не дисерт
в продуктах разве не может быть выбор нескольких ингредиентов?
8. Nikola - 24 Августа, 2009 - 22:34:32 - перейти к сообщению
SAD
За грамматические ошибки извиняюсь, поправлю, а вот продукты можно выбирать зажимая Ctrl.
9. SAD - 24 Августа, 2009 - 22:41:34 - перейти к сообщению
Nikola пишет:
продукты можно выбирать зажимая Ctrl

сразу и не догадаешься
10. Nikola - 24 Августа, 2009 - 22:47:09 - перейти к сообщению
SAD пишет:
сразу и не догадаешься


Ну это нужно дописать, в таких случаях пишут что то типа: "для выбора нескольких элементов зажмите Ctrl".
11. SAD - 24 Августа, 2009 - 22:52:05 - перейти к сообщению
если честно, то дизайн выбора - не очень красив ,не удобен
12. Nikola - 24 Августа, 2009 - 22:55:10 - перейти к сообщению
SAD пишет:
то дизайн выбора - не очень красив ,не удобен

В чем именно и как, на Ваш взгляд, было бы лучше ? Я только начал заниматься web программированием, поэтому буду рад совету.
13. SAD - 24 Августа, 2009 - 23:10:39 - перейти к сообщению
да я и сам начинающий, просто с точки зрения пользователя не удобно.может для продуктов использовать типа скрытые списки. ну вобщем я не советчик.
14. EuGen - 25 Августа, 2009 - 01:01:02 - перейти к сообщению
SAD пишет:
bed, very bed.

А еще указываете на грамматические ошибки, когда сами их допускаете.

Автор может использовать комбобокс
15. Champion - 25 Августа, 2009 - 08:56:02 - перейти к сообщению
EuGen пишет:
SAD пишет:
bed, very bed.

А еще указываете на грамматические ошибки, когда сами их допускаете.
Может, он просто спать захотел?

А так, для первого сайта нормально. Функционал реализовывается, с БД простоые вещи смог выполнять. Теперь я бы отстранился от php и углубился в работу с БД, чтоб более уверено чувствовать такие вещи как вывод списков по категориям, добавление в БД из этих списков...

 

Powered by ExBB FM 1.0 RC1