За последние 24 часа нас посетили 17312 программистов и 1598 роботов. Сейчас ищет 1491 программист ...

Помогите с категориями

Тема в разделе "PHP для новичков", создана пользователем Ахмед, 22 апр 2020.

  1. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Привет всем , у меня в Бд добавлено несколько значений по select , вопрос : Как мне на странице с категориями вывести именно то число на которой я странице по get id


    Допустим в бд поле у меня значение 18, 20

    как мне получить именно 20
     
  2. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Попробуй еще раз прочитать свой вопрос и подумай легко ли остальным будет его понять.
     
    Valick нравится это.
  3. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @iceblood русский не его родной язык, если бы мне так отвечали на иностранных сайтах с гугл транслита, то все был бы печально.
    @Ахмед SELECT * FROM 'название таблицы' WHERE id = 'твой id'
    https://www.mysqltutorial.org/mysql-where/
     
  4. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Через select добавляю товару несколько категорий в поле бд , Например выбрал 2 категории с id 20 и Id 18 и выглядит это как 20, 18 , как мне сделать чтоб на странице по categories.pho?id=20 отображался товар . У меня он не отображается потому что у товара 2 категории надо сделать так чтоб в 2 категориях отображался товар
    --- Добавлено ---
    У товара 2 категории нужно чтоб в 2 категориях отображался товар
    --- Добавлено ---
    Я как понимаю надо сделать массив и вернуть значение айди , но не понимаю как реализовать
     
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Ахмед, у тебя нарушение первого закона нормализации БД. Поле должно быть атомарным для того, что бы можно было работать с данными на уровне СУРБД. Грубо говоря никаких значений через запятую "20,18" там быть не должно. Для этого существуют отношения. Один ко многим, многие к одному и многие ко многим.
     
  6. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    А как это реализовать с категориями первый раз встречаюсь , многое еще не знаю
     
  7. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Предположим у тебя есть таблица товары с уникальным ID и таблица категории с уникальным ID . Можно создать таблицу отношений (справочник) с уникальным ID и полями товар, категория. В справочник в поле товар помещать ID товара из таблицы товара а в поле категория помещать ID из таблицы категория. Так появиться возможность из справочника доставать как все товары нужной категории так и все категории в которых находиться товар. Как то так.
     
  8. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Я сделал категории я могу вывести товар в 1 категории , у меня не получается вывести в 2 категориях сразу
     
  9. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    вот честно, ты бы писал или уже на родном или на английском. Проще гуглом перевести твой вопрос, чем додумывать что ты хотел написать.
    что бы вывести один и тот же товар в разных категориях, твой товар должен иметь два родителя одновременно
    tb_category
    id | name
    1 | конфеты вкусные
    2 | конфеты на любителя

    tb_product
    id | name
    1 | Аленка
    2 | Мишутка
    3 | Белочка

    tb_parents
    id | cat | product
    1 | 1 | 2
    2 | 2 | 2
    3 | 1 | 1
    4 | 2 | 1

    в третьей таблице parents ты показываешь к какой категории относится продукт
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    Не, здесь кроме русского и английского другие языки нельзя использовать по правилам.

    @Ахмед Поищи типы отношений, как тебе уже подсказали. Надо подтянуть теорию. Может, попробуй поискать статьи на эту тему на родном языке. Три основных типа отношений между таблицами: один-к-одному, один-ко-многим, многие-ко-многим. У тебя как раз случай многие-ко-многим: у товара несколько категорий, у категории несколько товаров. Такое отношение реализуется через третью таблицу, как тебе уже подсказали. Ну и запросы потом чуть сложнее получаются, с join-ами.
    Код (Text):
    1.  
    2. select * from product join product_category on product_category.product_id = product.id where product_category.category_id = 2;
    Соответственно, одна таблица с полями товара (но поля категория там нету), вторая таблица - с полями категории, и третья таблица с полями product_id, category_id, которая отвечает за хранение связей между товарами и категориями.
     
  11. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Проиллюстрирую своё прошлое сообщение. Для лучшего усвоения попробуй создать тренировочную БД. Для примеров понадобиться mysql или maridb. Дамп базы будет во вложении. Ниже приведу код с комментариями и диаграмму отношений из которой должно стать понятно, что связь между категориями и продуктами производится через промежуточную таблицу. Разверни базу и выполни запросы приведенные ниже.

    Код (Text):
    1. create database ahmed;
    2. use ahmed
    3.  
    4. -- Предположим у тебя есть таблица товаров с уникальным ID
    5. create table  product(
    6.     id int not null auto_increment primary key ,
    7.     name text
    8. );
    9.  
    10. -- и таблица категорий с уникальным ID
    11. create table  category(
    12.     id int not null auto_increment primary key ,
    13.     name text
    14. );
    15.  
    16. -- Можно создать таблицу отношений (справочник) с уникальным ID и полями товар, категория.
    17. create table catalog
    18. (
    19.     id int auto_increment primary key,
    20.     category_id int  not null ,
    21.     product_id  int  not null ,
    22.     constraint catalog_category_id_fk
    23.         foreign key (id) references category (id),
    24.     constraint catalog_product_id_fk
    25.         foreign key (id) references product (id)
    26. );
    27.  
    28. -- Добавим четыре категории
    29. insert into category (name) values
    30. ('Напитки'), -- id 1
    31. ('Напитки алкогольные'), -- id 2
    32. ('Напитки безалкогольные'), -- id 3
    33. ('Закуски'); -- id 4
    34.  
    35. -- Добавим несколько товаров
    36. insert into product (name) values
    37. ('Кефир'), -- id 1
    38. ('Морс'), -- id 2
    39. ('Нарзан'), -- id 3
    40. ('Жигули'), -- id 4
    41. ('Партвейн 777'), -- id 5
    42. ('Сухарики'); -- id 6
    43.  
    44. -- Свяжем некоторые товары с категориями через справочник (он же каталог)
    45. insert into catalog (category_id, product_id) VALUES
    46. (1,2),
    47. (3,2),
    48. (1,3),
    49. (3,3),
    50. (1,5),
    51. (2,5),
    52. (4,6);
    53.  
    54. -- Теперь переходя к твоей задаче - вывести товар в двух категориях
    55. -- или по русски: вывести все категории в которых находится определенный товар.
    56. -- К примеру мы хотим узнать в какие категории входит товар "Морс"
    57. select product.`name` , category.`name` from product, category, catalog
    58. where product.name = "Морс"
    59.   and product.id = catalog.product_id
    60.   and category.id = category_id
    61.  
    62. -- Теперь мы хотим узнать в какие категории входит товар "Сухарики"
    63. select product.`name` , category.`name` from product, category, catalog
    64. where product.name = "Сухарики"
    65.   and product.id = catalog.product_id
    66.   and category.id = category_id
    67.  
    68. -- Изменим условие задачи и выведем все товары находящиеся в категории  "Напитки"
    69. select product.`name` , category.`name` from product, category, catalog
    70. where category.name = "Напитки"
    71.   and product.id = catalog.product_id
    72.   and category.id = category_id;
    73.  
    74. -- У нас есть товары еще не внесенные ни в одну из категорий. Найдем их.
    75. select product.`name` , category.`name` from product, category, catalog
    76. where  product.id <> catalog.product_id;
    77.  
    78. -- А теперь просмотрим весь каталог. Если сделать  select * from catalog
    79. -- увидим мало о чем говорящие цыфры. Вместо них подставим значения имен из
    80. -- таблиц  категорий и продуктов и отсортируем по наименованию категории.
    81. select catalog.id, category.`name`, product.`name`  from catalog, product, category
    82. where product.id = catalog.product_id
    83. and category.id = category_id order by category.name;
    diagram.png
     

    Вложения:

    • dump.sql.txt
      Размер файла:
      3,8 КБ
      Просмотров:
      3
    #11 iceblood, 25 апр 2020
    Последнее редактирование: 25 апр 2020
    SibBear нравится это.
  12. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Вроде понял как делать а я делал так в
    tb_product
    id | name | id_cat
    1 | Аленка | 20, 18
    2 | Мишутка | 20
    3 | Белочка| | 18

    такое возможно сделать ? Чтоб в 1 структуре было 2 категории
     
  13. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    это плохо плохо не гуд совсем и так делать не надо никогда
     
  14. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Спасибо всем за помощь
     
  15. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Ахмед, это грубейшая и самая распространённая ошибка начинающих программистов, которые считают, что немножко знаний по РНР открывают перед ним все двери. На самом деле изучение MySQL должно проходить вообще в отрыве от РНР и любого другого языка. Достаточно учебника и PhpMyAdmin. SQL это декларативный язык программирования, там существуют свои законы.
     
  16. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    :)
     
  17. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Как лучше связку сделать , при добавлении товара чтоб автоматом id заполнялось в parents
    --- Добавлено ---
    Id категории добавил а вот id товара как добавить авто инкремент стоит
     
  18. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    #18 iceblood, 25 апр 2020
    Последнее редактирование: 25 апр 2020
  19. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    никак, ручками вторым запросом получив id от первой вставки
     
  20. Ахмед

    Ахмед Новичок

    С нами с:
    22 апр 2020
    Сообщения:
    14
    Симпатии:
    0
    Я пользуюсь redbeanphp
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    Ну так в этой поделке есть связи, правда, какие-то странные: https://www.redbeanphp.com/index.php?p=/many_to_many

    Или с английским хуже чем с русским? Без русского программист может обойтись, если не планирует работать в России или общаться на русских форумах. Без английского - никак.
     
  22. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Создать хранимую процедуру можно если очень хочется )
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    Это вы ТСу предлагаете?
     
  24. iceblood

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

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    А это что такое ? )) Чет ни как до меня не дойдет )
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    ТС - топикстартер. И ему не до хранимых процедур :) Ему бы селект сделать :)