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