Блог-шпаргалка

Картинка

PHP & SQL. Связи двух таблиц на примере

Категория -> кодинг
Обновлено: 2025-06-09

На старте изучения web-программирования, я часто сталкивался с трудностями размещения на форме выпадающего списка, а если быть более точным, то организации функционала выпадающего списка, в котором выбор должен быть из другой таблицы. В связи с этим решил написать мануал по созданию небольшого web-приложения как примера, которое будет демонстрировать добавление в базу данных комплектующих (запчастей) обычной, ни чем не отличающейся авторазборки.

Погнали…

Предварительно мы уже подготовили контейнер, в котором из необходимых сервисов у нас есть СУБД (я взял Postgres) и Apache+PHP.

Проваливаемся в контейнер с постгрёй

docker compose exec <имяКонтейнераСбазулей> bash

Запускаем psql

psql -U <имяПользователя> -d <БазуляИмяКоторойЕстьВдокерКомпоз>

Создадим таблицу марок авто

CREATE TABLE car_brand (
  id SERIAL PRIMARY KEY,
  title VARCHAR(50) NOT NULL
);

Создадим таблицу деталей и сделаем связь с предыдущей таблицей по типу «Один-ко-многим»

CREATE TABLE details (
  id SERIAL PRIMARY KEY,
  title VARCHAR(100) NOT NULL,
  id_car_brand INTEGER REFERENCES car_brand(id)
);

Предлагаю добавить сразу несколько марок автомобилей в таблицу car_brand

INSERT INTO car_brand (name) VALUES
  ('Honda'),
  ('Mazda'),
  ('Nissan'),
  ('Toyota');

В корне проекта создаём файл с подключением к базуле по типу того, как мы это делали -> тут <- и в корне же проекта набросам форму добавления запчастей уже с подготовленным запросом, который будет отображать марки автомобилей в выпадающем списке

<form action="/" method="POST">
	<label>Наименование</label>
	<input type="text" name="title">
	<br>
	<>Марка автомобиля</label>
	<select name="select">
	<?php
	$sql = "SELECT * FROM car_brand";
	$stmt = $dbconnect->prepare($sql);
	$stmt->execute();
	foreach ($stmt as $value) {?>
		<option value="<?=$value['id']?>"><?=$value['name']?></option>
	<?php }	?>
	</select>
	<button>Добавить</button>
</form>

Не забываем в самом верху заинклюдить файл с подключением к БД, в противном случае, вместо выполненного запроса, ты увидишь хуй

Если руки у тебя не из жопы и есть понимание как работает СУБД и PHP у тебя всё должно получиться, так как мелочи я тут не собираюсь объяснять 😃

Давай теперь займёмся механизмом добавления записей в базулю

В самом верху, под инклюдом к БД, разместим следующий подготовленный и параметризированный запрос

if (isset($_POST['title'])) {
	$sql = "INSERT INTO details (title, id_car_brand) VALUES (:title, :id_car_brand)";
	$stmt = $dbconnect->prepare($sql);
	$arrData = [
		"title" => $_POST['title'],
		"id_car_brand" => $_POST['select']
	];
	$result = $stmt->execute($arrData);
	if ($result) {
		header("Location: / ");
	}
}

Теперь, у нас уже есть рабочий вариант добавления записей в базу данных, но нам же ещё надо видеть, что у нас есть в базе, при этом, стандартный запрос нам не подойдёт. Почему? Да блять потому что выше мы делали связь двух таблиц по внешнему ключу. С обычным запросом, на выходе, вместо наименования марки авто, мы получим цифру. Чтобы это исправить, воспользуемся оператором JOIN.

$sql = "SELECT details.title, car_brand.name
FROM details
JOIN car_brand ON details.id_car_brand = car_brand.id";
$stmt = $dbconnect->prepare($sql);
$stmt->execute();
foreach ($stmt as $value) {
	echo $value['title'] . ' - ' . $value['name'];
	echo '<br>';
}

Готово! Только ты видишь перед собой кусок говна, но этот кусок говна рабочий! Не брезгая берём его в руки и красиво лепим то, что хотим на выходе по пути обмазывая это всё html и css