1
Digitalt arkiv
av
Emil Abrahamsson
Institutionen för matematik, natur- och datavetenskap
Högskolan i Gävle
S-801 76 Gävle, Sweden
E-post:
emil@gavle.to
Abstrakt
Grunden för detta arbete har varit att förenkla hantering och sökning bland ritningar
och förteckningar i ett ritningsarkiv. Lösningen har blivit ett webbaserat datasystem
som bygger på en databas där all information lagras och är sökbar. Resultatet har
blivit ett system som man oavsett var man befinner sig inom företagets nätverk ha
tillgång till alla ritningar och förteckningar på ett snabbt och effektivt sätt.
2
Innehåll
1
Introduktion ... 3
1.1
Bakgrund... 3
1.1.1
Företaget Roundo ... 3
1.2
Syfte... 3
1.3
Mål... 3
1.4
Frågeställningar ... 3
2
Teori ... 4
2.1
PHP: Hypertext Preprocessor ... 4
2.2
MySQL ... 4
2.3
CSS – Cascading Style Sheets... 4
2.4
XHTML ... 4
3
Förutsättningar och krav ... 5
3.1
Kravspecifikation... 5
4
Beskrivning av konstruktionslösning... 5
4.1
Databasen... 6
4.2
Systemet... 6
5
Implementering och test ... 6
5.1
Planeringsfasen ... 6
5.2
Implementation av databasen ... 7
5.3
Implementation av systemet ... 7
5.3.1
Huvudsidan ... 7
5.3.2
Sök pdf... 8
5.3.3
Sök ritning... 9
5.3.4
Skapa ritning... 10
5.3.5
Lägg till ritning ... 10
5.3.6
Ny ritningsförteckning ... 10
5.3.7
Maskin/ritningsförteckningar ... 11
5.3.8
Ritningsändringar ... 15
5.3.9
Lista ändringar ... 15
5.3.10
Hantera användare ... 16
5.3.11
CSS-filen ... 16
6
Resultat ... 17
6.1
Databasen... 17
6.2
Systemet... 17
6.3
Svar på frågeställningar ... 17
7
Diskussion ... 17
7.1
PHP ... 17
7.2
MySQL ... 17
7.3
Systemet... 18
7.4
Framtida utveckling ... 18
8
Slutsatser... 18
Referenser ... 19
Webbreferenser ... 19
Bilaga B: Källkod ... 24
3
1
Introduktion
1.1 Bakgrund
Jag har fått i uppdrag av företaget Roundo, i Hässleholm, att programmera ett
webbsystem som ska ligga på deras Intranät. I dagens läge har de ett ritningsarkiv med
massa lådor och pärmar som de får leta i för att hitta den ritning eller maskin som de
är ute efter. Eftersom en maskin kan bestå av upp till ett par hundra ritningar så blir
det för dem väldigt tidskrävande att leta i alla pärmar och lådor. För att underlätta
detta så vill de ha ett ”digitalt ritningsarkiv” som lagrar den information som de har i
alla pärmar och sedan kan ta fram de ritningar som eftersöks som pdf-filer.
1.1.1 Företaget Roundo
Roundo är ett företag i Hässleholm som utvecklar, konstruerar och säljer maskiner
som används för att forma stålprofiler och plåtar. Det grundades 1964 och har sedan
dess fått mer än 10 000 nöjda kunder runt om i hela världen och på så sett blivit ett
världsledande företag inom sin bransch.
1.2 Syfte
Syftet med detta arbete är att för företaget underlätta och effektivisera deras arbete på
bästa möjliga sätt. Genom att skapa detta ritningsarkiv kommer företaget kunna spara
mycket tid genom bland annat kunna få fram alla de ritningar som en maskin består av
som pdf-filer som de sedan kan skriva ut. Genom att de även ska kunna föra in
information om eventuella förändringar som bör genomföras på olika maskiner eller
ritningar så kommer även detta minska misstag och fördröjningar på grund av missar.
1.3 Mål
Målet är att skapa ett effektiv och användarvänligt system så att Roundo i
fortsättningen inte skall vara beroende av alla de pärmar som idag innehåller
information om alla ritningar. De ska även från systemet generera nya ritningsnummer
och revisioner av ritningar.
Målet är även att bygga systemet med moduler för att enkelt kunna lägga till och
ta bort olika funktioner efter förutsättningar och krav.
1.4 Frågeställningar
• Går det att på ett smidigt sätt leta efter ritningar och skriva ut dessa?
• Kan ritningsändringar fångas upp av systemet och går det att lägga in åtgärd
för dessa?
4
2
Teori
2.1 PHP: Hypertext Preprocessor
PHP är ett skriptspråk som i första hand köra på webbservrar för att driva dynamiska
webbsidor som genereras från en databas eller användarformulär.
PHP utvecklades från en samling av Perl-skript av Rasmus Lerdorf. Detta
vidareutvecklades senare av Andi Gutmans och Zeev Suraski som år 1998 lanserade
den färdiga versionen av PHP 3.0.
Version 5 släpptes den 13 juli 2004 med förbättrat stöd för objekt. Senaste
uppdateringen är 5.2.6 kom 6 maj 2008. [1]
2.2 MySQL
MySQL är en fri databashanterare som är licensierad under GNU General Public
License. Det är en av de populäraste databashanterarna inom Linux-världen, men finns
för de flesta stora operativsystemen också.
Programmet har utvecklats av företaget MySQL AB i Uppsala, som också säljer
support, servicekontrakt och kommersiella licensierade kopior. Programmets
huvudsaklige utvecklare är Michael Widenius och David Axmark. [2]
2.3 CSS – Cascading Style Sheets
CSS är ett språk som används för att beskriva presentationsstilen för ett strukturerat
dokument.
Språket utvecklades av Håkon Wium Lie och Berc Bos 1994 och används främst
för att presentera informationen i ett XML- eller XHTML-dokument eftersom de
endast innehåller strukturerad text utan stilinformation. Det kan även användas för att
anpassa presentationen efter fler olika medier som till exempel hur det skrivs ut på ett
papper, en webbsida eller på en mobiltelefon.
Användandet av dessa mallar kan spara mycket tid och arbete eftersom man bara
behöver ändra på ett enda ställe för att förändra utseendet på flera filer. [3]
2.4 XHTML
Extensible Hypertext Markup Language (XHTML) är ett standard format för
webbsidor som har specificerats av W3C (se Ordlista). Märkspråket XHTML är en
vidareutveckling av HTML (se Ordlista). Skillnaden mellan de båda är att XHTML är
baserat på XML istället för SGML vilket gör språket mer strikt. XHTML började
utvecklas som en omformulering av HTML i XML och anses av många vara den nya
versionen av HTML, men XHTML är ett separat märkspråk.
XHTML 1.0 som alltså är en omformulering av HTML 4.01 som XML och
definieras på samma sätt som HTML 4.01 av tre olika dokumentmallar, XHTML 1.0
Strict, XHTML 1.0 Transitional och XHTML 1.0 Frameset (se Ordlista). Skillnaderna
mellan dessa är att i Strict så tillåts inte vissa utgångna element som exempelvis ”font”
eller ”center” (se Ordlista) medan de är tillåtna i Transitional. Frameset liknar HTML
4.01 Frameset fast med XML syntax. Den vanligaste dokumentmallen som används är
Transitional.
År 2000 blev XHTML 1.0 en W3C-rekommendation och år 2001 kom version
1.1 som en ny rekommendation. [4]
5
3
Förutsättningar och krav
Förutsättningarna för detta arbete har varit goda. Jag har av kunden helt själv fått välja
programmeringsspråk och databashanterare som jag ville använda.
Att företaget ligger i Hässleholm och jag inte har haft möjlighet att vara där nere
hela tiden har varit lite problematiskt. Lösningen blev att jag har jobbat mot en sida på
internet där jag kunnat ladda upp och testa alla sidor och sedan vid de tillfällen som
jag åkt ner till Hässleholm kunnat lägga över de funktioner som varit klara allt
eftersom.
Kraven från kunden har varit att skapa ett system som de kan ha på sitt intranät.
Systemets huvudsakliga uppgift ska vara att hantera alla företagets ritningar på lång
sikt. Man ska i systemet kunna söka fritt bland alla ritningar som är inlagda, man ska
även kunna söka på en specifik maskin och då kunna få upp alla ritningar som denna
maskin är byggd av. Användarna av systemet skall även kunna lägga in förslag på
önskade ritningsändringar. Dessa ritningsändringsförslag ska sedan de som jobbar på
konstruktionsavdelningen kunna ta fram och lägga in vilken åtgärd som har gjorts.
Systemet skall även kunna skriva ut alla ritningar som är nödvändiga för en
maskin och de ska skickas till rätt skrivare i förhållande till formatet på ritningen. Det
ska även gå att själv välja antalet av respektive ritning.
3.1 Kravspecifikation
Från Roundo fick jag följande krav och önskemål om funktioner:
Kunna lagra all nödvändig information om ritningar.
• Kunna koppla samman ritningar till maskiner och delar av maskiner.
• Kunna söka bland ritningarna/maskinerna med avseende på följande
parametrar:
o Maskinnummer
o Serie
o Benämning
o Maskintyp
o Ritningsnummer
o Revision
o Datum
o Anmärkning
o Om ritningen ersätter en annan ritning
o Om ritningen är ersatt av en annan ritning
• Kunna lägga in information om det finns saker på ritningar som behöver
ändras.
• Att konstruktörerna ska kunna få fram denna information innan de skapar en
maskin eller serie och då också kunna lägga in att de har åtgärdat problemet.
• Önskemål om att direkt från systemet direkt kunna skriva ut alla ritningar i de
antal som önskas för ett visst ändamål.
4
Beskrivning av konstruktionslösning
Jag kommer bygga hela systemet till väldigt stor del på en databas. Detta för att göra
det enkelt att kontrollera och uppdatera systemet. Alla ritningar kommer finnas
sparade som PDF filer på en server och i databasen kommer sökvägen till dessa
finnas. Språken jag kommer använda mig av är PHP och HTML, databasen kommer
jag bygga i MySQL.
6
4.1 Databasen
Databasen består av 10 olika tabeller som lagrar olika delar av informationen som
behövs för alla ritningar, maskiner och orders. Det finns även en tabell som lagrar
användarinformation och en för att hantera alla menyelement. Jag har valt att ha ett
prefix för alla tabeller för att underlätta om man ska anpassa databasen för något annat
företag. Detta prefix är roundo_. Alla tabeller och kolumner har engelska namn för att
slippa ersätta å ä och ö men a och o. Detta för att minimera risken för missförstånd och
feltolkningar. För att se fullständig information om databasen se bilaga A.
4.2 Systemet
Systemet skapar jag med PHP som huvudsakligt språk, men även en del XHTML
kommer användas. För att sköta utseendet på alla sidor så används en CSS fil.
Grunden av systemet är en startsida som i sin tur anropar andra PHP-filer,
beroende på vad för sida som ska visas för stunden, utifrån olika variabler. Denna
konstruktion gör hela systemet mer överskådligt och gör även det möjligt att välja att
vissa funktioner bara ska vara tillgänglig för vissa användargrupper. Det underlättar
även om det är så att man vill lägga till eller ta bort olika funktioner.
5
Implementering och test
5.1 Planeringsfasen
Det första jag gjorde var att sätta mig och fundera på en struktur av systemet med
lämpliga huvudsidor och undersidor och hur de olika funktionerna som efterfrågades
skulle kopplas till varandra.
Figur 1: Första skiss av systemstruktur
När detta var gjort började planeringen av databasen. För att göra detta så samlade jag
in exempel av ritningsförteckningar, maskinförteckningar och orders som skulle in i
systemet. Med dessa papper som grund började jag skissa på vilka tabeller som
behövdes, lämpliga primärnycklar och främmande nycklar. Första utkastet till
databasen blev 6 olika tabeller.
7
5.2 Implementation av databasen
Databasen har jag skapat med MySQL som databashanterare. Som verktyg har jag
använt det grafiska gränssnittet phpMyAdmin som är väldigt populärt bland olika
webbhotell. I detta skapade jag alla de tabeller som jag trodde var nödvändiga. Men
dessa har under implementeringen av systemet fått modifieras. Vissa tabeller och fält
har jag upptäck varit onödiga och andra har jag saknat och således fått lägga till. Den
slutgiltiga databasstrukturen kan du se i bilaga A. Databasen är normaliserad i tredje
normalform, så när som tabellen roundo_users där kolumnen name innehåller både för
och efternamn.
5.3 Implementation av systemet
Jag har haft som mål att hela systemet skall vara validerat av W3C [5] för både
XHTML, enligt XHTML Transitional, och CSS.
5.3.1 Huvudsidan
Huvudsida, index.php, är väldigt enkel. Den är skriven i huvudsak XHTML med vissa
stycken av PHP-kod för att läsa in de olika sidor som ska visas.
I början av filen har jag ett PHP-stycke som inkluderar en PHP-fil som heter
dbfunc.php och även startar en session för att lagra användarinformation [6].
I övrigt har jag byggt upp sidan med fem <div>-taggar. Jag har en som definierar
hela sidan, detta för att ha möjlighet att centrera sidan i webbläsarfönstret. Sen består
den i sin tur av fyra delar: header, left, content och footer. Left är den del där menyn
läses in och content är den del där alla olika sidor laddas.
Vilken sida som ska laddas styrs av en if-sats i PHP:
<?php
if($_SESSION['online'] || isset($_REQUEST['page'])){
if(isset($_REQUEST['page']))
require_once('pages/'.$_REQUEST['page'].'.php');
else
require_once('pages/inside.php');
}else
require_once('pages/start.php');
?>
Detta kodstycke kollar helt enkelt om någon är inloggad och vad variabeln
$_REQUEST[’page’] är satt till. Om $_REQUEST[’page’] är satt så laddas helt enkelt
den sidan in. Om den inte är satt men någon är inloggad så laddas filen inside.php.
Och om inte någon är inloggad så laddar start.php som innehåller
inloggningsformuläret.
5.3.1.1 dbfunc.php
Denna fil innehåller tre funktioner, en för att starta en databaskoppling,
startDBConnection, en för att stänga en databaskoppling, stopDBConnection, och en
funktion som returnerar en sträng innehållande XHTML-koden för menyn,
generateMenu. Den läser även in en fil som heter settings.php som innehåller
definitioner av följande konstanter:
• DB_USER – användarnamnet på databasen
• DB_PASSWORD – lösenordet för databasen
• DB_HOST – servernamnet för databasen
• DB_NAME – namnet på databasen
• TABLE_PREFIX – prefixet för alla tabeller
8
Anledningen till att jag lagt dessa konstanter i en egen fil är för att det ska vara enkelt
att anpassa allt detta till andra system eller servrar, om så önskas, utan att behöva gå in
på allt för många ställen i koden och modifiera.
5.3.1.2 Menyn
Menyn, som laddas in på huvudsidan, skapas av funktionen generateMenu i filen
dbfunc. Det denna funktion gör är att den hämtar alla rader i tabellen roundo_menu
som har en aktiv status och har den behöringhetsnivån som den inloggade användaren.
Detta sorterar den sedan på kolumnen order för att få menyn sorterad på det sätt som
önskas. Utifrån den information som databasen returnerar så skapar den sedan den
XHTML-kod som behövs för att visa menyn med länkarna.
5.3.1.3 Inloggningsfunktion
Inloggningsfunktionen är väldigt simpel, den tar helt enkelt det användarnamn som
skrivs in i formuläret och kontrollerar om det är ett av de användarnamn som finns
lagrade i databasen. Om så är fallet så sätts sessionsvariabler för att man är inloggad,
namn på användaren och vilket behörighet personen har. Lösenord har valts att inte
användas då Roundo inte ansåg detta vara nödvändigt eftersom systemet bara ligger på
deras intranät.
5.3.2 Sök pdf
Detta blev en extra funktion som efterfrågades under arbetets gång. Denna funktion
gör det möjligt för användaren att söka bland alla pdf-filer som finns utan att det ska
finnas inlagd information i databasen. Detta för att de redan nu skulle kunna få nytta
av systemet trots att inte all information lagrats.
Det som sker här är att det visas ett sökformulär där användaren skriver in ett helt
eller en del av ett ritningsnummer. Utifrån det så kollas alla filer i ritningsmappen
igenom och ser om det matchar sökkriteriet. För att hämta alla filer i mappen använder
jag följande funktion:
function getFiles($dir) {
$files = array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if(filetype("$dir/$file")!="dir")
$files[] = $file;
}
closedir($dh);
}
}
return $files;
}
Denna funktion returnerar en array med alla filer som finns i sökvägen som kommer
som parametrar. Denna array matchas sedan mot sökkriteriet.
9
5.3.3 Sök ritning
Denna funktion skiljer sig från sök pdf på så sätt att den utgår från informationen i
databasen istället för vilka filer som finns i mappen för ritningarna.
Detta är uppbyggt av två filer, en som genererar själva sökformuläret,
search_drawing.php, och en som presenterar resultatet, search_result.php.
Figur 2: Sökformuläret för sök ritningsfunktionen
I formuläret, se figur 2, behöver man bara fylla i så mycket man vet, eller inget alls,
och då hämtas informationen för alla ritningar som passar in på kriterierna. Detta
genom att fråga efter all information i tabellen roundo_drawings där det som står i
formuläret ska vara en del av den information som är inlagd i respektive formulär.
Frågan för detta ser ut som följer:
'SELECT * FROM '.TABLE_PREFIX.'drawings WHERE
drawingID LIKE "%'.$_REQUEST['drawingID'].'%" AND
review LIKE "%'.$_REQUEST['review'].'%" AND
machinetype LIKE "%'.$_REQUEST['machinetype'].'%" AND
designation LIKE "%'.$_REQUEST['designation'].'%" AND
designation2 LIKE "%'.$_REQUEST['designation2'].'%" AND
observation LIKE "%'.$_REQUEST['observation'].'%" AND
drawed_by LIKE "%'.$_REQUEST['drawed_by'].'%"
ORDER BY drawingID, review'
TABLE_PREFIX är en av de definierade konstanterna, de olika
$_REQUEST-variablerna är den information som kommer från formuläret. Svaret sorterar jag på
både ritningsnumret, drawingID, och revisionen, review.
Resultatet presenteras sedan i en tabell, se figur 3, där det även finns en länk till
pdf-filen för respektive ritning, under förutsättning att det finns en pdf för ritningen.
10
5.3.4 Skapa ritning
Detta är en funktion för att skapa en ny ritning. Först kommer man till ett formulär, se
figur 4, som ligger i filen create_drawing.php, där användaren väljer vilken typ och
storlek det ska vara på ritningen. Detta bestämmer första siffran och/eller bokstaven i
ritningsnumret.
När man tryckt på nästa kommer man till ett formulär där man får fylla i övrig
information om ritningen. Ritningsnumret är för ifyllt med numret efter det högsta
som ligger lagrat i databasen för respektive ritningstyp/storlek.
Figur 4: Formulär för att skapa ritning
När användaren fyllt i all information och trycker på skapa så läggs informationen in i
databastabellen roundo_drawings.
5.3.5 Lägg till ritning
Detta är en funktion för att lägga till information om äldre ritningar, som skapats innan
systemet kommer i funktion, och att lägga till nya revisioner av ritningar. Formuläret
är i stort sett identiskt med formuläret för att skapa ritning förutom att det även finns
en knapp för att skapa ny revision. Huvudformuläret ligger i filen add_drawing.php,
och om man väljer ny revision så krävs att man har fyllt i ett ritningsnummer, om det
är ifyllt och det finns sedan tidigare i databasen kommer man till ett likadant formulär
där den information som ligger lagrad i databasen kommer för ifylld. Ett extra fält
finns för att skriva in vilka förändringar som gjorts från de tidigare revisionerna. Ny
revision sköts av filen new_review.php.
5.3.6 Ny ritningsförteckning
Detta är funktionen för att skapa de ritningslistor som finns för respektive maskintyp.
Här kommer man först till ett stort formulär, se figur 5, där användaren börjar fylla i
information om maskintyp, information, vilka ritningar som ska vara med och så
vidare. Detta finns i filen new_drawinglist.php. När detta är ifyllt och man trycker på
nästa laddas ett större formulär där informationen om de ritningar som ska vara med
hämtas från databasen, om ritningen är inlagd det vill säga.
11
Figur 5: Exempel på hur det kan se ut i steg 2 på skapa ritningsförteckning
Detta genereras av filen drawinglist_info, i detta stadie så kan användaren fylla i mer
information och uppdatera fälten på nytt. Man kan även välja att skapa en ny sida om
det behövs fler fält i ritningslistan. Om man trycker på ny sida så sparas alla rader i
detta formulär ner i databastabellen roundo_tempdrwlistrows. När användaren sedan
är nöjd trycker han på Klar och då lagras all information i databasen.
Huvudinformationen lagras i tabellen roundo_drawinglist och informationen för
respektive rad, även då de som lagrats temporärt, sorteras på ritningsnumret och lagras
i tabellen roundo_drawinglist_row.
5.3.7 Maskin/ritningsförteckningar
Detta är egentligen flera funktioner som kopplas samman i en händelsekedja. Det
första man kan göra är att söka efter ritningsförteckningar utifrån maskintyp, men sen
så kan man även gå in och ändra i ritningsförteckningar och skapa serier och
maskiner.
12
5.3.7.1 Söka ritningsförteckningar
Det första man möts av är ett enkelt formulär där användaren får fylla i maskintypen
man söker efter. När användaren gjort detta visas en lista över alla
ritningsförteckningar för denna maskin, se figur 6.
Figur 6: Exempel på hur sökresultatet kan se ut för sökning av ritningsförteckningar
Här ser användaren också om det finns eventuella ritningsändringar som rör
maskintypen eller en specifik ritning, detta flaggas med en liten varningstriangel.
Användaren har här möjlighet att gå in och se hela ritningsförteckningen, se figur 7,
genom att trycka på ett sidnummer. Om det är så att det är en specifik ritning som har
en ritningsförändring registrerad så ser användaren då vilken det är. Allt detta
genereras av filen machine_drawinglist.php.
Figur 7: Exempel på hur en ritningsförteckning kan se ut
5.3.7.2 Ändra ritningsförteckningar
Denna funktion kommer användaren åt genom att trycka på Ändra inne i en
ritningsförteckning, se figur 8. Om man trycker där så kommer man till sidan för att
skapa ritningsförteckningar, men man har bara möjlighet att ändra informationen och
lägga till ytterligare sidor.
13
5.3.7.3 Skapa serier och maskiner
Denna funktion kommer man till genom att trycka på Skapa serie efter det att man
sökt efter ritningsförteckningar. Man skickas då till en sida där man kan välja vilka
ritningsförteckningar som ska vara med i serien, se figur 8. Detta hanteras av filen
new_serie.php.
Figur 8: Formulär för att välja vilka ritningslistor som ska ingå i serien
Efter det så får man upp en sida där man fyller i serienummer och antal maskiner som
ska finnas i serien, se figur 9. Man får även upp en lista över alla ritningar som ingår i
ritningsförteckningarna så att man har möjlighet att välja bort vissa om de inte ska
ingå i just denna serie.
Figur 9: Formuläret där man kan välja vilka ritningar som ska ingå i en serie
När man sedan trycker på nästa så skapas serien och man får fylla i maskinnummer på
de maskiner man redan nu vill skapa, se figur 10.
14
Figur 10: Formulär för att fylla i maskinnummer i serien
När detta är gjort visas en till lista över alla ritningar som ingår i maskinen, då är
självklart inte de ritningar man eventuellt valde bort med, se figur 11.
Figur 11: Sista tabellen man ser efter att man skapat en maskin
Här har man möjlighet att trycka fram pdf-filen för respektive ritning och skriva ut i
det antal som anges.
15
5.3.8 Ritningsändringar
Detta är en funktion för att användaren ska kunna lägga in önskemål om eventuella
förändringar som behöver göras på ritningar eller maskiner. Det fungerar på så sätt att
användaren får ett formulär, se figur 12, att fylla i ritningsnummer och/eller
maskintyp, meddelande om vad som behöver ändras och vilken prioritet det har.
Figur 12: Formuläret för ritningsändringar
När användaren fyllt i informationen och tryck på registrera så läggs informationen in
i databastabellen roundo_drawingchanges. Detta sköts av filen reg_change.php.
5.3.9 Lista ändringar
Denna funktion gör det möjligt för användaren att söka efter ritningsändringar, lista de
10 som har högst prioritet eller lista alla registrerade ändringar, se figur 13. Detta sköts
av filen drawingchange.php. Det första användaren möts av är ett formulär för
sökning. När sökningen är gjord presenteras resultatet under formuläret.
Figur 13: Formulär och sökresultat för ändringar
Om användaren önskar så kan han trycka på antingen ritningsnumret eller
maskintypen för att få fram mer information om ändringen. I det läget har även man
möjlighet att behandla ändringarna och sätta eventuell åtgärd, se figur 14. Dessa
funktioner sköts av filen edit_drawingchange.php.
16
Figur 14: Exempel på hur det kan se ut när en ritningsändring är åtgärdad.
5.3.10 Hantera användare
Denna funktion är till för att skapa, ändra och ta bort användare. Den hanteras av filen
handle_users.php tillsammans med add_user.php, delete_user.php och edit_user.php.
Användaren möts av ett enkelt formulär, se figur 15, där denne väljer vad han vill göra
och vilken användarnamn det gäller. Beroende på vilken uppgift som ska utföras
anropas de olika filerna. Självklart uppdateras informationen i databastabellen
roundo_drawing.
Figur 15: Formulären för hantering av användare
5.3.11 CSS-filen
Denna fil, roundo.css, är den som styr över i stort sett allt utseende på sidan. Allt ifrån
typsnitt, var de olika fälten ska placeras, hur de olika formulären och tabellerna ska se
ut.
17
6
Resultat
6.1 Databasen
Databasens struktur och funktioner har blivit ungefär som jag hade tänkt mig från
början, dock har vissa förändringar fått tillkomma under tidens gång allt eftersom man
fått förståelse för hur Roundo hanterar orders och ritningar.
Det som man här eventuellt skulle kunna förbättra är att skapa vissa indexeringar
på vissa kolumner och tabeller för att effektivisera frågorna.
6.2 Systemet
Systemet fungerar bra, dock har jag inte fått med alla de funktioner som från början
önskades, så som att kunna söka på maskinförteckningar och att kunna skriva ut hela
maskiner med rätt antal kopior. Men det är enkelt att från sidan göra dessa utskrifter
genom att ta upp pdf-filen. Systemet har under hela arbetets gång testats av både mig
och kunden. Detta har gjorts möjligt genom att det hela tiden legat på internet.
Strukturen för systemet har inte blivit lika modulbaserad som jag tänkt från
början, men fortfarande är det ganska enkelt att lägga till och ta bort funktioner efter
behov.
6.3 Svar på frågeställningar
• Ja, man kan på ett smidigt sätt leta efter ritningar och skriva ut dessa.
• Ja, ritningsändrignar kan fångas upp av systemet och åtgärd kan läggas in.
7
Diskussion
7.1 PHP
Valet av PHP som programmeringsspråk beror på att jag tidigare jobbat en hel del
med det och känner mig hemma med dess syntax och semantik. En ytterligare
anledning är att det är ett språk som är lätt att använda och har många färdiga
komponenter och funktioner som dessutom hela tiden utvecklas. En annan väldigt stor
fördel är att det finns en väldigt bra dokumentation på internet över alla funktioner.
Nackdelar som jag upptäckte under arbetets gång var bland annat att det är svårt
att installera PHP på en server med Windows Server 2003, detta ledde till att jag fick
ägna mer tid än planerat åt att få allt att fungera på Roundos server.
Jag hade även problem (ett känt problem enligt många forum) att få
serversökvägar att fungera som planerat. Detta medförde att Roundo var tvungna att
flytta på mappen för alla ritningar så att den blev ”fysiskt” placerad på samma
hårddisk som själva hemsidan.
7.2 MySQL
Även MySQL valde jag för att jag arbetat med det tidigare och är ett enkelt och
smidigt att komma igång med. Det är även den vanligaste databashanteraren som
används för öppna projekt på internet.
Jag har egentligen inte upptäckt några direkta problem med MySQL i detta
projekt, utan det flöt på utan några direkta komplikationer. Mycket tack vare att det
finns ett enkelt webbgränssnitt, phpMyAdmin, för att skapa och modifiera databaser
och tabeller.
18
7.3 Systemet
Utvecklingen av systemet har fungerat bra, jag har under arbetets gång haft bra
kontakt med företaget där jag fått mycket och bra respons.
Eftersom jag inte kunnat befinna mig på företaget under hela utvecklingen har
jag istället utvecklat systemet mot en hemsida. Tack vare detta har jag haft möjlighet
att jobba oavsett var jag har befunnit mig, så länge jag haft tillgång till internet. Detta
har också medfört att min kontaktperson på företaget kunnat testa funktionerna allt
eftersom de blivit klara och då komma med feedback.
Självklart har man under utvecklingens gång stött på vissa problem, ett av
problemen var att få PHP att fungera i Windows Server 2003. Men efter en del
efterforskningar på internet hittade jag hjälp för att få allt att fungera [7].
En av de största utmaningarna i utvecklingen har varit att sätta sig in i hur
Roundo hanterar sina ritningar, förteckningar och orders. Det har varit mycket
bollande fram och tillbaka för att få all data representerad och lagrad på rätt sätt.
När det gäller systemets struktur så känner jag att det skulle finnas mer att önska.
Nu i efterhand har jag upptäckt att det hade funnits snyggare och förmodligen
effektivare sätt att bygga upp systemet. En önskan hade varit att det skulle varit mer
modulbyggt och på så sätt lättare att implementera fler funktioner i efterhand.
7.4 Framtida utveckling
Under utvecklingens gång har jag upptäckt flera saker som man skulle kunna utveckla
vidare för att få ett ännu mer komplett system:
• Lägga in funktioner för att hantera alla typer av orders.
• Koppla orders till maskinnummer och även kunna skriva ut dessa på önskat
sett.
• Få möjligheten att skriva ut hela maskiner, serier eller orders direkt i de
antal som önskas att fungera.
• Söka bland standardkomponenter, så som muttrar, skruvar och lager, som
Roundo inte själva tillverkar utan beställer.
• Möjlighet att skicka iväg ritningsfiler som epost till kunder och tillverkare
direkt i systemet.
• Möjlighet att skicka e-post till ansvarig konstruktör om man behöver en pdf
på en ritning eller någon ritningsändring.
• Möjlighet att lägga in lagersaldon och koppla ihop systemet med Pyramid
ekonomisystem.
8
Slutsatser
Detta examensarbete har resulterat i ett system som jag anser kan förenkla väldigt
mycket för kunden. Tack vare detta kan de spara mycket tid och arbete genom att de
inte behöver leta i pärmar och lådor efter ritningar och förteckningar. Även att skapa
ritningsförteckningar förenklas tack vare att information kan hämtas från andra
tabeller och således bara behöver skrivas en gång. Systemet uppfyller
kravspecifikationen och kunden har ett system som är redo att användas.
Dessvärre lyckades jag inte att lösa problemet med utskrifter direkt från systemet
utan att man ska behöva öppna pdf filerna. Men detta är något som jag tänker fortsätta
forska i för att förhoppningsvis komma på en bra lösning som kan implementeras i
efterhand.
För att sammanfatta examensarbetet så känner jag att det blivit ett bra resultat,
men att det finns mycket mer man hade kunnat göra, för att förenkla ännu mer för
kunden, om bara tid hade funnits.
19
Referenser
[6] PHP 5 och MySql Handboken, Jörgen Overgaard, Pagina Förlags AB, 2004,
ISBN: 91-636-0801-4
Webbreferenser
[1]
http://sv.wikipedia.org/wiki/PHP
, 2008-05-30
[2]
http://sv.wikipedia.org/wiki/MySQL
, 2008-05-30
[3]
http://sv.wikipedia.org/wiki/Cascading_Style_Sheets
, 2008-05-30
[4]
http://sv.wikipedia.org/wiki/XHTML
, 2008-05-30
[5]
http://www.w3.org/
, 2008-05-30
[7]
http://www.peterguy.com/php/install_IIS6.html
, 2008-05-30
20
Bilaga A: Databasen
Figur A1: Databasens tabeller och relationer
Tabell A1: roundo_drawings
Namn
Datatyp
Beskrivning
drawingID
varchar(10) Ritningsnummer, t.ex. 45911A
CPK
review
char(1)
Revision, t.ex. A
machinetype
varchar(15) Maskintyp, t.ex. R-16-S
designation
varchar(127) Benämning av vad ritningen är, t.ex.
Standardkomponenter
designation2
varchar(127) Benämning 2
observation
varchar(127) Anmärkning
drawed_by
char(3)
Vem som ritat ritningen
date
date
Datum när ritningen är ritad
changes
varchar(127) Eventuella ändringar från tidigare revisioner
replaces
varchar(10) Eventuellt ritningsnummer på ritning som
denna ritning ersätter
replaced_by
varchar(10) Eventuellt ritningsnummer som denna ritning
är ersatt av
assy
char(1)
T om det är en sammansättning av flera
ritningar, annars F
Huvudtabell för att lagra information om ritningarna.
Tabell A2: roundo_drawinglist
Namn
Datatyp
Beskrivning
PK drawinglistID
int(10)
Ett unikt nummer som skapas för respektive
ritningslista
review
char(1)
Revision
page
int(11)
Sidnummer
machinetype
varchar(15) Maskintyp
info
varchar(127) Information om vilken del av en maskin som
ritningslistan beskriver
date
date
Datum då ritningslistan skapades
Tabell innehållande huvudinformationen om en ritningslista.
Tabell A3: roundo_drawinglist_row
21
PK drawinglist_rowID int(11)
Ett unikt nummer som skapas för respektive
ritningslistrad
FK drawingID
varchar(10) Ritningsnummer, koppas till tabellen
roundo_drawings
pos
varchar(5)
Position på ritningen
FK drawinglistID
int(11)
Ritningslistid, kopplas till tabellen
roundo_drawinglist
stm
char(3)
Antal eller längd
observation
varchar(127) Anmärkning
Tabell som representerar varje rad som en ritningslista innehåller.
Tabell A4: roundo_temp_drwlistrows
Namn
Datatyp
Beskrivning
PK id
int(11)
Unikt nummer som skapas för varje rad
drwID
varchar(10) Ritningsnummer
pos
varchar(5)
Position
stm
char(3)
Antal eller längd
observation
varchar(127) Anmärkning
Tabell som temporärt lagrar bara temporärt innan informationen lagras i
roundo_drawinglist_row.
Tabell A5: roundo_series
Namn
Datatyp
Beskrivning
series
varchar(4)
Serienummer
quantity
int(2)
Antal maskiner som kan ingå i serien
CPK
number
int(2)
Löpnummer
Tabell som lagrar alla serier, skapas en rad för varje löpnummer.
Tabell A6: roundo_machine
Namn
Datatyp
Beskrivning
PK machineID
varchar(6)
Unikt maskinnummer som identifierar en
specifik maskin
FK series
varchar(4)
Serienummer, kopplas till tabellen
roundo_series
FK quantity
int(2)
Antal maskiner som finns i ovannämnda serie,
kopplas till tabellen roundo_series
FK number
int(2)
Löpnummer, kopplas till tabellen roundo_series
Tabell som lagrar maskinnummer och vilken serie maskinen hör till.
22
Tabell A7: roundo_machinelist
Namn
Datatyp
Beskrivning
drawinglist_rowID int(10)
Ritningslistradsnummer, både primärnyckel
och främmande nyckel, kopplas till tabellen
roundo_drawinglist_row
series
varchar(4)
Serienummer, både primärnyckel och
främmande nyckel, kopplas till tabellen
roundo_series
CPK,
FK
number
int(2)
Löpnummer, både primärnyckel och
främmande nyckel, kopplas till tabellen
roundo_series
Tabell som lagrar information om vilka ritningar som ingår i en viss maskin eller serie.
Tabell A8: roundo_drawingchanges
Namn
Typ
Beskrivning
PK drawingchangesID int(10)
Unikt nummer som skapas för varje
ritningsändring
FK drawingID
varchar(15)
Ritningsnummer, kopplas till tabellen
roundo_drawings
FK machinetype
varchar(15)
Maskintyp, kopplas till tabellen
roundo_drawinglist
message
varchar(255) Meddelande från personen som lagt till
ritningsändringen
prio
char(1)
Vilken prioritet ändringen har, 1 högst
sender
varchar(50)
Avsändare
messagedate
date
Datum när ändringen skapades
measure
varchar(255) Åtgärd
attended_by
varchar(50)
Vem som åtgärdat
attended_date
date
Datum för åtgärd
measured
char(1)
T om det är åtgärdad, annars F
Tabell med all nödvändig information om de ritningsändringar som ska göras eller har gjorts.
Tabell A9: roundo_users
Namn
Datatyp
Beskrivning
PK userID
int(10)
Unikt nummer för alla användare
username
varchar(15) Användarnamn
name
varchar(50) För och efternamn
auth
char(1)
Vilken behörighet användaren har
23
Tabell A10: roundo_menus
Namn
Datatyp
Beskrivning
PK menu_ID
mediumint(9) Unikt nummer som skapas för varje
menyelement
menu_title
varchar(100) Titel, den text som ska synas som länk
menu_description text
Beskrivning, den text som syns när man håller
över länken
menu_status
char(1)
Status, anger om menyelementet skall vara
aktivt eller inte
menu_URL
varchar(255) URL, sökväg, adress dit länken ska leda
menu_order
mediumint(9) Ordning, anger i vilken ordning
menyelementen skall visas
menu_auth
char(1)
Behörighet, anger vilken behörighet som krävs
av användaren för att menyelementet skall
vara synligt
24
Bilaga B: Källkod
Källkoden kan fås digitalt på begäran via e-post. All PHP-kod är har röd text och alla
kommentarer har grön text.
index.php
<?php
/**
* index.php *
* Generates the mainpage for the system *
* @author Emil Abrahamsson <emil@gavle.to> */ /* Starts buffering */ ob_start(); /* Starts session */ session_start(); /* Includes dbfunc.php */ include('dbfunc/dbfunc.php'); /* Starts databaseconnection */ $dbh=startDBConnection(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="css/roundo.css" rel="stylesheet" type="text/css" /> <title>ROUNDO</title> </head> <body> <div class="container"> <div class="header"> <table width="100%"> <tr> <td><a href="http://intranet/">INTRANÄT</a></td> <td><a href="http://www.roundo.com/">INTERNET</a></td> <td><a href="index.php">RITNINGSARKIV</a></td> </tr> </table> </div> <div class="left"> <?php echo(generateMenu($dbh)); ?> </div> <div class="content"> <?php if($_SESSION['online'] || isset($_REQUEST['page'])){ if(isset($_REQUEST['page'])) require_once('pages/'.$_REQUEST['page'].'.php'); else require_once('pages/inside.php'); }else require_once('pages/start.php'); ?> </div> <div class="footer"> <table width="100%"> <tr>
<td>Sidan är skapad av: Emil Abrahamsson</td> </tr> </table> </div> </div> </body> </html>
25
dbfunc.php
<?php /** * dbfunc.php ** Contains some function comunication with the database *
* @author Emil Abrahamsson <emil@gavle.to> */
/* Includes the settings */
include("settings.php");
/**
* startDBConnection() *
* Connects to the database with the settings gotten from settings.php *
* @return pointer to the database */
function startDBConnection() {
$dbh = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
@mysql_select_db(DB_NAME, $dbh) or die("Could not connect to database"); return $dbh;
}
/**
* stopDBConnection($dbh) *
* Stops the databaseconnection that comes as parameter *
* @param $dbh pointer to the database */ function stopDBConnection($dbh) { @mysql_close($dbh); } /** * generateMenu($dbh) *
* Genterates the HTML code needed to show the menu. * All information is retrieved from the database. *
* @param $dbh pointer to the database
* @return String the HTML code needed to show the menu */
function generateMenu($dbh){ $buffer='';
if(!isset($_SESSION['online'])){
$sql='SELECT * FROM '.TABLE_PREFIX.'menus WHERE menu_status="A" AND menu_auth>=4 ORDER BY menu_order'; $result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result, MYSQL_ASSOC)){ $buffer.=' <div class="menu">
<a href="'.$row["menu_URL"].' "title="'.$row['menu_description'].'" class="menu">'.$row["menu_title"].'</a>
</div> '; } }else{
$buffer.='<div class="menu"><b>Query failed</b></div>'; }
}else{
$sql='SELECT * FROM '.TABLE_PREFIX.'menus WHERE menu_status="A" AND menu_auth>='.$_SESSION['auth'].' ORDER BY menu_order';
$result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result, MYSQL_ASSOC)){
26
$buffer.=' <div class="menu"><a href="'.$row["menu_URL"].'"title="'.$row['menu_description'].'"class="menu">'.$row["menu_title "].'</a></div> '; } }else{$buffer.='<div class="menu"><b>Query failed</b></div>'; } } return $buffer; } ?>
settings.php
<?php /** * settings.php ** Contains some settings for the system *
* @author Emil Abrahamsson <emil@gavle.to> */ /* Database username */ define("DB_USER", "root"); /* Database password */ define("DB_PASSWORD", "Emil"); /* Database host */ define("DB_HOST", "localhost"); /* Database name */ define("DB_NAME", "ritningsarkiv");
/* Prefix for all tables in database */
define("TABLE_PREFIX", "roundo_");
/* Path to all drawings */
define("DRW_PATH","/draings/pdf/"); ?>
roundo.css
@charset "utf-8"; A:link{ color: #b22e1e; font-weight: bold; text-decoration: none; } A:active{ color: #b22e1e; font-weight: bold; text-decoration: none; } A:visited { color: #b22e1e; font-weight: bold; text-decoration: none; } A:hover { color: #999999; font-weight: bold; text-decoration: none; }27
div.container{ background-image: url(/images/background.jpg); background-repeat:no-repeat; margin:0px auto; width:920px; height:670px; line-height:150%; } div.header{ font-family:Verdana, sans-serif; font-size:18px; text-align:left; line-height:35px; position:absolute; float:left; width:680px; height:50px; margin-left:10px; padding:1em; } div.left{ position:absolute; text-align:center; width:88px; height:265px; margin-left:10px; margin-top:156px; padding:1em; } div.content{ position:absolute; margin-left:150px; margin-top:156px; width:710px; height:425px; padding:1em; float:left; overflow:scroll; } div.footer{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:9px; color:#666666; position:absolute; margin-top:615px; margin-left:10px; width:900px; top: 34px; float:left; } .menu{
font-family: Verdana, sans-serif; font-size: 10px; text-align:center; color: #000000; line-height: 12px; padding-bottom:0.5em; padding-top:0.5em; } label{ margin-right: 0.5em; display: block; }
input, select, textarea{ color: #781351;
background: #fee3ad; border: 1px solid #781351;
font-family: Verdana, sans-serif; font-size:10px; } fieldset{ border: 1px solid #781351; width:480px; }
28
fieldset.signin{ border: 1px solid #783151; width: 260px; height:80px; } legend{ color: #b22e1e; font-weight:700; background: #fec337; border: 1px solid #781351; padding: 2px 6px; } .text{font-family: Verdana, sans-serif; font-size: 10px; text-align:justify; color: #000000; line-height: 20px; } .error{
font-family: Verdana, sans-serif; font-size: 12px; font-weight:800; text-align:justify; color:#FF0000; line-height: 20px; } table.result{ font-family:Verdana, sans-serif; font-size:10px; text-align:center; color:#000000; line-height:15px; width:710px; table-layout:auto; border-collapse:collapse; } table.drwlist{ font-family:Verdana, sans-serif; font-size:10px; text-align:center; color:#000000; line-height:15px; table-layout:auto; border-collapse:collapse; } table.drawingchange{ font-family:Verdana, sans-serif; font-size:10px; text-align:left; color:#000000; background-color:#FFFFFF; line-height:18px; table-layout:auto; border-collapse:collapse; text-indent:3px; } .machinetype{ font-family:Verdana, sans-serif; font-size:16px; font-weight:bold; color:#000000; line-height:20px; } .info{ font-family:Verdana, sans-serif; font-size:14px; color:#000000; line-height:20px; }
29
add_drawing.php
<?php /** * add_drawing.php ** Generates a form where the user can fill in information about a drawing. * When the user presses "Lägg till" the drawinginformation will be inserted * into the databasetable drawings.
*
* @author Emil Abrahamsson <emil@gavle.to> */ $drawingID=ereg_replace("[^A-Za-z0-9]", "", $_REQUEST['drawingID']); if($_REQUEST['new_review']){ if($drawingID!=''){ require_once('pages/new_review.php'); return; }else{
echo('<div class="error">Du har inte angivit något ritningsnummer!</div><br />'); }
}
if($_REQUEST['save']){
if($_REQUEST['drawingID']!='' && $_REQUEST['review']!=''){
$sql = 'INSERT INTO '.TABLE_PREFIX.'drawings (drawingID, review, machinetype,
designation, designation2, observation, drawed_by, date, replaces, replaced_by, assy) VALUES ("'.$drawingID.'", "'.$_REQUEST['review'].'", "'.$_REQUEST['machinetype'].'",
"'.$_REQUEST['designation'].'", "'.$_REQUEST['designation2'].'",
"'.$_REQUEST['observation'].'", "'.$_REQUEST['drawed_by'].'", "'.$_REQUEST['date'].'", "'.$_REQUEST['replaces'].'", "'.$_REQUEST['replaced_by'].'", "'.$_REQUEST['assy'].'")'; $result=@mysql_query($sql,$dbh);
if($result){
echo('<div class="text">Insättningen lyckades!</div>'); return;
}else{
echo('<div class="error">Insättningen misslyckades!</div><br />');
} }else{
echo('<div class="error">Du har inte angivit både ritningsnummer och revision!</div>');
} } ?>
<div class="text">
<form id="add_drawing" name="add_drawing" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="add_drawing" />
<fieldset style="height:210px;width:510px;"> <legend>Lägg till ritning</legend> <table width="470">
<tr>
<td><label for="drawingID">Ritningsnummer:</label></td>
<td width="91"><input type="text" name="drawingID" id="drawingID" size="10" value="<?php echo($drawingID); ?>" /></td>
<td width="67" align="right"><label for="review">Revision:</label></td>
<td width="98"><input type="text" name="review" id="review" size="2" value="<?php if($_REQUEST['review']) echo($_REQUEST['review']); else echo('A'); ?>" /></td>
<td width="90" align="right"><label for="machinetype">Maskintyp:</label></td> <td width="122" align="right"><input type="text" name="machinetype" id="machinetype" size="15" value="<?php echo($_REQUEST['machinetype']); ?>" /></td>
</tr> <tr>
<td width="109"><label for="designation">Benämning:</label></td>
<td colspan="5"><input type="text" name="designation" id="designation" size="60" value="<?php echo($_REQUEST['designation']); ?>" /></td>
</tr> <tr>
<td width="109"><label for="designation2">Benämning 2:</label></td>
<td colspan="5"><input type="text" name="designation2" id="designation2" size="60" value="<?php echo($_REQUEST['designation2']); ?>" /></td>
</tr> <tr>
30
<td colspan="5"><input type="text" name="observation" id="observation" size="60" value="<?php echo($_REQUEST['observation']); ?>" /></td>
</tr> <tr>
<td width="109"><label for="drawed_by">Ritad av:</label></td>
<td><input type="text" name="drawed_by" id="drawed_by" size="3" value="<?php echo($_REQUEST['drawed_by']); ?>" /></td>
<td align="right"><label for="date">Datum:</label></td>
<td><input type="text" name="date" id="date" size="12" value="<?php if($_REQUEST['date']) echo($_REQUEST['date']); else echo(date('Y-m-d')); ?>" /></td>
<td align="right"><label for="replaces">Ersätter:</label></td>
<td><input type="text" name="replaces" id="replaces" size="15" value="<?php echo($_REQUEST['replaces']); ?>" /></td>
</tr> <tr>
<td><label for="assy">Sammanställning:</label></td> <td>
<select name="assy" id="assy">
<option value="T">Ja</option> <option value="F" selected="selected">Nej</option> </select>
</td>
<td> </td> <td> </td>
<td align="right"><label for="replaced_by">Ersatt av:</label></td>
<td><input type="text" name="replaced_by" id="replaced_by" size="15" value="<?php echo($_REQUEST['replaced_by']); ?>" /></td> </tr> <tr> <td> </td> <td> </td> <td> </td>
<td><input type="submit" name="new_review" id="new_review" value="Ny revision" /></td> <td> </td>
<td align="right"><input type="submit" name="save" id="save" value="Lägg till" /></td> </tr> </table> </fieldset> </form> </div>
add_user.php
<?php /** * add_user.php ** Generates a form where the administrator can fill in information about a new user. * When "Spara" is pressed, the information will be inserted into the databasetable users. *
* @author Emil Abrahamsson <emil@gavle.to> */
if($_REQUEST['save']){ $ok=1;
$sql='SELECT username FROM '.TABLE_PREFIX.'users'; $result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result,MYSQL_ASSOC)){ if($row['username']==$_REQUEST['username']) $ok=0; } } if($ok){
$sql='INSERT INTO roundo_users (username,name,auth) VALUES
("'.$_REQUEST['username'].'","'.$_REQUEST['name'].'",'.$_REQUEST['auth'].')';
$result=@mysql_query($sql,$dbh); if($result){
echo('<div class="text">Insättningen lyckades</div>'); return;
}else{
echo('<div class="text">Insättningen misslyckades</div>'); return;
31
}else
echo('<div class="text">Användarnamnet används redan!</div><br />');
} ?>
<div class="text">
<form id="add_user" name="add_user" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="add_user" />
<fieldset style="height:60px; width:640px;"> <legend>Fyll i informationen</legend> <table width="350">
<tr>
<td><label for="username">Användarnamn:</label></td>
<td><input type="text" name="username" id="username" size="15" value="<?php echo($_REQUEST['username']) ?>" /></td>
<td><label for="name">Namn:</label></td>
<td><input type="text" name="name" id="name" size="50" /></td> <td>
<select name="auth" id="auth">
<option value="1">Admin</option> <option value="2">Kostr</option> <option value="3" selected="selected">Övriga</option> </select>
</td>
<td><input type="submit" name="save" id="save" value="Spara" /></td> </tr> </table> </fieldset> </form> </div>
create_drawing.php
<?php /** * create_drawing.php ** Genereates the form where the user selects what size/type of drawing * to create. When "Nästa" is pressed the file new_drawing will be launched. *
* @author Emil Abrahamsson <emil@gavle.to> */
?>
<div class="text">
<form name="create_drawing" id="create_drawing" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="new_drawing" />
<fieldset style="width:200px">
<legend>Välj typ storlek:</legend> <table>
<tr>
<td><input type="radio" name="type" id="type" value="1" /></td> <td><label for="1">1</label></td>
<td><input type="radio" name="type" id="type" value="2" /></td> <td><label for="2">2</label></td>
<td><input type="radio" name="type" id="type" value="3" /></td> <td><label for="3">3</label></td>
<td><input type="radio" name="type" id="type" value="4" /></td> <td><label for="4">4</label></td>
</tr> <tr>
<td><input type="radio" name="type" id="type" value="I1" /></td> <td><label for="I1">I-1</label></td>
<td><input type="radio" name="type" id="type" value="I2" /></td> <td><label for="I2">I-2</label></td>
<td><input type="radio" name="type" id="type" value="I3" /></td> <td><label for="I3">I-3</label></td>
<td><input type="radio" name="type" id="type" value="I4" /></td> <td><label for="I4">I-4</label></td>
</tr> <tr>
<td><input type="radio" name="type" id="type" value="SK" /></td> <td><label for="SK">SK</label></td>
</tr>