На старте изучения 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