У меня есть в моей базе данных MySqli таблица под названием «продукты».
Products TABLE
product_id | INT primary KEY
product_name | VARCHAR(50)
product_price | float
Из PHP я ввожу строки в таблицы продуктов следующим образом:
mysqli_query($con,"INSERT INTO products (product_id,product_name,product_price) VALUES
('$product_id','$product_name','$price')");
Пока все работает отлично. Теперь я хочу иметь вторую таблицу под названием «категория», эта таблица будет включать в себя все возможные категории, которые может иметь продукт.
В таблице категорий должны быть столбцы category_id и category_name.
Category TABLE
category_id | INT primary KEY
category_name | VARCHAR(50)
Я пытаюсь найти способ связать продукт с категорией в моем файле PHP.
for example:
$get=mysqli_query($con, "SELECT * FROM `category`");
while ($row = mysqli_fetch_assoc($get)) {
echo $row['category_name']; //...here show all the categories
//...
//.. pick the category that the product belong
$category_Selected= .....;
}?>
..... And make the connection (with INSERT? or something) between product and category
Я хочу иметь возможность, когда я выполняю поиск в таблице продуктов (для продукта X), отображать также и категорию, к которой он принадлежит (пока я могу показать Product_id, product_name и product_price)
Спасибо






Вы хотите присоединиться к своим столам.
Посмотрите здесь:
Присоединяйтесь к таблицам - w3schools
Синтаксис таблиц соединения MySQL
@Tim S спасибо за ваш ответ. Я пытаюсь использовать JOIN, но таким образом я не могу установить соединение INSERT. категория таблицы не имеет ROW "product_id", также таким образом (из моих попыток) я не могу <<сохранить>> каким-то образом событие, что продукт X принадлежит категории A и наоборот
если вы хотите создать отношение m:n, вам может понадобиться вспомогательная таблица, такая как «product_category_mn» с полями product_id и category_id. посмотрите здесь: dba.stackexchange.com/questions/151904/…
Если продукт может быть только в одной категории, вы можете добавить category_id в свою таблицу «Продукты».
Я бы предложил третью таблицу:
Product_category
id | PK
product_id | Foreign key to Products.id
category_id| Foreign key to Categories.id
Теперь каждый раз, когда вы вставляете продукт, вам нужно также получить идентификатор вашей категории и выполнить оператор вставки в таблицу Product_category.
Чтобы получить ваши данные, вы можете сделать что-то вроде этого:
$get=mysqli_query($con, "SELECT * FROM `category`");
while ($row = mysqli_fetch_assoc($get)) {
echo $row['category_name']; //...here show all the categories
$products=mysqli_query($con, "SELECT * FROM `Products` WHERE id IN
(SELECT product_id from Product_category WHERE category_id= ".(int)$row['category_id'] . ")");
while ($product = mysqli_fetch_assoc($products)) {
echo $product["product_name"] . ", " . $product["product_price"];
}
}
Приведенное выше утверждение является примером, вы можете использовать JOIN и подготовленные операторы.
Если вы решите изменить таблицу продуктов и добавить туда category_id, то пример кода будет таким:
$get=mysqli_query($con, "SELECT * FROM `category`");
while ($row = mysqli_fetch_assoc($get)) {
echo $row['category_name']; //...here show all the categories
$products=mysqli_query($con, "SELECT * FROM `Products` WHERE category_id = " . (int) $row["category_id"]);
while ($product = mysqli_fetch_assoc($products)) {
echo $product["product_name"] . ", " . $product["product_price"];
}
}
Как бы то ни было, ваша база данных не позволяет вам представить взаимосвязь между категориями и продуктами. Вам нужно будет изменить свой дизайн.
Я могу представить, что один продукт относится к категории, и что в одной категории может быть несколько продуктов.
Если это так, я бы рекомендовал создать таблицу categories для хранения категорий с (как минимум) столбцами category_id и category_name.
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(100)
);
В таблице продуктов вы хотите добавить столбец в таблицу products, в котором хранится ссылка на идентификатор соответствующей категории:
ALTER TABLE products ADD
COLUMN category_id INT
FOREIGN KEY (category_fk) REFERENCES categories(id) ON DELETE CASCADE;
С этим измененным дизайном базы данных, когда вы вставляете в products, вы передаете ссылку на категорию (можно ожидать, что пользователь вашего приложения выберет ее из какого-то выпадающего списка при создании продукта):
INSERT INTO products (product_id, product_name, product_price, category_id)
VALUES ( :product_id, :product_name, :price, :category_id );
И когда вы хотите отобразить продукт вместе с названием его категории, вы можете использовать простое JOIN:
SELECT p.*, c.category_name
FROM products p
INNER JOIN categories c ON c.category_id = p.category_id
WHERE p.produt_id = :product_id
PS: никогда не передавайте значения POSTed в ваши SQL-запросы следующим образом: это подвергает вас SQL-инъекциям (а также делает ваши запросы менее читабельными и эффективными). Я изменил запросы, чтобы использовать именованные параметры.
вы должны добавить столбец category_id в таблицу product, чтобы разрешить соединение между двумя таблицами, или добавить таблицу для управления связью между двумя таблицами.