sergaunt
@sergaunt

Как правильно осуществить выборку из MySQL с помощью checkbox?

Начал изучать PHP и базы данных, столкнулся с банальным вопросом. На сайте игр есть форма, скажем, с 3-мя категориями: год выпуска, разработчик и страна разработки. У меня выходит БД на MySQL следующего вида:

CREATE TABLE IF NOT EXISTS `games` (
 `id` int(255) NOT NULL,
 `game_name` varchar(50) NOT NULL,
  KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `games` (`id`, `game_name`) VALUES
(1, 'Grand Theft Auto Vice City'),
(2, 'Counter Strike 1.6'),
(3, 'Fallout 2'),
(4, 'Minecraft');

CREATE TABLE IF NOT EXISTS `attributes` (
  `attr_id` int(50) NOT NULL,
  `attribute_name` varchar(255) NOT NULL,
  KEY (`attr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `attributes` (`attr_id`, `attribute_name`) VALUES
(1, 'release'),
(2, 'developer'),
(3, 'country');

CREATE TABLE IF NOT EXISTS `values` (
  `entity_id` int(255) NOT NULL,
  `attribute_id` int(50) NOT NULL,
  `value` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `values` (`entity_id`, `attribute_id`, `value`) VALUES
(1, 1, '2002'),
(1, 2, 'Rockstar'),
(1, 3, 'USA'),
(2, 1, '2000'),
(2, 2, 'Valve'),
(2, 3, 'USA'),
(3, 1, '1998'),
(3, 2, 'Black Isle Studios'),
(3, 3, 'USA'),
(4, 1, '2011'),
(4, 2, 'Mojang'),
(4, 3, 'Sweden');

ALTER TABLE `values`
  ADD CONSTRAINT `values_ibfk_1` FOREIGN KEY (`attribute_id`) REFERENCES `attributes` (`attr_id`),
  ADD CONSTRAINT `values_ibfk_2` FOREIGN KEY (`entity_id`) REFERENCES `games` (`id`);


Фильтр обрабатывает submit.php. Сейчас он такой:

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=games_db', 'root', '');
$opts = $_POST['filterOpts'];
$qMarks = str_repeat('?,', count($opts) - 1) . '?';

$statement = $pdo->prepare('SELECT games.game_name FROM games INNER JOIN values ON attribute_id = attributes.attr_id WHERE value IN ($qMarks)');
$statement->execute($opts);
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
$json = json_encode($results);
echo($json);
?>


Не совсем понимаю принцип фильтрации, отсюда и ошибка. Хочется самому понять принцип в тех же онлайн-магазинах. Вопрос баян, перерыто много, но до сих пор чего-то не хватает. Буду благодарен за любой совет или помощь.
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
@choupa
Архитектор (обычный, который строит)
Мне кажется, вы перемудрили с проектированием БД. Если у вас три фиксированных атрибута у игры, не проще ли их сделать тремя дополнительными колонками в таблице `games`?

CREATE TABLE IF NOT EXISTS `games` (
 `id` int(255) NOT NULL,
 `game_name` varchar(50) NOT NULL,
 `release` int(4) NOT NULL,
 `developer` varchar(50) NOT NULL,
 `country` varchar(50) NOT NULL,
  KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `games` (`id`, `game_name`, `release`, `developer`, `country`) VALUES
(1, 'Grand Theft Auto Vice City' , '2002', 'Rockstar', 'USA'),
(2, 'Counter Strike 1.6', '2000', 'Valve', 'USA'),
(3, 'Fallout 2', '1998', 'Black Isle Studios', 'USA'),
(4, 'Minecraft', '2011', 'Mojang', 'Sweden');
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы