СУБД/Лабораторная №3(2 семестр)
Лабораторная работа N3 (Mysql + PHP)
Задание
- 1.Установить локальный сервер на компьютер. (если Win7 то используйте Denwer http://www.denwer.ru/, если Linux система, то установите пакеты или соберите из исходников apache + php +mysql)
Лекция - http://simhard.com/wiki/index.php/СУБД/лекция_7_семестр_2
- 2.Создать скрипт sql для создания таблиц содержащих результаты поиска и анализа базы, согласно заданию вашего Варианта.
- 3.Создать php скрипт выполняющий следующие действия:
- - подключение к базе данных;
- - вывод таблицы распределения искомых значений (20 максимальных или минимальных значений);
- - скрипт sql для подготовки всех значений
- 4. Создать php скрипт который строит график(диагармму) распределения искомых значений (для всех заданий разрешается ограничить вывод значени, если время выполнения скрипта превышает 10 мин).
- 5. Вывести искомые значения и график на одной странице
Требования по оформлению
Названия скрипта lab3vX.php - где Х номер Вариант, названия скрипта генерации картинки графика lab3vXpic.php. Тест запросов предварительно проверять в Mysql WorkBench и текст скрипта должен быть сохранен в файл lab3vX.sql, названия вспомогательных таблиц должны иметь названия: tXn1,tXn2 и т.д. если нужно больше вспомогательных таблиц tXnM. Все три файла должны быть запакованы в файл lab3vX.zip и отправлены на почту zaicevvs@tut.by.
Для редактирования файлов php лучше всего использовать специализированноые редакторы - к примеру Notepad++ поддерживает подсветку синтаксисаи есть возможность конвертировать формат текстоваого документа в разные кодировки (см. Возможные ошибки)
Варинаты
Вариант 1.
Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “СПбГУ” на предмет распределения в процентом соотношении учившихся на разных кафедрах. (используйте диаграмму Pie charts)
Вариант 2.
Выбрать пользователей, у которых указан мобильный телефон, определить и отобразить на диаграмме процент мужчин и процент женщин указавших телефон. (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 3.
Выбрать пользователей, у которых указан год рождения и построить линейный график распределения пользователей по возрасту старше 10 лет (сколько пользователей возрастом <10, 11, 12,.....,старше 60) (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 4.
Построить распределение пользователей по статусу (всего 15 статусов от 0 до 14).
Вариант 5.
Построить рейтинг 10 самых популярных женских имен из БГУ, построить график отображающий их абсолютное и относительное процентное распределение.
Вариант 6.
Выбрать пользователей, у которых указан домашний телефон, определить и отобразить на диаграмме процент мужчин и процент женщин указавших телефон. (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 7.
Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “МГУ” на предмет распределения в процентом соотношении учившихся на разных кафедрах (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 8.
Выбрать пользователей, у которых указан ник, определить и отобразить на диаграмме процент мужчин и процент женщин указавших ник. (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 9.
Построить рейтинг 10 самых популярных мужских имен из БГУ, построить график отображающий их абсолютное и отностиельное процентное распределение.
Вариант 10.
Построить рейтинг 10 самых популярных женских имен из МГУ, построить график отображающий их абсолютное и отностиельное процентное распределение.
Вариант 11.
Построить распределение пользователей, которые закончили университет с 2000 по 2008 год.
Вариант 12.
Построить распределение пользователей закончивших или учащихся в МИФИ по номеру школы, в которой они учились.
Вариант 13.
Выбрать пользователей, у которых число video более 1000 и построить распределение по числу выбранных мужчин и женшин.
Вариант 14.
Построить распределение пользователей по числу друзей, больше 1000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000.
Вариант 15.
Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “БНТУ” на предмет распределения в процентом соотношении учившихся в разных школах (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 16.
Построить распределение по номерам разных сотовых оператров 029 044 033 025, для тех кто учился в Беларуси и у кого указан мобильный телефон.
Вариант 17.
Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “БГУ” на предмет распределения в процентом соотношении учившихся на разных кафедрах (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 18.
Выбрать пользователей, у которых указан день рождения, определить и отобразить на диаграмме процент мужчин и процент женщин указавших день рождения. (используйте диаграмму Pie charts или любую другую наглядную, Bubble chart, drawBarChart.palette )
Вариант 19.
Построить распределение пользователей закончивших или учащихся в БГУ по номеру школы, в которой они учились.
Вариант 20.
Выбрать пользователей, у которых парметр void2 не пустой и построить распределение по этому параметру (для значений 1,2,3....10, и остальные обьеденить в одну группу).
Пример выполнения лабораторной работы (задание 2,4)
<?php //Выводим информацию об разрабочике $student = "Зайцев Виктор"; print( "БГУ ММФ <br>"); print( "Кафедра: математической кибернетики <br>"); print( "Курс: 4 <br>"); print( "Год: 2014 <br>"); print( "Лабораторная работа: №3 <br>"); print( "Выполнил: $student <br>"); //обьявляем переменные с информацией о подключении $db = "alldb"; $user = "student"; $pass = "studentpass"; $server = "93.125.42.8"; //Вызываем функцию подключения к серверу $link = mysql_connect($server, $user, $pass); // проверяем статус выполенния подключения к серверу и выводим сообщение if(!$link) die("cann't connect Mysql"); else echo "Connect to ".$db." successfull<br>"; //Указываем какую таблицу используем далее по тексту кода(если не задаем явного обращения) mysql_select_db($db) or die("cann't connect Mysql<br>".mysql_error()); //Устанавливаем кодировку которую будем использовать далее по тексту кода в запросах (кодировка должна совпадать с кодировкой применяемой в базе данных) mysql_set_charset(utf8); //Обьявляем переменную строкового типа содержащую запрос к серверу на выборку значения $query="select * from vkdb where sex = '2' limit 10;"; //Выполняем запрос результат помещаем в переменную $result=mysql_query($query) or die(' Failed! ' . mysql_error()); // Выводим результаты в html в виде таблицы echo "<table>\n"; // выбираем строку из переменной и помещаем ее в другую переменную до тех пор пока строки сущесвуют while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; // выполняем цикл перебора всех полей в строке пошагово помещая значения полей в переменню foreach ($line as $col_value) { //выводим значения совместно с тегами столбцов таблицы echo "\t\t<td>$col_value</td>\n"; } //выводим тег следующей строки для таблицы echo "\t</tr>\n"; } //завершаем вывод таблицы echo "</table>\n"; // Освобождаем память от результата mysql_free_result($result); // Закрываем соединение mysql_close($link); //для 4 –го пункта задания нужно добавить тег вывода картинки в html текст //Будет работать если выполнен пунк 3 задания (имя файла l4.php, путь к файлу – текущая дирректория потому - ./ ) echo "<img src=\"./l4.php\">"; ?>
Пример выполнения лабораторной работы (задание 3)
- 1. Скачиваем пакет для построения графиков http://www.pchart.net/download
Помещаем в дирректорию сервера Denwer* (в любую дирреторию но проше потом будет писать пути если поместите в дирреторию z:\home\localhost\www\ , где z – буква диска которую вы указали при установке сервера в win7, если система Linux то в зависимости от дистрибутива найди те папку которую сервер apache считает домашней для скриптов или html страниц к примеру /var/www у Debian димтрибутива )
- - в данном случае и далее сборку сервера apache + ядра php + библиотек для работы с mysql , буду называть Dewer сервером
- 2. Заходим в браузере по адресу http://localhost/lec/pChart/examples/ (должен быть запушен сервер Denwer который вы установили), видим примеры и все возможности предоставляемых классов для рисования графиков. Выбираем понравившийся и копируем текст создания графика в свой файл c навзанием labpicX.php
Исключаем из скрипта labpicX.php все операторы вывода текста, оставляем только операторы подключения, вычисления значений и формирования массива значений. Затем подставляем этот массив значений в функцию формирования значений графика
- $MyData->addPoints(array(40,30,20),"ScoreA");
- И функцию формирования подписей (Label)
- $MyData->addPoints($llabel,"Labels");
- 3. Изменяем путь к используемым в заголовке классам и путь к испольщуемым шрифтам, он должен соотвесвовать вашему пути (можно относительный путь, можно обсалютный)
- $myPicture->setFontProperties(array("FontName"=>"./pChart/fonts/Forgotte.ttf
- include("./pChart/class/pData.class.php");
- 4. Заходим в браузер по адресу http://localhost/путь_к_вашему_скрипту/labpicX.php смотрим полученный график
Задание:
Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “СПбГУ” на предмет распределения в процентом соотношении учившихся на разных кафедрах.
Что это значит?
Нужно найти все кафедры этого университета для зарегистрированных пользователей, подсчитать сколько пользователей на каждой кафедре в обсалютном значении и сколько это составляет процентов от всех учившивхся в “СПбГУ”, сохранить результаты в спомогательную таблицу (НЕ СОХРАНЯТЬ ОГРОМНЫЕ КУСКИ БАЗЫ В ОТДЕЛЬНЫЕ ТАБЛИЦЫ СОХРАНЯТЬ ТОЛЬКО ЧИСЛОВЫЕ ЗНАЧЕНИЯ ДЛЯ КОНКРЕТНЫХ ПОЛЕЙ) и построить диаграмму(график).
- Создаем вспомогательную таблицу (можно представление, если поиск значений происходит быстро), в которой содержатся название кафедры, где университет равен “СПбГУ”.
- Подсчитываем число включений каждого уникального поля и выводим эту цифру и навзание поля (в нашем случае это число учашихся на кафедре и название кафедры)
- Анализируем содержание нашей таблицы, если есть много нулевых единичных или сторонних значений включений то для красоы отображения графика отсекаем эти значений запросом с условием (в данном случае убрали из вывода значения которые встречаются меньше 2 раз)
USE alldb; CREATE TABLE v1 SELECT caf FROM vkdb WHERE univer = 'СПбГУ' LIMIT 100000; CREATE VIEW vt1 AS SELECT COUNT(caf) AS ct , caf FROM v1 GROUP BY caf; SELECT ct, caf FROM vt1 WHERE ct > 2;
<?php /* CAT:Pie charts */ //Подключаемся к базе $db = "alldb"; $user = "student"; $pass = "studentpass"; $server = "93.125.42.8"; $link = mysql_connect($server, $user, $pass); mysql_select_db($db) or die("Статус выбора базы данных : cann't connect Mysql".mysql_error()." <br>"); mysql_set_charset(utf8); //Выполняем запрос $query="select ct, caf from vt1 where ct > 2 group by caf;"; $result=mysql_query($query) or die(' Failed! ' . mysql_error()); //подключаем бибилиотеку для рисоввания /* pChart library inclusions */ include("./pChart/class/pData.class.php"); include("./pChart/class/pDraw.class.php"); include("./pChart/class/pPie.class.php"); include("./pChart/class/pImage.class.php"); //Была выбрана для рисования круговая диаграмма поэтому подготавливаем значения //извлеченные из базы в переменную $result $i=0; $sum=0; //построчно извлекаем значения while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { // echo "\t\t<td>$line[ct]</td>\n"; // echo "\t\t<td>$line[caf]</td>\n"; //Из строки значения с названием кафедры помешаем в масив названий //а значения численные абсолютные помещаем в массив данных $ldata[$i]=$line[ct]; $llabel[$i]=$line[caf]; //Подсчитываем сколько всего было обработано пользователей $sum+=$ldata[$i]; $i++; } //Значения абсолютные переводим в значения относительные делим на сумму всех обработанных //и умножаем на 100% for ($j=0;$j<$i;$j++){ $ldata[$j]=($ldata[$j]*100)/$sum; } /* Create and populate the pData object */ $MyData = new pData(); // $MyData->addPoints(array(40,30,20),"ScoreA"); //Добавляем в обьект графика значения в виде сформированного массива данных $MyData->addPoints($ldata,"ScoreA"); $MyData->setSerieDescription("ScoreA","Application A"); /* Define the absissa serie */ // $MyData->addPoints(array("A","B","C"),"Labels"); //Добавляем массив названий кафедры $MyData->addPoints($llabel,"Labels"); $MyData->setAbscissa("Labels"); /* Create the pChart object */ //$myPicture = new pImage(700,230,$MyData,TRUE); $myPicture = new pImage(700,230,$MyData,TRUE); /* Draw a solid background */ $Settings = array("R"=>173, "G"=>152, "B"=>217, "Dash"=>1, "DashR"=>193, "DashG"=>172, "DashB"=>237); $myPicture->drawFilledRectangle(0,0,700,230,$Settings); /* Draw a gradient overlay */ $Settings = array("StartR"=>209, "StartG"=>150, "StartB"=>231, "EndR"=>111, "EndG"=>3, "EndB"=>138, "Alpha"=>50); $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings); $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100)); /* Add a border to the picture */ $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0)); /* Write the picture title */ $myPicture->setFontProperties(array("FontName"=>"./pChart/fonts/Silkscreen.ttf","FontSize"=>6)); $myPicture->drawText(10,13,"pPie - Draw 3D pie charts",array("R"=>255,"G"=>255,"B"=>255)); /* Set the default font properties */ $myPicture->setFontProperties(array("FontName"=>"./pChart/fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80)); /* Create the pPie object */ $PieChart = new pPie($myPicture,$MyData); /* Define the slice color */ $PieChart->setSliceColor(0,array("R"=>143,"G"=>197,"B"=>0)); $PieChart->setSliceColor(1,array("R"=>97,"G"=>77,"B"=>63)); $PieChart->setSliceColor(2,array("R"=>97,"G"=>113,"B"=>63)); /* Draw a simple pie chart */ $PieChart->draw3DPie(120,125,array("SecondPass"=>FALSE)); /* Draw an AA pie chart */ $PieChart->draw3DPie(340,125,array("DrawLabels"=>TRUE,"Border"=>TRUE)); /* Enable shadow computing */ $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); /* Draw a splitted pie chart */ $PieChart->draw3DPie(560,125,array("WriteValues"=>TRUE,"DataGapAngle"=>10,"DataGapRadius"=>6,"Border"=>TRUE)); /* Write the legend */ $myPicture->setFontProperties(array("FontName"=>"./pChart/fonts/pf_arma_five.ttf","FontSize"=>6)); $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); $myPicture->drawText(120,200,"Single AA pass",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE)); $myPicture->drawText(440,200,"Extended AA pass / Splitted",array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Align"=>TEXT_ALIGN_TOPMIDDLE)); /* Write the legend box */ $myPicture->setFontProperties(array("FontName"=>"./pChart/fonts/Silkscreen.ttf","FontSize"=>6,"R"=>255,"G"=>255,"B"=>255)); $PieChart->drawPieLegend(600,8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL)); $myPicture->autoOutput("l4.png"); // Освобождаем память от результата mysql_free_result($result); // Закрываем соединение mysql_close($link); ?>
Файл: lab3v1.php
<?php $student = "Зайцев Виктор"; print( "БГУ ММФ <br>"); print( "Кафедра: математической кибернетики <br>"); print( "Курс: 4 <br>"); print( "Год: 2014 <br>"); print( "Лабораторная работа: №3 <br>"); print( "Выполнил: $student <br>"); $db = "alldb"; $user = "student"; $pass = "studentpass"; $server = "93.125.42.8"; $link = mysql_connect($server, $user, $pass); if(!$link) die("Статус подключения к серверу данных : cann't connect Mysql"); else echo "Статус подключения к серверу данных ".$db.": successfull <br>"; mysql_select_db($db) or die("Статус выбора базы данных : cann't connect Mysql".mysql_error()." <br>"); mysql_set_charset(utf8); //$query="select * from vkdb where sex = '2' // limit 10;"; $query="select ct, caf from vt1 where ct > 1000 limit 20;"; $result=mysql_query($query) or die(' Failed! ' . mysql_error()); // Выводим результаты в html echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; //echo "\t\t<td>$line</td>\n"; //echo "\t\t<td>$dt</td>\n"; echo "\t\t<td>$line[ct]</td>\n"; echo "\t\t<td>$line[caf]</td>\n"; // foreach ($line as $col_value) { // //echo "\t\t<td>$line[0]</td>\n"; // echo "\t\t<td>$col_value</td>\n"; // } echo "\t</tr>\n"; } echo "</table>\n"; // Освобождаем память от результата mysql_free_result($result); // Закрываем соединение mysql_close($link); //Добавляем тег для вывода картинки формируемой в php скрипте echo "<img src=\"./lab3v1pic.php\">"; ?>