«…лишь недалекие люди боятся конкуренции, а люди подлинного творчества ценят общение с каждым талантом…» А. Бек, Талант.

СУБД/Лабораторная №3(2 семестр)

Материал из Wiki
Перейти к: навигация, поиск

Содержание

Лабораторная работа N3 (Mysql + PHP)

Файл:Lab3sem2.rar

Задание

  • 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)

Помещаем в дирректорию сервера 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");

Задание:


Провести анализ и отобразить на диаграмме пользователей, которые учились в университете (univer) “СПбГУ” на предмет распределения в процентом соотношении учившихся на разных кафедрах.

Что это значит?

Нужно найти все кафедры этого университета для зарегистрированных пользователей, подсчитать сколько пользователей на каждой кафедре в обсалютном значении и сколько это составляет процентов от всех учившивхся в “СПбГУ”, сохранить результаты в спомогательную таблицу (НЕ СОХРАНЯТЬ ОГРОМНЫЕ КУСКИ БАЗЫ В ОТДЕЛЬНЫЕ ТАБЛИЦЫ СОХРАНЯТЬ ТОЛЬКО ЧИСЛОВЫЕ ЗНАЧЕНИЯ ДЛЯ КОНКРЕТНЫХ ПОЛЕЙ) и построить диаграмму(график).

  • Создаем вспомогательную таблицу (можно представление, если поиск значений происходит быстро), в которой содержатся название кафедры, где университет равен “СПбГУ”.
  • Подсчитываем число включений каждого уникального поля и выводим эту цифру и навзание поля (в нашем случае это число учашихся на кафедре и название кафедры)
  • Анализируем содержание нашей таблицы, если есть много нулевых единичных или сторонних значений включений то для красоы отображения графика отсекаем эти значений запросом с условием (в данном случае убрали из вывода значения которые встречаются меньше 2 раз)
Файл: lab3v1.sql
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;
Файл: lab3v1pic.php
<?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\">";
 
?>

Пример субд лаб3.png