Проектирование web-приложений и программных систем в Open Source: Учебное пособие

Министерство образования и науки Российской Федерации ГОУ ВПО «Магнитогорский государственный университет» В.Г. Измайло...

23 downloads 313 Views 2MB Size Report

This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!

Report copyright / DMCA form

";
"; ?> 74

Методики DS ________________________________________________________________________________



Примечание: error_reporting - устанавливает, о каких ошибках PHP сообщается. int error_reporting ([int level]) Устанавливает уровень сообщения об ошибках PHP и возвращает старый уровень. Уровень сообщения об ошибках это либо битовая маска, либо именованная константа. Использование именованной константы настоятельно рекомендуется для обеспечения совместимости с последующими версиями. После добавления уровней ошибок увеличивается диапазон целых чисел, так что старые уровни ошибок на базе целочисленных значений не всегда будут работать так, как задумано. error_reporting (55); // PHP 3-эквивалент для E_ALL ^ E_NOTICE /* ...in PHP 4, "55" would mean (E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING) */ error_reporting (2039); // PHP 4-эквивалент для E_ALL ^ E_NOTICE error_reporting (E_ALL ^ E_NOTICE); // то же самое и в PHP 3, и в 4

Битовые значения error_reporting(): значение 1 2 4 8 16 32 64 128 256 512 1024 2047

константа E_ERROR E_WARNING E_PARSE E_NOTICE E_CORE_ERROR E_CORE_WARNING E_COMPILE_ERROR E_COMPILE_WARNING E_USER_ERROR E_USER_WARNING E_USER_NOTICE E_ALL

// Отключить все сообщения об ошибках error_reporting(0); // Сообщать о простых ошибках во время выполнения 75

DS-test & DS-file ________________________________________________________________________________

error_reporting (E_ERROR | E_WARNING | E_PARSE); // Сообщение E_NOTICE может быть очень кстати (для сообщения о неинициализированных // переменных или для отлова неправильного ввода имён переменных) error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE); // Сообщать обо всех ошибках PHP (использовать битовое 63 в PHP 3) error_reporting (E_ALL);

