В бд есть список продуктов, который выводится вот так: На сайте есть страничка добавления своего рецепта. Выбирать ингредиенты для рецепта можно из списка продуктов, имеющихся в бд. Например: Рецепт: "Сладко-солёная вода" Ингредиенты: Вода, Сахар, Соль Я понимаю, что можно сделать 100 полей и записать на столько полей, сколько ингредиентов выбрано. Но если я записываю все выбранные ингредиенты в одно поле (как на картинке), то как их потом так же вывести по отдельности эти id ингредиентов?
ну можно создать таблицу в которой будут ингредиенты с id, потом ещё таблицу в которой будет id ингредиента и id рецепта, сможешь по id рецепта выводить все ингредиенты, почитай книгу по mysql для начинающих, там должно быть такое
++ Лучше сделай отдельную таблицу, в которой будешь хранить ингредиенты, добавляя их при надобности. А вообще поможет split () и implode () - почитай о них. Ещё, не уверен, но, возможно, serialize () и unserialize ().
Тоже бы использовал функцию split, а id ингредиентов писал бы через запятую в поле Ingredients ('9,17,15') PHP: //допустим из запроса рецепта ты получил строку с id ингредиентов $ingredients = '9,17,15'; $arr = split(',',$ingredients); $sql = "select * from products_table where id = ".$arr[0]; foreach ($arr as &$value) { $sql = $sql." or id=".$value; } echo $sql; получаем запрос который выводит все продукты этого рецепта: Код (Text): select * from products_table where id = 9 or id=9 or id=17 or id=15
Всем спасибо! Вот такой код получился: Код (Text): $ingredients = preg_split("/[,]/", $db_recipes['ingredients']); $count = substr_count($db_recipes['ingredients'],','); for($i=0;$i<$count;$i++) { $db_products = mysqli_fetch_assoc(mysqli_query($db,"SELECT * FROM products WHERE id=".$ingredients[$i]."")); echo " /*продукт*/ "; }
Мне кажется вызывать запрос в цикле это расточительно(точно я не знаю, но думаю, что MySQL проще обработать один большой запрос, чем кучу мелких), поэтому я предпочитаю собрать запрос заранее, и лишь один раз его выполнить.
страно я сделал наборот лучше так 1 таблица рецепт, другая таблица для привязки к рецепту и узнаем рецепт и получаем 1 запрос к привязки требуемых вешей и количеств. и ответ! Не копируй =) Сделал через класс и хватит PHP: /** * @property string name * @property string icon * @property int life * @property int money * @property int level */ class Recipe extends \Data { protected function getFrom() { return 'recipes'; } protected $require = [ 'items' => [] ]; protected $result = [ 'items' => [] ]; /** * @return array */ public function getRequireItems() { if (!$this->require['items'] AND $this->id) { $res = \Core::getConnection()->prepare("SELECT * FROM `recipe_require_items` WHERE `recipe_id` = ?"); $res->execute([$this->id]); $this->require['items'] = $res->fetchAll(); } return $this->require['items']; } /** * @return array */ public function getResultItems() { if (!$this->result['items'] AND $this->id) { $res = \Core::getConnection()->prepare("SELECT * FROM `recipe_result_items` WHERE `recipe_id` = ?"); $res->execute([$this->id]); $this->result['items'] = $res->fetchAll(); } return $this->result['items']; } /** * @return string */ public function getName() { return $this->name; } } Вызвал нужный рецепт $recipe = new Recipe(1) где 1 id рецепта а дальше $recipe->getRequireItems() получаем массив нужгный предмет то есть продукты и работай!
Действительно. Тогда хранить id ингредиентов так : ingredients('_9_17_15_') А выборку через like : Код (Text): SELECT * FROM `recipe` WHERE ingredients like '%_9_%'
нельзя, используюя индексы. Без индексов операции в бд это тупо перебор всех записей, и поиск подстроки в каждой записи. Каждый раз заново. Каждую строку. Это уже не БД.
Точнее очень плохое. Не только на уровне PHP но и самого SQL, к тому же если уже используется ENUM или SET, а LIKE - так тут вообще no comments. А если еще и все вместе использовать, процесс не остановить... И говнокодить классами не нужно --- Добавлено --- Ебаный ваш лимит. 20 минут. я писал отошел, дописал - отправил. Все крокодилы улетели в африку
Значит завести поле с перечислением id рецептов, которые используют этот ингредиент, в таблице ингредиентов? Так будет тру?