курсач. Г ичных webприложений
Скачать 2.94 Mb.
|
Таблица 3 - Таблица БД motherboard (Продолжение)
Таблица motherboard_slots – предназначена для хранения всех имеющихся слотов различных видеокарт. Таблица 4 – Таблица БД motherboard_slots
Таблица Соотнош_Мат_Разъем – предназначена для взаимосвязи таблицы 3 и таблицы 4, т.е., хранит соотношение материнской платы, уникальный ключ, который передается и различных слотов, уникальный ключ которых так же передается и их количество. Таблица 5- Таблица БД Соотнош_Мат_Разъем
Таблица 5- ТаблицаБД Соотнош_Мат_Разъем (Продолжение)
Таблица RAM – предназначена для хранения данных об оперативной памяти. Название таблицы в базе данных – `RAM`. Таблица 6 - Таблица БД RAM
Таблица power_supply – предназначена для хранения данных о блоке питания. Таблица 7 – Таблица БД power_supply
Таблица hard_drive – предназначена для хранения данных о жестком диске. Таблица 8 – Таблица БД hard_drive
Таблица body – предназначена для хранения данных о корпусе. Таблица 9 – Таблица БД body
Таблица BuildPC – предназначена для хранения данных о финальной сборке. Таблица 10 – Таблица БД BuildPC
Таблица 10 – Таблица БД BuildPC (Продолжение)
Таблица build_position – предназначена для хранения всех имеющихся сборок с их координатами. Таблица 11- Таблица БД build_position
2.2 Реализация приложения Для реализации были использованы язык: php[4] ,js[5]. В директории сайта имеется файл “index.php” в котором описана верстка сайта. По нажатию на одну из клавиш “Отправить” (в зависимости от способа подбора, который выбрал пользователь), данные отправляются методом POST на страницу “result.php”, на которой происходит взаимосвязь с базой данных и обработка данных которые отправил пользователь. Основные строчки кода представлены ниже. В данной ситуации есть 2 варианта развития событий: 1) Пользователь выбрал фирму, которую он предпочитает, и цену, которую считает приемлемой. 2) Пользователь ответил на вопросы, и подбор будет происходить исходя из его ответов. Рассмотрим первый вариант: // Если была послана форма с Ценой и фирмами. if ( isset($_POST['firmsAndModels']) ) { // Определяем какая серия видеокарты выбрана $postFirms = $_POST['choose-firms-video']; if ( $postFirms == 1) { $seria = 'any'; } else if ( $postFirms == 2 ) { $seria = 'NVIDIA'; } else if ( $postFirms == 3) { $seria = 'AMD'; }; После чего те же самые действия проделываем для определения фирмы производителя процессора. $cpuFirm = $_POST['choose-firms-CPU']; if ( $cpuFirm == 1) { $cpu = 'any'; } else if ( $cpuFirm == 2 ) { $cpu = 'Intel'; } else if ( $cpuFirm == 3) { $cpu = 'AMD'; }; После чего делается SQL-запрос к базе данных, который находит все видеокарты данной серии. Если же был выбран селектор на значении «Любая», то выбираются все имеющиеся видеокарты. if ( $seria != 'any') { $query = $db->query("SELECT `id` FROM `video_card` WHERE `seria` = '$seria';"); } else { $query = $db->query("SELECT `id` FROM `video_card`;"); } Следующий блок кода, заносит данные об первичном ключе выбранной/ых видеокарт в массив. Это сделано для того, чтобы лишний раз не обращаться к базе данных. $i = 0; while($row = $query->fetch()) { $videoList[$i] = $row['id']; $i++; } Далее происходит подбор по такой же системе, можно выделить только проверку на существование сборки в данном ценовом диапазоне. Так в следующими строчками кода задается диапазон цены, выбранной пользователем. Где EPS – заранее заданная константа, которая определяет величину интервала между минимальной и максимальной ценой. $price = $_POST['pred_price']; $minPrice = $price - EPS; $maxPrice = $price + EPS; И уже используя найденный интервал, используем его для нахождения сборки с заданной ценой, делаем это с помощью следующего запроса. $query = $db->query("SELECT * FROM `BuildPC` WHERE `Summary` < $maxPrice AND `Summary` > $minPrice;"); Так как таблица к которой мы обращались содержит номера ключей комплектующих, необходимо записать интересующие ключи в массив, как было показано ранее. После произведенных действий, необходимо соотнести все условия и найти такую сборку, которая бы всем им удовлетворяла. Для этого необходимо пройтись по всем 3 условиям. Для этого был использован цикл while. // проверка на наличие такой сборки $i = 0; $build = array(); while( $i <= count($priceList) - 1 ) { $j = 0; while ($j <= count($cpuList) - 1) { $l = 0; while ($l <= count($videoList) - 1) { После чего необходимо записать условие, что данный процессор, установлен в сборку, которая находится в выбранном ценовом диапазоне. Аналогичные условия и для видеокарты. if ( $cpuList[$j] == $priceList[$i]['CPU_id'] and $videoList[$l] == $priceList[$i]['video_card_id'] ) { После чего закрываются все циклы, увеличивается значение переменных, отвечающие за номер шага. И так пока не будут просмотрены все варианты. Во втором случае код будет выглядеть так, т.е. если была послана форма с вопросами: } else if ( isset($_POST['quest']) ){ Необходимо установить координаты. В данном приложении координатами являются ответы на вопросы, где номер вопросы – это Ось, а номер ответа – числовое значение. $x1 = $_POST['forWhat']; $y1 = $_POST['cost']; Вариант просматривать координаты сразу через SQL-запрос, является не самым удобным. Проще собрать все координаты сразу одним запросом: $query = $db->query("SELECT `build_id`,`x`,`y` FROM `build_position`;"); Запишем их в массив: $i = 0; while($row = $query->fetch()) { $pos[$i]['build_id'] = $row['build_id']; $pos[$i]['x'] = $row['x']; $pos[$i]['y'] = $row['y']; $i++; }; И работая с массивом, можно легко найти минимальное значение расстояния между точками. Для этого достаточно сначала присвоить минимальное значение первому элементу: $min = sqrt( pow(($x1-$pos[0]['x']),2) + pow(($y1-$pos[0]['y']),2) ); $resPosX = $pos[0]['x']; $resPosY = $pos[0]['y']; $buildId = $pos[0]['build_id']; После чего достаточно в цикле просмотреть все оставшиеся и, в случае необходимости, пере присвоить и само значение, и координаты, которые ему соответствуют. Пример реализации показан следующим циклом. $i = 1; while ( $i <= count($pos) - 1) { $length = sqrt( pow(($x1-$pos[$i]['x']),2) + pow(($y1-$pos[$i]['y']),2) ); if ( $length < $min) { $min = $length; $resPosX = $pos[$i]['x']; $resPosY = $pos[$i]['y']; $buildId = $pos[$i]['build_id']; } $i++; } Далее достаточно просто выбрать из базы данных первичный ключ сборки, который был найден в предыдущем блоке кода. Делает выборку следующий запрос: $query = $db->query("SELECT * FROM `BuildPC` WHERE `id` = '$buildId';"); Можно заметить, что для обоих случаев наименование переменных одинаково, это требуется для того, чтобы не вводить лишние условия и проверки, а также не акцентировать внимание на том, какой способ подбора был выбран. Далее происходит вывод информации с базы данных, все делается практическим одинаковыми запросами. Код представлен ниже. Например, программа ничего не смогла найти по заданным значением, тогда будет выведено советующее сообщение. Код описан ниже. if (empty($build)) { ?> |