Задания 1. Реализуйте программный код. Найдите и устраните ошибки. 2. Включите в статистику ответы на открытые вопросы таким образом, чтобы они не занимали достаточно много места, но были читаемыми. 3*. Используя библиотеку JpGraph (http://www.aditus.nu/jpgraph/jpdownload.php) представьте результаты не только в текстовом формате, но в графическом. Примечание: для генерации рисунка с помощью это библиотеки вам понадобиться следующее. Создать внешний файл, к примеру graph.php, которому вы будете передавать идентификатор анкеты, идентификатор вопроса и идентификатор варианта. А обратно будет возвращаться изображение с графиком. Вызов файла-изображения будет выглядеть таким образом: ”” Вместо xx, yy будут стоять конкретные идентификаторы каждого закрытого вопроса. Это изображение будет вставляться после каждого вопроса. А внутри файла graph.php будет формироваться два массива. Первый, $data_names – это формулировка варианта (будет служить подписью по оси X графика, обратите внимание, что библиотека не поддерживает кириллицу, поэтому нужно транслитировать формулировки вариантов. Однако, можно, не передавать этот массив вовсе, тогда столбцы будут автоматически пронумерованы, как видно на рисунке), а второй, $datay– процентные значения (значения по оси Y) (Рис. 20).

76

Методики DS ________________________________________________________________________________

Рис. 20. Пример генерации изображения по статистически данным Размерность обоих массивов должна быть равной. Скачайте и распакуйте содержимое архива с библиотеками JpGraph в директорию module/jpgraph рабочего каталога. Реализуйте модуль graph.php (Листинг 22). Листинг 22 include ("module/jpgraph/src/jpgraph.php"); include ("module/jpgraph/src/jpgraph_line.php"); include ("module/jpgraph/src/jpgraph_bar.php"); // Создадим область для вывода диаграммы $graph = new Graph(450,250,"auto"); // Определим масштабирование по осям $graph->SetScale("textlin"); // Определим отступ для области вывода $graph->img->SetMargin(30,30,30,30); // Определим цвет отступа $graph->SetMarginColor('white'); // Создадим рамку $graph->SetFrame(true,'white',1); // Создадим диаграмму, обратите внимание, что $datay массив, который уже // должен содержать значения $bplot = new BarPlot($datay); // Определим цвет заполнения столбцов $bplot->SetFillColor('#ff9900'); // Покажем значения над каждым столбцом $bplot->value->Show(); // Установим формат вывода значений 77

DS-test & DS-file ________________________________________________________________________________

$bplot->value->SetFormat('%01.1f'); // Установим цвет для значений $bplot->value->SetColor('#0066ff'); // Установим ширину столбцов $bplot->SetWidth(0.5); // Добавим диаграмму в область вывода $graph->Add($bplot); // Граница вокруг диаграммы $graph->SetBox(true, 'gray'); // Покажем и определим сетки значений $graph->xgrid->Show(); $graph->xgrid->SetLineStyle('dashed'); $graph->xgrid->SetColor('gray'); $graph->ygrid->SetLineStyle('dashed'); $graph->ygrid->SetColor('gray'); $graph->ygrid>SetFill(true,'#[email protected]','#[email protected]'); // Спрячем метки на осях $graph->xaxis->HideTicks(); $graph->yaxis->HideTicks(); // Установим цвет осей и подписей $graph->xaxis->SetColor('darkgray', 'darkgray'); $graph->yaxis->SetColor('darkgray', 'darkgray'); // Определим шрифт для вывода подписей на осях $graph->xaxis->title->SetFont(FF_VERDANA,FS_NORMAL); $graph->yaxis->title->SetFont(FF_VERDANA,FS_NORMAL); // Определим отступ сверху $graph->yaxis->scale->SetGrace(10); $graph->xaxis->SetTitleMargin(100); $graph->title->SetFont(FF_ARIAL, FS_NORMAL); // Библиотека не работает с кириллицей, поэтому в массиве $data_names не // должно быть кириллических символов. Вы можете не раскомментировать // следующую строку, тогда автоматически по оси X будут стоять // не названия столбцов, а просто их номера // $graph->xaxis->SetTickLabels($data_names); $graph->xaxis->SetFont(FF_ARIAL,FS_NORMAL,10); //$graph->xaxis->SetLabelAngle(45); $graph->title->SetMargin(20); $graph->title->SetFont(FF_ARIAL,FS_NORMAL,10); // Установим заголовок диаграммы. По умолчанию, заголовок не нужно // указывать. Если все-таки понадобиться, то раскомментируйте следующую 78

Методики DS ________________________________________________________________________________

// строчку // $graph->title->Set("Title"); // Отобразим результат $graph->Stroke();

Перед открытием тега не должно быть ни одного символа, включая пробелы и символы табуляции, так же нужно следить, чтобы в файле graph.php не было никакого вывода данных (echo, print, printf), иначе изображение не сможет выдаться в браузер. Ссылки 1. Официальный сайт JpGraph. – Режим доступа: http://www.aditus.nu/jpgraph/. 2. JpGraph и русский язык. – Режим доступа: http://phpclub.ru/detail/article/jpgraph_ru. 3. Создание графиков в JpGraph. Режим доступа: http://hostinfo.ru/articles/web/rubric48/rubric55/rubric59/rubric61/1135/.

79

DS-test & DS-file ________________________________________________________________________________

РАБОТА 9. ОТЧЕТЫ И ВЫБОРКИ Цель Вывести ответы анкеты в таблицу. Сформировать главную страницу, с которой можно получить доступ ко всем остальным таблицам. Описание задачи У вас в БД накопилось как минимум 10 ответов на созданную вами анкету. Нужно вывести эти ответы в таблицу, где в столбцах будут формулировки вопросов, а в строках – заполненные анкеты. Это нужно для просмотра ответов по каждой заполненной анкете. Алгоритм решения Создайте файл show_filled.php (Листинг 23). Основной задачей будет вывод ответов анкеты в таблицу. Листинг 23 Error_Reporting(E_ALL & ~E_NOTICE); include("module/connect_mysql.php"); // Временная переменная, туда будем накапливать разметку таблицы, // вместе с данными $table_data=""; // Получаем единственный входящий параметр – идентификатор анкеты $id_form=$_GET["id_form"]; // Выведем заголовок анкеты $info = mysql_fetch_array(mysql_query("SELECT * FROM form WHERE id_form='$id_form'")); $title=$info["title"]; echo "
"; echo ""; // Получаем список всех заполненных анкет $filled_form=mysql_query("SELECT DISTINCT history.* FROM answer, question, form, history WHERE form.id_form=question.id_form AND 80

Методики DS ________________________________________________________________________________

answer.id_question=question.id_question AND answer.id_filled_form=history.id_filled_form AND form.id_form='$id_form' ORDER BY history.id_filled_form"); $temp=""; $table_data.="\n"; // Выведем в заголовк таблицы формулировки вопросов $quest=mysql_query("SELECT question.q_text, question.a_few_answer, question.q_type FROM question, form WHERE form.id_form=question.id_form AND form.id_form='$id_form' ORDER BY question.number"); $table_data.="\n\n"; } $table_data.="\n"; // Номер текущего вопроса $current_ques=1; // Пишем ответы в таблицу // Перебираем каждую заполненную анкету while ($row_filled_form=mysql_fetch_array($filled_form)) { $table_data.="\n"; $table_data.="\n"; // Получаем идентификаторы вопросов, принадлежащих анкете $quest=mysql_query("SELECT * FROM question, form WHERE form.id_form=question.id_form AND form.id_form=$id_form ORDER BY question.number"); // Перебираем каждый вопрос 81

DS-test & DS-file ________________________________________________________________________________

while ($row_question=mysql_fetch_array($quest)) { // Открытый вопрос if ($row_question["q_type"]=="o") { $id_question=$row_question["id_question"]; $id_filled_form=$row_filled_form["id_filled_form"]; $answer=mysql_query("SELECT answer.* FROM answer, question WHERE answer.id_question=$id_question AND answer.id_filled_form=$id_filled_form AND answer.id_question=question.id_question ORDER BY question.number"); $row_answer=mysql_fetch_array($answer); // Проверяем, равен ли номер выводимого вопроса фактическому номеру // вопроса if ($row_question["number"]==$current_ques) { // Если нет ответа на вопрос if ($row_answer["own_answer"]==NULL) { $table_data.="\n"; $for_save.="-$answer_separator"; } else { $table_data.="\n"; } } else { $table_data.="\n"; } // Увеличиваем номер вопроса $current_ques+=1; } // Закрытый вопрос if ($row_question["q_type"]=="c") { // Один вариант ответа if ($row_question["a_few_answer"]=="0") { $id_question=$row_question["id_question"]; $id_filled_form=$row_filled_form["id_filled_form"]; 82

Методики DS ________________________________________________________________________________

$answer=mysql_query("SELECT answer.* FROM answer, question WHERE answer.id_question=$id_question AND answer.id_filled_form=$id_filled_form AND answer.id_question=question.id_question ORDER BY question.number"); $row_answer=mysql_fetch_array($answer); if ($row_question["number"]==$current_ques) { $id_variant=$row_answer["id_variant"]; if ($id_variant!=NULL) { $variant=mysql_query("SELECT variant_text FROM variant WHERE id_variant=$id_variant"); $row_variant=mysql_fetch_array($variant); $table_data.="\n "; } else { $table_data.="\n"; } } else { $table_data.="\n"; } $current_ques+=1; } // Несколько вариантов ответа if ($row_question["a_few_answer"]=="1") { $id_question=$row_question["id_question"]; $id_filled_form=$row_filled_form["id_filled_form"]; $answer=mysql_query("SELECT answer.* FROM answer, question WHERE answer.id_question=$id_question AND answer.id_filled_form=$id_filled_form AND answer.id_question=question.id_question ORDER BY answer.id_variant"); if ($row_question["number"]==$current_ques) { $table_data.="\n"; } else { $table_data.="\n"; } $current_ques+=1; } } } $table_data.="\n"; } $table_data.="
МестоАудитория\n"; while($row_q=mysql_fetch_array($quest)) { $table_data.="".$row_q["q_text"]."
".$row_filled_form["id_filled_form" ]."".$row_filled_form["place"]. "".$row_filled_form["audience"]." -".$row_answer["own_answer"]." ".$row_variant["variant_text"]."-"; 83

DS-test & DS-file ________________________________________________________________________________

while($row_answer=mysql_fetch_array($answer)) { $id_variant=$row_answer["id_variant"]; if ($id_variant!=NULL) { $variant=mysql_query("SELECT variant_text FROM variant WHERE id_variant=$id_variant"); $row_variant=mysql_fetch_array($variant); $table_data.=$row_variant["variant_text"].";
"; } else { $table_data.="-\n"; } } $table_data.="
\n"; echo "$table_data";

Теперь сформируем главную страницу. На главной странице должны быть следующие команды:  Добавить анкету (add_form.php). Для каждой анкеты: o Автор (автор анкеты). o Всего вопросов (необходимо подсчитать количество вопросов, привязанных к анкете). o Всего заполненных анкет (подсчет количества заполненных анкет). o Добавить ответы (add.php?id_form=xx). o Бланк анкеты (show_blank.php?id_form=xx). o Статистика (stat.php?id_form=xx). o Заполненные анкеты в таблице 84

Методики DS ________________________________________________________________________________

(show_filled.php?id_form=xx). o Удалить анкету (delete_form.php?id_form=xx). Пример реализации на языке PHP (Листинг 24): Листинг 24
Добавить анкету"; while ($row = mysql_fetch_array($result)) { $id_form=$row["id_form"]; $row = mysql_fetch_array(mysql_query("SELECT count(id_question) FROM form, question WHERE form.id_form=question.id_form AND form.id_form=$id_form")); $all_q = $row["count(id_question)"]; $row=mysql_fetch_array(mysql_query("SELECT count(DISTINCT answer.id_filled_form) FROM answer, form, history, question WHERE form.id_form=question.id_form AND history.id_filled_form=answer.id_filled_form AND answer.id_question=question.id_question AND form.id_form=$id_form")); $all_filled = $row["count(DISTINCT answer.id_filled_form)"]; printf("

%s

%s

Автор - %s
Всего вопросов - $all_q
Всего заполненных анкет - $all_filled

Добавить ответы
Бланк анкеты
Статистика
Заполненные анкеты в таблице
Удалить анкету 85

DS-test & DS-file ________________________________________________________________________________

", $row["title"], $row["comment"], $row["author"]); } echo "
"; ?>

Задания 1. Реализуйте алгоритм, проверьте ошибки и исправьте их. 2. Создайте самостоятельно страницу delete_form.php?id_form=xx, для удаления анкеты из БД по ее идентификатору. Сначала нужно удалять варианты ответов (variant), потом формулировки вопросов (question), потом информацию о заполненных анкетах (answer, а потом history), а потом удалите информацию об анкете (form). 3. К каждой строке с заполненной анкетой нужно добавить столбец, в котором будет располагаться команда «Удалить», при нажатии на которую соответствующая информация о заполненной анкете должна удаляться из БД. 4*. Реализуйте алгоритм, который одновременно с таблицей будет формировать файл с разделителем – ответы на один вопрос разделять «;», а варианты ответов одного вопроса символом «,». Ссылка на его скачивание должна находиться под таблицей. Запись в файлы осуществляется функциями fputs и fwrite, которые абсолютно идентичны: int fputs (int file, string string [, int length ]) int fwrite (int file, string string [, int length ]) Первый аргумент - дескриптор файла, в который осуществляется запись. Второй аргумент представляет собой строку, которая должна быть записана в файл. Третий необязательный аргумент задает количество символов в строке, которые должны быть записаны. Если третий аргумент не указан, записывается вся строка. В этом примере в файл "file.txt" записывается строка "Hello, world!" (Листинг 25): Листинг 25
Методики DS ________________________________________________________________________________

} fclose ($file); ?>

Примечание: второй параметр функции fopen() может принимать следующие значения: 'r' — только для чтения; 'r+' — для чтения и записи; 'w' — только для записи; В каждом режиме, где присутствует возможность записи, PHP создаст вам новый файл, если такового не существует в момент открытия. При условии, конечно, что у вас есть на это права в системе. Ссылки 1. Запись в файл. – Режим доступа: http://www.kurepin.ru/php/files/. 2. Запись и чтения из файла. – Режим доступа: http://ivd.org.ru/books/php/files.shtml.

87

DS-test & DS-file ________________________________________________________________________________

РАБОТА 10. АВТОРИЗАЦИЯ. РАЗДЕЛЕНИЕ ПРАВ ПОЛЬЗОВАТЕЛЕЙ Цель Защитить содержимое БД методом авторизации пользователя. Описание задачи На специальной странице необходимо осуществить добавление пользователей в новую таблицу БД. В таблице users нужно хранить как минимум следующую информацию: логин пользователя, пароль, зашифрованный, к примеру, md5, права пользователя. Алгоритм решения Создайте новую таблицу в БД – users. Добавьте к ней следующие атрибуты:  login – имя пользователя, используемое им для авторизации.  passwords – зашифрованный пароль пользователя.  super – поле может быть равно 1, если пользователь является администратором, и 0 – для обычного пользователя. Мы рассматриваем два типа пользователей:  обычный, который может только создать анкету, заполнить ее, и просмотреть результаты анкетирования;  администратор, который может управлять правами доступа и аторизацией пользователей. После ввода на определенной странице логина и пароля, нужно проверить их правильность. При создании пользователя в БД сохраняется не сам пароль, а его md5-хеш. Поэтому от введенного пароля, с помощью функции md5(), нужно найти хеш и сравнить его с хешом, хранящимся в БД. Если данные в БД и введенные пользователем данные совпали, то нужно записать логин и хеш пароля в COOKIE (Листинг 26): Листинг 26 setcookie("login", "$login"); $pass=md5($pass0); setcookie("pass", "$pass");

MD5 (Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или «дайджестов» сообщений произвольной длины. Является улучшенной в плане безопасности версией MD4. Зная MD5, невозможно восстановить входное сооб88

Методики DS ________________________________________________________________________________

щение, так как одному MD5 могут соответствовать разные сообщения. Используется для проверки подлинности опубликованных сообщений путём сравнения дайджеста сообщения с опубликованным. Эту операцию называют «проверка хеша» (hashcheck). Описан в RFC 1321. Функция md5 — возвращает MD5 хэш строки. string md5 (string str [, bool raw_output]) Вычисляет MD5 хэш строки str используя алгоритм MD5 RSA Data Security, Inc. и возвращает этот хэш. Хэш представляет собой 32-значное шестнадцатеричное число. Если необязательный аргумент raw_output имеет значение TRUE, то возвращается бинарная строка из 16 символов.

Теперь в каждом модуле программы в самом начале, после подключения к БД необходимо проверить, авторизован ли пользователь (пример Листинг 27). Листинг 27 $login=$_COOKIE["login"]; $pass=$_COOKIE["pass"]; $user=mysql_fetch_array(mysql_query("SELECT * FROM users WHERE login='$login'")); if ($user["super"]!=1) { if (empty($login) || empty($pass)) { $login="unknown"; $pass="null"; } // Если пароль не верен, то перенаправляем на страницу входа if ($user["pass"]!=$pass) { header("Location: login.php"); die; } // Если мы на странице добавления пользователя, то перенаправляем // на страницу с ошибкой // if ($user["pass"]!=$pass) { header("Location: error.php"); die; } } else { if ($user["pass"]!=$pass) { header("Location: 89

DS-test & DS-file ________________________________________________________________________________

login.php"); die; } }

Перед перенаправлением на другую страницу с помощью функции header(“Location: …”) не должно быть никакого вывода на страницу, а так же не должно стоять пробелов перед тегом
90

Методики DS ________________________________________________________________________________

РАБОТА 11. РАЗРАБОТКА СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ Цель Обеспечить загрузку клиентских файлов на сервер, осуществлять проверку их типов для поддержки безопасности, формировать проектные группы с ограничением прав доступа в пределах рабочих групп. Описание задачи Создать в базе данных MySql таблицы групп пользователей, файлов и проектов. Организовать загрузку файлов в проект и выгрузку файлов с сервера. Распределить всех пользователей по группам и проектам. Разграничить права пользователей так, чтобы:  удалить файл мог только его создатель;  пользователь мог просматривать проект, только в пределах своей группы, в том числе и загружать файлы только проекта своей рабочей группы;  на первой странице модуля (при входе в систему) был виден только список проектов, без их содержимого. Алгоритм решения Создайте в базе данных form_db следующие таблицы и укажите все атрибуты (каждое поле описано так же, как и на языке SQL): 1. Таблица групп пользователей wg_pr, с атрибутами: `id_wg` int(11) NOT NULL, `about_wg` text NOT NULL, `name_wg` text NOT NULL, `owner` text, PRIMARY KEY (`id_wg`)

Так как один и тот же пользователь может находиться в нескольких разных рабочих группах, то удобнее будет завести еще одну таблицу для соотнесения пользователей и рабочих групп wg_accordance, с атрибутами: `id_user` int(10) unsigned NOT NULL, `id_wg` int(10) unsigned NOT NULL, `weigth` varchar(45) default '1', PRIMARY KEY USING BTREE (`id_user`,`id_wg`)

2. Таблица проектов projects, с атрибутами: `id_pr` int(11) NOT NULL, `name_pr` text NOT NULL, `about_pr` text NOT NULL, `id_wg` int(11) NOT NULL, 91

DS-test & DS-file ________________________________________________________________________________

`date_pr` text NOT NULL, `dir_pr` text NOT NULL, `owner` text, PRIMARY KEY (`id_pr`)

3. Таблица файлов проекта files, с атрибутами: `id_fl` int(11) NOT NULL, `date_fl` text NOT NULL, `status_fl` text NOT NULL, `about_fl` text NOT NULL, `name_fl_user` text NOT NULL, `name_fl_rand` text NOT NULL, `id_sz` int(11) NOT NULL, `id_pr` int(11) NOT NULL, `mime` text NOT NULL, PRIMARY KEY (`id_fl`)

Предполагается, что вы уже выполнили Работу 10, у вас уже создана таблица пользователей и вы научились разграничивать права пользователей. Если нет, то рекомендуем выполнить ее. Реализуем загрузку файлов на сервер, для этого необходимо создать следующие php-скрипты: При создании проекта необходимо, чтобы создавалась папка, в которую бы сохранялись загружаемый пользователем файлы: //переменные $full_name, $about_pr, $id_pr передаются с формы ввода //При создании проекта необходимо сразу создавать папку для загрузки файлов в проект. //генерируем имя папки проекта $row12 = mysql_fetch_array(mysql_query("SELECT max(id_pr) FROM projects")); $id_pr=$row12["max(id_pr)"]+1; //считам $id_pr $dir=$id_pr;//имя папки будет соответствовать идентификатору проекта mkdir("./Projects/$dir", 0700);//функция создания папки в папке Projects с именем в переменной $dir и правами на запись и чтение (0700) $day=date("d.m.y"); //дата создания проекта $q=mysql_query("INSERT INTO `projects` (`id_pr`, `name_pr`, `about_pr`, `id_wg`,`date_pr`,`dir_pr`, `owner`) VALUES ('$id_pr', '$full_name', '$about_pr','$id_wg','$day','$dir','$login')");

В начале скрипта sc2.php необходимо вставить форму для загрузки 92

Методики DS ________________________________________________________________________________

файла на сервер. h2>Загрузка файла '.'
'); ?>

Переменная $id_pr должна передаваться по ссылке на скрипт sc2.php. В файле обработки insert2.php нужно реализовать саму загрузку файла и запись информации об этом файле в БД. $id_sz берется из cookie, $id_pr передается методом $_POST["rad"], далее пишется скрипт insert2.php: $row= mysql_fetch_array(mysql_query("SELECT * FROM `projects` WHERE `id_pr`='$id_pr'")); $dir_pr= $row["dir_pr"]; $dirname="Projects"; //название папки, в которой будут храниться папки проектов с файлами $path_to_files = "./$dirname/$dir_pr"; // путь для сохранения файлов $good_name =$_FILES['userfile']['name']; if (sizeof($good_name) != 0) { foreach ($good_name as $key => $name) { $type = $_FILES['userfile']['type'][$key]; $tmp_name = $_FILES['userfile']['tmp_name'][$key]; $size = 93

DS-test & DS-file ________________________________________________________________________________

$_FILES['userfile']['size'][$key]; echo $type ;

Необходимо задать способ формирования имени файла в переменной $n, чтобы файлы одного проекта не совпадали. // присваиваем файлу имя и расширение $file_ext = substr($name, 1 + strrpos($name, ".")); $file_name = substr($name, 0, strrpos($name, ".")); $name_old=$file_name; $name_fl_rand=$n.".".strtolower($file_ext); // формируем реальный путь к файлу в файловой системе $real_path = realpath($path_to_files); // создаем в нашей директории временный файл с уникальным именем, // это делается для того, чтобы избежать одновременного // закачивания файлов с одним именем $temp_file_name= tempnam($real_path,""); // делаем новое, более привлекательное, имя файла для хранения на сервере, или можно оставить имя временного файла $file_name = substr($temp_file_name, 0, strrpos($temp_file_name, "\\"))."\\".$n.".".strtolower($file_ext); // переносим загруженный временный файл в файл со // сделанным нами уникальным именем if (move_uploaded_file($tmp_name, $file_name)) { echo "

"."Ваш файл сохранен!"."

"."
"; unlink($temp_file_name); // удаляем временный файл (необходимо для системы безопасности) }else { echo "Ошибка!
"; continue; } //если файл загрузится, то в базе необходимо заполнить все поля по файлу $name_fl_user=$_POST["name_fl_user"]; if ($name_fl_user=="") {$name_fl_user=$name_old;} $status_fl="в разработке";//? $about_fl=$_POST["about_fl"]; $row_fl= mysql_fetch_array(mysql_query("SELECT max(id_fl) FROM `files`")); 94

Методики DS ________________________________________________________________________________

$id_fl=$row_fl["max(id_fl)"]+1; //считаем индекс файла $id_fl mysql_query ("INSERT INTO `files` (`id_fl`, `date_fl`, `status_fl`, `about_fl`, `name_fl_user`, `name_fl_rand`, `id_sz`, `id_pr`, `mime`) VALUES ('$id_fl', '$day', '$status_fl', '$about_fl', '$name_fl_user', '$name_fl_rand', '$id_sz', '$id_pr', '$type')"); //заносим в базу данные по загруженному файлу } }//закрывается первый оператор if проверяющий был ли загружен файл else { echo "Файл не был загружен."; }

Внимание, при формировании ссылки на добавление нового файла, нужно указывать имя скрипта sc2.php, так как он вызывает скрипт insert2.php, а не на оборот. Для выгрузки файла на клиентский компьютер можно просто вставить в ссылку путь к этому файлу. Задания 1. Создайте скрипты создания нового проекта с выбором принадлежности рабочей группы, вывода списка созданных проектов, загрузки файлов в проект. Список рабочих групп в форме добавления нового проекта выводится с помощью radio button следующим образом:
Выбери файл:
Имя файла:
Комментарий:

Рабочая группа проекта:

'.$user_info_wg0["nam e_wg"].'
'); } ?>

2. Создать формы для добавления новой рабочей группы, нового пользователя с выбором рабочей группы. 3 Создать 5 проектов, 5 групп, 15 пользователей. 4. В скрипте insert2.php сгенерируйте имя файла $n так, чтобы оно состояло из текущей системной даты и 7 случайных цифр 5. Загрузить на сервер файлы разных типов. 95

DS-test & DS-file ________________________________________________________________________________

6. В рамках политики безопасности осуществите проверку типа файлов и запретите загрузку файлов расширения .php, .exe. 7. Организовать проверку прав пользователя на просмотр файлов проекта (выполнить на основании Работы 10), в скрипте вывода списка проектов проверять право пользователя, пример: $result = mysql_query ("SELECT * FROM `projects`"); while($myrow = mysql_fetch_array($result)) { $check_right=mysql_fetch_array(mysql_query("SELECT * FROM `wg_accordance` WHERE `id_user`=".$user["id"]." AND `id_wg`=$id_wg")); if ($myrow["owner"]==$login || $check_right!=NULL || $user["super"]=="1") echo "

".$myrow['name_pr']."

".$myrow['abou t_pr']."
Файлы прoекта | Руководитель: ".$ myrow["owner"]." | ".$myrow['date_pr']."
"; }

$user["super"] берется из проверки авторизации, которую необходимо добавить в начало данного скрипта (Работа 10). Ссылки 1. Функции для работы с файловой системой. – Режим доступа: http://php.su/functions/?mkdir 2. Войцеховский А. Upload файлов, и все с этим связанное. – Режим доступа: http://phpclub.ru/detail/article/upload?printversion=1

96

Recommend Documents

Open Source Web Site Construction Kit Thomas Schenk 800 East 96th St., Indianapolis, Indiana, 46240 USA Open Source ...

e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net e-bol.net ...

Free/Open Source Software Development Stefan Koch IDEA GROUP PUBLISHING Free/Open Source Software Development Stefan...

Funambol Mobile Open Source Sync your e-mail and other data with mobile devices using Funambol 7.1 Stefano Fornari BI...

Jeff Davis MANNING Open Source SOA Open Source SOA JEFF DAVIS MANNING Greenwich (74° w. long.) For online inform...

OPEN SOURCE LEADERSHIP Leslie Gadman and Cary Cooper OPEN SOURCE LEADERSHIP This page intentionally left blank OPE...

OPEN SOURCE LEADERSHIP Leslie Gadman and Cary Cooper OPEN SOURCE LEADERSHIP This page intentionally left blank OP...