№
|
Название файла
|
Название класса
|
Описание
|
1.
|
index. php
|
Index
|
Содержит методы для отображения на экране
главной страницы сайта
|
2.
|
instructions. php
|
Instruct
|
Инструкции по пользованию системой
|
3.
|
processing. php
|
Proc
|
Система записи процессов, происходящих на
предприятии
|
4.
|
controlling. php
|
Contrl
|
Система контроля исполнения, происходящих
процессов на предприятии
|
5.
|
auth. php
|
Auth
|
Авторизация в системе по вводу логина и пароля
|
6.
|
tech. support. php
|
Tech
|
Система технической поддержки, которая
взаимодействует с классом class_guestbook. php
|
7.
|
class_guestbook. php
|
Guestbook
|
Содержит класс для создания гостевой книги на
сайте. В нашем случае, взаимодействует с tech. support. php
|
8.
|
edit. php
|
Edit
|
Система редактирования инструкций с текстовым
редактором на JavaScript
|
9.
|
deff. php
|
Default
|
Настройки по умолчанию (логин, пароль к базе
данных и пр.). Содержит константы.
|
10.
|
inc. php
|
LibInc
|
Содержит основной класс для взаимодействия с
базой данных MySQL через драйвер PDO языка PHP, а также дополнительные
функции, связанные с датой, временем, работой с файлами и пр.
|
11.
|
admin. db. php
|
AdminBase
|
Система удаления таблиц из базы данных проекта,
а также создание их вновь при необходимости
|
12.
|
admin. user. php
|
AdminUser
|
Удаление и добавление пользователей с правами
user в системе управления предприятием
|
13.
|
admin. site. php
|
AdminSite
|
Ограничение доступа к сайту в определенное
время
|
14.
|
header. php
|
Header
|
Заголовок на каждой странице сайта
|
15.
|
footer. php
|
Footer
|
"Подвал" на каждой странице сайта
|
Система каталогов на сайте:
. Корневой каталог. css - каталог для стилевых
таблиц
b. img - каталог с картинками. js - каталог с JavaScript
программные файлы php, без каталога, в корневом каталоге.
3.6
Тестирование и отладка
Завершающим этапом разработки программной системы является
этап тестирования. Здесь возможно обнаружить неточности при больших объемах
информации, при нагрузке большого числа пользователей. Всевозможные ограничения
должны дать о себе знать, когда тестировщик проверит работу программы в
различных ситуациях.
Бывает, что для тестирования используются сложные программы,
тогда тестировщик выступает и в качестве программиста. Бывает, что программы
содержат ошибки и по мнению авторов языка С++, каждая программа должна
содержать хотя бы одну ошибку.
Ошибка может быть как ошибкой логики, так и по недосмотру,
что программист где-то в коде не предусмотрел такой ситуации. Ожидаемая функция
не соответствует функции, которую ожидал заказчик. Поэтому чтобы избежать
недопонимания, что должно быть и что есть, принято согласовывать свою работу
через техническое задание.
Тестировщик должен опираться на техническое задание и
ориентироваться в логике работы программы согласно заявленным функциям в
техническом задании.
Заключение
В данной дипломной работе был разработан сайт системы
управления предприятием, который находится по адресу unionpoint.ru на
постоянном хостинге в интернете.
Данный сайт позволил сократить расходы на логистику,
проконтролировать рабочий процесс в организации, сократить расходы, увеличить
экономические показатели и повысить прибыть от выпускаемой продукции.
Были разработаны страницы записи процессов и контроля
исполнения, что позволяет контролировать рабочий процесс. Используется
множество плагинов: автодополнение, календарь, текстовый редактор, анимация
(скольжение, затухание), аккордеон, окна (модальные и с текстовым полем).
Была достигнута задача максимально удобного интерфейса для
сайта, доступа к разнообразным функциям системы управления предприятием. Многие
надписи являются гиперссылками с параметрами GET, позволяющими получить
сквозную навигацию в нашей системе.
Система имеет практическое значение, достижение целей и
задач, поставленных в данной дипломной работе, и преимущества нашей системы
управления предприятием очевидны.
Список
использованной литературы
1. PHP,
MySQL, XML: Программирование для Интернета; Автор: Елена Бенкен; Издательство:
БХВ-Петербург; 2011 г.
2. Разработка
веб-приложений с помощью PHP и MySQL, PHP and MySQL Web Development; Авторы:
Люк Веллинг, Лаура Томсон; Издательство: Вильямс; 2010 г.
. PHP
и jQuery для профессионалов, Pro PHP and jQuery; Автор: Джейсон Ленгсторф;
Переводчик: А. Гузикевич; Языки: Русский; Издательство: Вильямс; 2010 г.
. AJAX:
программирование для Интернета; Автор: Елена Бенкен; Издательство:
БХВ-Петербург; 2012 г.
. Головоломки
на PHP для хакера.2 изд; Автор: Максим Кузнецов; Издательство: БХВ-Петербург,
2008 г.
. Объектно-ориентированное
программирование на PHP; Автор: Максим Кузнецов; Издательство: БХВ-Петербург,
2012 г.
. Интернет-ресурс:
http://www.php. su/ - мощнейший информационный сайт по функциям и классам языка
программирования PHP.
. Интернет-ресурс:
http://php.net/manual/ru/ - русскоязычная документация по языку PHP на
официальном сайте PHP.net.
. Интернет-ресурс:
http://www.softtime.ru/bookphp/ - весьма неплохой справочник по функциям PHP.
. Интернет-ресурс:
http://htmlbook.ru/ - мощный справочник по тегам HTML, каскадным таблицам
стилей CSS и некоторым JavaScript функциям.
. Интернет-ресурс:
http://learn. javascript.ru/ - мощнейший сайт документации по языку JavaScript:
учебники, книги, справочники, форум, чат и многое другое.
. Интернет-ресурс:
http://api. jquery.com/ - API-документация по JQuery.
. Интернет-ресурс:
http://api. jqueryui.com/ - API-документация по JQuery UI.
. Интернет-ресурс:
http://jquery. page2page.ru/index. php5/JQuery_UI - мощная справочная система
по JQuery UI.
. Интернет-ресурс:
http://www.jqwidgets.com/jquery-widgets-documentation/ - документация к
библиотеке JQWidgets.
Приложения
Приложение 1
Создание структуры базы данных:NAMES utf8;DATABASE IF NOT
EXISTS unionpoint DEFAULT CHARACTER SET utf8;TABLE IF NOT EXISTS product (int
(5) NOT NULL AUTO_INCREMENT,VARCHAR (50) NOT NULL,_number_of_product VARCHAR
(50) NOT NULL, sheet_number int (5) NOT NULL,VARCHAR (50) NOT
NULL,_number_of_node VARCHAR (50) NOT NULL,_all int (5) NOT
NULL,_node_of_product VARCHAR (50) NOT NULL,DATE NOT NULL,_of_product_code
VARCHAR (50) NOT NULL, number_of_product VARCHAR (50) NOT NULL,KEY (id));TABLE
IF NOT EXISTS node (_id int (5) NOT NULL AUTO_INCREMENT,int (5) NOT
NULL,VARCHAR (50) NOT NULL,_drawing VARCHAR (50) NOT NULL,_number VARCHAR (50)
NOT NULL,VARCHAR (50) NOT NULL,_name VARCHAR (50) NOT NULL,VARCHAR (50) NOT
NULL,_1 VARCHAR (50) NOT NULL,VARCHAR (50) NOT NULL,VARCHAR (50) NOT NULL,
VARCHAR (50) NOT NULL, VARCHAR (50) NOT NULL, KEY (id) REFERENCES product2
(id),KEY (node_id));TABLE IF NOT EXISTS order (_id int (5) NOT NULL AUTO_INCREMENT,_of_order
VARCHAR (50) NOT NULL,KEY (order_id));TABLE IF NOT EXISTS route (_id int (5)
NOT NULL AUTO_INCREMENT,int (5) NOT NULL,_id int (5) NOT NULL,_of_route VARCHAR
(50) NOT NULL,_of_operation VARCHAR (50) NOT NULL, name_of_equipment VARCHAR
(50) NOT NULL, code_of_equipment VARCHAR (50) NOT NULL,VARCHAR (50) NOT
NULL,VARCHAR (50) NOT NULL,VARCHAR (50) NOT NULL,_time_1 VARCHAR (50) NOT
NULL,_1 VARCHAR (50) NOT NULL,_time VARCHAR (50) NOT NULL,VARCHAR (50) NOT
NULL,_personnel_number VARCHAR (50) NOT NULL,VARCHAR (50) NOT NULL,_operation
VARCHAR (50) NOT NULL,KEY (id) REFERENCES node2 (node_id),KEY (order_id)
REFERENCES order2 (order_id), PRIMARY KEY (route_id));TABLE IF NOT EXISTS card
(_id int (5) NOT NULL AUTO_INCREMENT,_id int (5) NOT NULL,VARCHAR (50) NOT
NULL,VARCHAR (50) NOT NULL,_create DATE NOT NULL,_change DATE NOT NULL,_current
DATE NOT NULL,int (5) NOT NULL,_number_card VARCHAR (50) NOT NULL,
number_of_parts_card int (5) NOT NULL,_part int (5) NOT NULL,_part VARCHAR (50)
NOT NULL,_part int (5) NOT NULL,KEY (route_id) REFERENCES route2 (route_id),
PRIMARY KEY (card_id));TABLE IF NOT EXISTS defect (_id int (5) NOT NULL
AUTO_INCREMENT,_id int (5) NOT NULL,_create DATE NOT NULL,_add int (5) NOT
NULL,_brak int (5) NOT NULL,_ves int (5) NOT NULL,_brak TEXT NOT NULL,_otk TEXT
NOT NULL,KEY (route_id) REFERENCES route2 (route_id), PRIMARY KEY
(defect_id));TABLE IF NOT EXISTS eq (_id int (5) NOT NULL AUTO_INCREMENT,int
(5) NOT NULL,VARCHAR (50) NOT NULL,_eq VARCHAR (50) NOT NULL,_eq VARCHAR (50)
NOT NULL,VARCHAR (50) NOT NULL,_eq VARCHAR (50) NOT NULL,_eq BOOLEAN NOT
NULL,_name VARCHAR (50) NOT NULL,_master VARCHAR (50) NOT NULL,KEY
(eq_id));TABLE route ADD note VARCHAR (50) NOT NULL,route_mode VARCHAR (50) NOT
NULL;TABLE route ADD number_detal int (5) NOT NULL;
Затем предварительный вариант был сильно расширен, где
добавились дополнительные поля и таблицы, а именно: таблица авторизации, где
хранится уникальный ID пользователя, группы для настройки прав доступа;
параметры, определяющие права доступа. Например, имя страницы соответствует
столбцу в таблице и при сравнении учитывается такой параметр для доступа к
ведомостям, и многим другим функциям.
Добавилась таблица ведомостей, где ID соответствует
первичному ключу в таблице, а FOREIGN KEY ссылается на первичный ключ в другой
таблице, где хранятся заказы. Пример:KEY (id) REFERENCES product (id), PRIMARY
KEY (id)
Такая система первичных и вторичных ключей позволяет хорошо
организовать структуру базы данных для последующего вывода, записи и логических
операций в системе управления предприятием.
Также добавлена таблица "route", состоящая из
первичного и вторичных ключей, позволяющая, в свою очередь, организовать связь
с другими таблицами:KEY (id) REFERENCES node (id), FOREIGN KEY (id) REFERENCES
order (id), PRIMARY KEY (id)
Такая система позволяет организовать связь между таблицами
заказов и ведомостей. Маршрутная карта, получается, связана с другими таблицами
посредством первичных (PRIMARY KEY) и вторичных (FOREIGN KEY) ключей.
Таблица "card" хранит карты раскроя и другую
специальную информацию технологического процесса. Тоже присутствует
"card_id" и REFERENCES с "route_id" на "id" в
таблицу "route". В таблице "defect" хранятся акты о браке
по принципу карт раскроя, а в таблице "eq" перечень оборудования.
Разработаны специальные формы для занесения данных, о которых
пойдет речь в другом разделе.
По ходу создания сайта структура базы данных неоднократно
менялась, добавлялись новые столбцы, старые удалялись, переименовывались и в
итоге: получилась именно такая структура, как наиболее эффективная и удобная в
системе управления предприятием.
Приложение 2
Для масштабируемой верстки на сайте используются
относительные размеры. Например, для блока "conteiner":
#conteiner{: 95%;: auto;color: #d3d1d1;shadow: 0px 2px 2px #444;:
1px solid #4e4d4d;color: #e9e9e9;width: 800px;height: 600px;
}
Так мы добиваемся масштабируемости в зависимости от размера
экрана устройства (параметр width: 95%), равномерный отступ (параметр margin:
auto), тени по краям блока (параметр box-shadow: 0px 2px 2px #444) и
максимальную ширину (параметр min-width: 800px), чтобы наша страница не
превратилась в кашу и маленьком разрешении экрана.
Все параметры CSS помещаются в отдельный файл "style.
css" и подключаются в начале каждой страницы:
<link rel="stylesheet" href="css/style.
css" type="text/css" />
Такая конструкция обеспечивает отсутствие переизбытка
программного кода на сайте.
Заголовок каждой страницы настраивается тоже из одного файла:
#header {: url (. /img/shapka. gif) repeat-x;: 1px solid #dadada;:
60px;bottom: 30px;style: normal;size: 0.9em;
}
Такой подход обеспечивает максимально упрощенный вариант
написания программного кода, облегчает понимание и распознавание другими
разработчиками.
Блок внизу сайта тоже настраивается через "style.
css", вот таким способом:
#footer {: left;top: 1px solid #4e4d4d;align: right;size:
0.6em;style: normal;: 30px;: 95%;
}
Что нам дает полосу сверху, отступ и масштабируемость при
разном размере экрана.
Поле ввода пароля тоже настраивается через CSS-файл:
#password {align: center;size: 1.2em;: 16px;
}
А также другие поля и поля при наведении:: hover {:
green;weight: bold;
}{: left;left: 50px;
}
. normer{: 100%;align: center;image: url (. /img/normer.
gif);
}
. print_button img{: 25px;: pointer;: left;
}
. error{: red;: relative;: 150px;
Приложение 3
Программные файлы на сайте имеют иерархическую структуру. В
начале у нас создается файл библиотеки "lib. php", где находятся
основные функции работы с базой данных.
<? php"deff. php";LibUP {$arrMap = array
("Лос", "Гильотина", "Гибочный пресс",
"Плазма",
"Газорезка", "Токарная",
"Расточная",
[…]NewOpenBaseDataMySQL ($pdoSet) {
// блок подключения к базе данных{
$pdoSet = new PDO ('mysql: host='. DTBASE_SERVER,
DTBASE_USER, DTBASE_PASSWORD);
} catch (PDOException $e) {'Error: '. $e->getMessage
();false;
}
$pdoSet->query ('SET NAMES utf8; ');
$stmt = $pdoSet->query ('USE '. DTBASE_NAME);
[…]
}
$stmt = $pdoSet->query ('SELECT * FROM node2; ');( (!
$stmt) || ($stmt->rowCount () == 0)) {
[…]
$pdoSet->query ($query);
}$pdoSet;
}
Также функции работы с датой:GetOverData ($valover, $mode) {(
(isset ($_POST [$valover])) && ($_POST [$valover]! = '')) {($mode == 0)
{
$newDate = $_POST [$valover];
}($mode == 1) {
$originalDate = $_POST [$valover];
$newDate = date ("d-m-Y", strtotime
($originalDate));
}
} else {($mode == 0) {
$newDate = date ('Y-m-d', time ());
}($mode == 1) {
$newDate = date ('d-m-Y', time ());
}
}$newDate;
}
Заголовок на каждой странице вызывается из одного метода
класса:ViewHeader () {
// проверка пароля при входе в систему( (! file_exists ('.
htaccess')) && (! file_exists ('. htpasswd'))) {( (! isset ($_COOKIE
["index"])) || (crypt ("union full danied for cookie",
$_COOKIE ["index"])! = $_COOKIE ["index"]))
{"<script>document. location. href='sign. php? role=index';
</script>";;
}
}"<a href=\"index. php\"><div
id=\"header\"><img src=\"img/logo_ask_grey. gif\"
title=\"Система управления предприятием\" alt=\"Система
управления предприятием\" /><div><h3>СУПП<br
/>Система управления производственными
процессами</h3></div></div></a>";
// навигационное меню"<input type=button
onClick=\"history. back (); \" style=\"width: 130px; cursor:
pointer; \" value=' ← Назад '>";"<input
type=button onClick=\"history. forward (); \" style=\"width:
130px; cursor: pointer; \" value=' Вперед →
'>";"<input type=button onClick=\"location. href='index.
php'\" style=\"width: 130px; cursor: pointer; \" value='
α ск Главная '>";
[…]
}
В начале каждого файла происходит наследование
класса:"lib. php";MailIndex extends LibUP {
[…]
}
А также подключение стилевых таблиц, вспомогательных
библиотек JavaScript:
<link rel="stylesheet"
href="css/themes/base/jquery. ui. all. css" type="text/css"
/>
<link rel="stylesheet" href="css/style.
css" type="text/css" />
<script src="js/all. js"></script>
<script src="js/jquery-1.5.1
js"></script>
<script src="js/ui/jquery. ui. core.
js"></script>
<script src="js/ui/jquery. ui. widget.
js"></script>
<script src="js/ui/jquery. ui. position.
js"></script>
<script src="js/ui/jquery. ui. autocomplete.
js"></script>
<script src="js/ui/jquery. ui. accordion.
js"></script>
Потом идет настройка этих библиотек:
<script type="text/javascript">
$ (function () {
$ ("#accordion"). accordion ({: false,: true,: true
});
});
</script>
Так настраивается на нашем сайте "Аккордион", а
подключается так:
<div id="accordion"> - достаточно указать id,
все очень просто подключается.
Так вызываются селекторы: $this->Selector ('question');
Код самого селектора:Selector ($button_id) {
$query = "SELECT tech_id, dogovor_number, dogovor_date
FROM tech ORDER BY tech_id; ";
@ $stmt = $this->pdo->query ($query);( ($stmt)
&& ($stmt->rowCount () > 0)) {"В наличии: <select
id=\"". $button_id. "_tech_id\">";($i=0; $row =
$stmt->fetch (); $i++) {( (isset ($_POST ["tech_id"])) &&
($_POST ["tech_id"] == $row ["tech_id"])) {"<option
value=\"". $row ["tech_id"]. "\"
selected>". $row ["dogovor_number"];
} else {"<option value=\"". $row
["tech_id"]. "\">". $row
["dogovor_number"];
}
}
}
Так просто на сайте можно выбрать номер договора.
Функция "autocomplite" создается скриптом
PHP:ScriptJSForDraftSearch () {
$query = "SELECT * FROM draft2 ORDER BY id; ";
@ $stmt = $this->pdo->query ($query);( ($stmt)
&& ($stmt->rowCount () > 0)) {"<script>";"$
(function () {";"var availableTags = [";($i=0; $row =
$stmt->fetch (); $i++) {($i < $stmt->rowCount () - 1)
{"\"". $row ["number_draft"]. "\",";
} else {"\"". $row ["number_draft"].
"\"";
}
}"]; ";"$ (\"#draft_id\").
autocomplete ({";"source: availableTags";"});
";"}); ";"</script>";
}
}
<input id="draft_id"> - а так просто
подключается на сайте.
С помощью скрипта "jqxValidator" мы выдаем
всплывающую подсказку:
<script type="text/javascript">
$ (document). ready (function () {
$ ("Form"). jqxValidator ({ rules: [
{ input: "#draft_id", message: 'Не менее 5
символов! ', action: 'keyup click', rule: 'minLength=5' }]
});
});
</script>
А с помощью такого скрипта мы показываем кнопку перехода
наверх внизу каждой станицы:
<link rel="stylesheet" href="css/scrollup.
css">
<div id="scrollup">
<img src="img/up. png">
<script src="js/scrollup. js"></script>
</div>
В каждом файлу мы показываем заголовок с помощью вызова
метода:
$MyIndex->ViewHeader ();
Там же происходит проверка авторизации.
Таким образом, мы подключаем текстовый редактор:
<link rel="stylesheet" type="text/css"
href="js/jqwidgets/styles/jqx. base. css" />
<script type="text/javascript"
src="js/scripts/angular. min. js"></script>
<script type="text/javascript"
src="js/scripts/jquery-1.11.1 min. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxcore. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxdata. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxbuttons. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxcheckbox. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxdropdownlist. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxwindow. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxmenu. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxscrollbar. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxeditor. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxlistbox. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxdropdownbutton. js"></script>
<script type="text/javascript"
src="js/jqwidgets/jqxangular. js"></script>
<script type="text/javascript"
src="js/scripts/demos. js"></script>
<script type="text/javascript">demoApp =
angular. module ("demoApp", ["jqwidgets"]);. controller
("demoController", function ($scope) {
$scope. content = $ ("#textEdit").html ();
$scope. editorSettings = { width: 800, height: 300 };
$scope.html = "";
$scope. $watch ("content", function () {
$scope.html = $
("<TEXTAREA></TEXTAREA>").html ($scope. content). text
();
});
});
</script>
А с помощью функции PHP вызываем редактор на
странице:GetJavaEditor ($textEdit) {"<tr><td
colspan=\"4\">";"<div
ng-controller=\"demoController\">";"<jqx-editor
jqx-settings=\"editorSettings\"
ng-model=\"content\"></jqx-editor>";"<TEXTAREA
NAME=\"dogovor_text_order\" ng-bind=\"html\" COLS=1 ROWS=1
style=\"visibility: hidden; width: 1px; height: 1px; display: none;
\" ></TEXTAREA>";"<div id=\"textEdit\"
style=\"visibility: hidden; display: none; \" >". $textEdit.
"</div>";"</div>";"</td></tr>";
}
В каждом файле есть метод "view", который имеет
структуру:View () {"<FORM ACTION=\"". $_SERVER
['SCRIPT_NAME']. "\" METHOD=\"POST\">";
где у нас есть форма для отправки на сервер с именем
страницы.
Функция показывает заполненную форму для печати:ViewPrint
($tech_id) {"<h2>Заказ-наряд</h2>";"<table>
$this->GetValueInTech ("dogovor_text_order",
$tech_id). "</td></tr>";"</table>";
}
Функции добавления и сохранения:Add () {
$query = "INSERT INTO tech2 (dogovor_order,
dogovor_number, p23, dogovor_name, dogovor_quantity, dogovor_date, p15,
dogovor_text_order) VALUES ('". $_POST ['dogovor_order']. "',
'". $_POST ['dogovor_number']. "', '". $_POST ['p23']. "',
'". $_POST ['dogovor_name']. "', '". $_POST
['dogovor_quantity']. "', '". $_POST ['dogovor_date']. "',
'". $_POST ['p15']. "', '". $_POST ['dogovor_text_order'].
"'); ";
$this->pdo->query ($query);
}Save ($tech_id) {
$query = "UPDATE tech2 SET dogovor_order='". $_POST
['dogovor_order']. "', dogovor_number='". $_POST ['dogovor_number'].
"', p23='". $_POST ['p23']. "', dogovor_name='". $_POST
['dogovor_name']. "', dogovor_quantity='". $_POST
['dogovor_quantity']. "', dogovor_date='". $_POST ['dogovor_date'].
"', p15='". $_POST ['p15']. "', dogovor_text_order='".
$_POST ['dogovor_text_order']. "' WHERE tech_id='". $tech_id.
"'; ";
$this->pdo->query ($query);
}
Функции выбора чертежа, загрузки и скачивания:GetOutBase
($number_of_drawing) {
@ $stmt = $this->pdo->query ("SELECT * FROM
draft2; ");( (! $stmt) || ($stmt->rowCount () == 0)) {
$query="CREATE TABLE IF NOT EXISTS draft2 (id int (5)
NOT NULL AUTO_INCREMENT, number_draft VARCHAR (50) NOT NULL, fname_draft
VARCHAR (50) NOT NULL, PRIMARY KEY (id)); ";
$this->pdo->query ($query);
}
@ $stmt = $this->pdo->query ("SELECT id,
fname_draft FROM draft2 WHERE number_draft='". $number_of_drawing.
"'; ");( ($stmt) && ($stmt->rowCount () > 0)) {
$row = $stmt->fetch ();"<p>Номер чертежа:
<b> [". $number_of_drawing. "] ЕСТЬ</b> в базе.
</p>";"<FORM ACTION=\"file. php\"
METHOD=\"POST\">";"<INPUT TYPE=\"hidden\"
NAME=\"id\" VALUE=\"". $number_of_drawing.
"\">";"<p><INPUT TYPE=\"submit\"
NAME=\"download\" VALUE=\" Скачать
\"></p>";"</FORM>";
} else {"<p>Номера чертежа <b> [".
$number_of_drawing. "] НЕТ</b> в базе.
</p>";"<FORM ENCTYPE=\"multipart/form-data\"
ACTION=\"". $_SERVER ['SCRIPT_NAME']. "\"
METHOD=\"POST\">";"<INPUT TYPE=\"hidden\" NAME=\"id\"
VALUE=\"". $number_of_drawing.
"\">";"<p><INPUT TYPE=\"submit\"
NAME=\"upload\" VALUE=\" Загрузить файл
\"></p>";"<p><INPUT TYPE=\"file\"
NAME=\"userfile\"></p>";"</FORM>";
}
}Upload ($number_of_drawing) {($_FILES ['userfile']
['tmp_name']! = '') {
$query="SELECT * FROM draft2 WHERE number_draft='".
$number_of_drawing. "'";
@ $stmt = $this->pdo->query ($query);( (! $stmt) ||
($stmt->rowCount () < 1)) {
$query="INSERT INTO draft2 (number_draft, fname_draft)
VALUES ('". $number_of_drawing. "', '". $_FILES
["userfile"] ["name"]. "'); ";
@ $stmt = $this->pdo->query ($query);
}
$query="UPDATE draft2 SET fname_draft='". $_FILES
["userfile"] ["name"]. "' WHERE number_draft='".
$number_of_drawing. "'; ";
@ $stmt = $this->pdo->query ($query);
$query="SELECT id, fname_draft FROM draft2 WHERE
number_draft='". $number_of_drawing. "'";
@ $stmt = $this->pdo->query ($query);
$row = $stmt->fetch ();(! file_exists ('draft/'))
{('draft/');
}(! file_exists ('draft/id_'. $row ['id']. "/"))
{('draft/id_'. $row ['id']. "/");
}($_FILES ['userfile'] ['tmp_name'], "draft/id_".
$row ['id']. "/id. data");
$new_filename = $row ['fname_draft'];(strpos (__FILE__, ':
')! = 0) {
$new_filename = mb_convert_encoding ($new_filename,
"Windows-1251", "utf-8");
}($_FILES ['userfile'] ['tmp_name'], "draft/id_".
$row ['id']. "/". $new_filename);($stmt) {"<p>Файл успешно
добавлен. </p>";
} else {"<p>Произошла ошибка при добавлении файла!
</p>";
}
} else {"<p>Имя файла не должно быть пустым!
</p>";
}
}SelectorDraft () {
$query = "SELECT * FROM draft2 ORDER BY id; ";
@ $stmt = $this->pdo->query ($query);( ($stmt)
&& ($stmt->rowCount () > 0)) {"В наличии: <select
id=\"selector_draft_id\" style=\"width: 60%; margin-top: 2px;
\">";($i=0; $row = $stmt->fetch (); $i++) {( (isset ($_POST
["selector_draft_id"])) && ($_POST
["selector_draft_id"] == $row ["number_draft"]))
{"<option value=\"". $row ["number_draft"].
"\" selected>". $row ["number_draft"];
} else {"<option value=\"". $row
["number_draft"]. "\">". $row
["number_draft"];
}
}
}NewDraft () {"<table style=\"width: 430px;
margin: auto; \"><tr><td colspan=\"2\"><FORM
ENCTYPE=\"multipart/form-data\" ACTION=\"". $_SERVER
['SCRIPT_NAME']. "\" METHOD=\"POST\">";"<p
style=\"width: 100%\">Номер чертежа <br /> (в спец. форм.
XX. XX. XXX. XXX и т.п.): <br /><INPUT TYPE=\"text\"
NAME=\"id\" style=\"width: 330px;
\"></p>";"</td></tr><tr><td><p><INPUT
TYPE=\"file\" NAME=\"userfile\"></p><br
/>";"</td><td><INPUT style=\"width: 130px;
\" TYPE=\"submit\" NAME=\"upload\" VALUE=\" Загрузить
файл
\">";"</FORM></td></tr>";"<tr><td
style=\"text-align: center; padding: 30px;
\">";$this->SelectorDraft
();"</td><td><input type=button
id=\"draft_download\" style=\"width: 130px; cursor: pointer;
margin-top: 2px; \" value=' Скачать
'>";"</td></tr>";"</table>";
}