Programozás | PHP » Csanády Miklós - Iskolai portál Linux alapon

Alapadatok

Év, oldalszám:2002, 157 oldal

Nyelv:magyar

Letöltések száma:419

Feltöltve:2007. október 17.

Méret:637 KB

Intézmény:
-

Megjegyzés:

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!


Tartalmi kivonat

/ Iskolai portál Linux alapon Csanády Miklós Témavezet : Abonyi Tóth Andor 2002. május -1- / Tartalomjegyzék 1. Bevezetés 5 2. El zmények 6 3. A portál 7 3.1 Az eszközök megválasztása 7 3.2 Biztonsági megfontolások 7 3.21 Felhasználói csoportok 7 3.22 Adatvédelmi szempontok 8 3.3 „Szolgáltatások” 9 3.31 Gépterem használata 9 3.32 Szül - diák - iskola kommunikációja 15 3.4 A központi adatbázis 16 3.41 Az adatbázis felépítése 16 3.42 Felhasználói felületek az adatbázishoz 24 3.5 Kommunikációs eszközök 26 3.51 Levelezési listák integrálása 26 3.52 Web felület 27 3.53 MS-Access felület 30 3.54 SMS értesítés 30 4. A kísérlet tanulságai 32 4.1 Motiváció 32 4.11 Tanárok 32 4.12 Diákság 32 4.13 Szül k 32 4.2 A gyakorlat 32 4.3 Továbblépési pontok 33 4.31 Félévi jegyek 33 4.32 Év végi statisztika 33 4.33 Nyilvánosságra hozatal id pontja 33 4.34 Frissülés ideje 33 4.35 Nyílt

forráskód 33 5. Bibliográfia 36 6. Az adatbázis program-részletei 37 6.1 Az adatbázis szerkezetét megadó kódok37 6.11 alaptablaksql 37 6.12 ember adatokplsql 40 6.13 adminplsql 40 6.14 csoport tagokplsql 42 6.15 foglalasplsql 46 6.16 iskolaeveksql 53 6.17 jegyekplsql 53 6.18 jelszavaksql 55 6.19 jogalapplsql 56 6.110 jogoksql 57 6.111 kreditplsql 59 6.112 naptarsql 60 -2- / 6.113 orarendplsql 60 6.114 pamplsql 61 6.115 regisql 62 6.116 ropcsikplsql 62 6.117 sequenceslst 68 6.118 emberek mod id seqsympasql68 6.119 tanitasplsql 69 6.120 urlssql 71 6.2 Az adatbázis felületét adó kódok71 6.21 adminphp 71 6.22 adminokphp 71 6.23 alapphp 73 6.24 arazphp 80 6.25 authphp 82 6.26 belepphp 82 6.27 chpassphp 83 6.28 cimlapphp 85 6.29 confirmphp 85 6.210 csoport tagokphp 93 6.211 csoportokphp 95 6.212 csoportositasokphp 98 6.213 dataeditphp 99 6.214 docphp 105 6.215 ertesitphp 107 6.216 fphp 108 6.217 foglalkiirphp 108 6.218 gep listaphp 114 6.219 gep valasztphp 114 6.220

headersphp 119 6.221 hirdetphp 119 6.222 hirdetotablaphp 120 6.223 ido valasztphp 121 6.224 indexphp 123 6.225 isknaptarphp 123 6.226 jegyadasphp 127 6.227 jegyadas2php 129 6.228 jegyadas3php 129 6.229 jegyekphp 132 6.230 jegygrafphp 136 6.231 kisarcphp 138 6.232 kitiltphp 138 6.233 loginphp 140 6.234 login functionphp 142 6.235 menuphp 143 6.236 naptarphp 144 6.237 nincsphp 146 6.238 orarendphp 146 -3- / 6.239 osztalyjegyphp 148 6.240 osztalyokphp 151 6.241 osztalyzoivphp 152 6.242 privacyphp 154 6.243 registerphp 155 6.244 sqlshellphp 163 6.245 ujuserphp 164 6.246 user foglalasokphp 164 -4- Bevezetés / Bevezetés 1. 1. Bevezetés Ha az ember informatikusként elkezd gimnáziumban tanítani, hamar megütközik azon, hogy a szükségszer en konzervatív közoktatás milyen lassan válik képessé az új informatikai eszköztár használatára. Bizonyára nem csak az én iskolámban kell kézírással vezetni az osztály haladási naplóját, az osztályzónaplót. A szül

kkel való kommunikáció egyetlen hivatalos csatornája a szintén kézzel kitöltend ellen rz könyv, és bizony az új kommunikációs csatornák csak mint az oktatás tárgya szerepelnek az iskola életében. Pedig az új eszközök már rendelkezésre állnak. Az iskolák állandó internet-hozzáféréssel rendelkeznek, és a szül k (vagy legalábbis a diákok) nagy része is rendelkezik otthoni internet-eléréssel. Minden adott tehát, hogy a diák-iskola-szül nevelési háromszöget szorosabbra vonjuk a diákok tanulmányi, emberi fejl dése érdekében. A kommunikáció segítése lehet csak a célunk, és ez nem csodaszer. Ha a diák családi háttere sérült, ha az iskolai nevelés színvonala alacsony, ha a diák ellenségének tekinti az iskolát, akkor hiába er sítjük a kommunikáció lehet ségét megoldást itt nem adhatunk. Az általam javasolt és megépített ,,portál arra a felismerésre épül, hogy az iskolán belüli, illetve az iskola és

szül közötti kommunikáció nagyban segíthet a ma rendelkezésre álló eszközökkel. Sok felesleges munkát és sok hibalehet séget spórolhatunk ezzel meg az oktatói és nevel i folyamat részvev i számára. -5- El zmények / El zmények 2.  2. El zmények Ma Magyarországon az iskolai adminisztráció ugyanolyan technológiával történik, mint akár száz évvel ezel tt. Az informatika szerepvállalása az iskolák hálózatba kötésével kezd dött és ma már biztató kezdeményezések vannak. Ezek sorába tartozik az un verseny2000 verseny Mivel ez a verseny éppen olyan portál kialakítását t zte ki célul, amelyen már régen dolgoztam, beneveztem néhány diákommal. A versenyt azonban sajnálatos módon egy szoftvercég dominanciája jellemezte, így a díjak egynem sége csökkentette a diákjaink lelkesedését. A határid k rövidsége volt az a másik tényez , amelynek hatására az általam vezetett lelkes csapat feladta a versenyen

való részvételt és néhányuk „hobbiként” segítette a saját portál kialakítását. A jelen munkában tárgyalt „Portál” kialakításában  k voltak segítségeim Hasonló rendszernek t nik a „PharaOS school network”1 nev kezdeményezés, de a projekt honlapját sok órás keresés után sem tudtam megtalálni. Csak néhány elektronikus levelezési címet tesznek közzé. A rendszeren megtalálhatóak diákok honlapjai, az iskolai órarend, a tanárok névsora és általában egy mutató az iskola honlapjára. Több iskolában fel van téve, de kevés helyen van adattal feltöltve. M köd órarendet nem találtam 1 Egy ilyen honlap: http://server.reformatus-pecssulinethu/SNET/ -6- A portál / A portál 3. 3. A portál 3.1 Az eszközök megválasztása Els dleges szempont volt a nyílt forráskódú1 rendszerekre alapozottság. Második szempont a fejleszthet ség. A nyílt forráskód mellett els sorban nevelési megfontolásból döntöttem Ha a

diákok olyan programokkal találkoznak, amelyek ingyenesek, akkor elvárható, hogy otthon is vagy az iskola befejeztével a saját életük során is használják ezeket. Másrészt azon diákok esetében, akik indíttatást éreznek a programozás iránt, számtalan forráskódban is elérhet programmal vannak körülvéve, amelyeken közvetlenül is tanulmányozhatják a csoportos fejlesztés technikáit. Ezeket az elveket nem csak itt a portál megvalósításánál, de az irodai program-kezelés tanításánál is igyekszem érvényesíteni. A rendszer központi magja egy postgresql2 nev adatbáziskezel program. Rendelkezésre állt volna még a jóval elterjedtebb mysql3, de ez számtalan olyan képességet nélkülözött a döntés pillanatában, amelyek a jelen feladatban nélkülözhetetlenek (például tranzakció-kezelés). A web felületet PHP4 nyelven írtam. Szóba jöhetett volna még a perl5 nyelv, de a PHP fejlettebb eszközökkel rendelkezik, és az

adatbázis-kezel függvényei hatékonyabbak. 3.2 Biztonsági megfontolások 3.21 Felhasználói csoportok A felhasználók alapvet en két körre osztható: hacker6 diákok és lamer7 tanárok. Ebb l következik, hogy a rendszeren kétféle biztonsági kategória van: diákok által használt részek valamint a csak tanárok által használt eszközök. Ugyanakkor a fejleszthet ség és költséghatékonyság érdekében vékony-kliens rendszert honosítottunk meg az iskolában A diákmunkaállomások mind egy központi szerverre kapcsolódnak, és az er forrás-igényes programok (pl. office) a szerveren futnak 1 Lásd a GNU projekt: [GNU] 2 http://www.postgresqlorg[postgresql] 3 Lásd a mySQL projekt [mysql] 4 Lásd a PHP projekt [PHP intro] 5 Lásd a perl nyelv honlapja [perl] 6 A hacker szó itt barátságos értelemben szerepel: 1. valaki, aki egy programozható rendszerek felfedezését élvezi, és próbálgatja a saját lehet ségeinek kiterjesztését szemben azzal,

aki csak a minimumot akarja megtanulni.2 valaki, aki lelkesen programozik, és nem csak filozofál a programozásról [jargonfile] 7 lamer: Egy olyan felhasználó, aki ostobán vagy ügyetlenül viselkedik. Gyakran alkalmazzák kezd kre [netlingo] -7- A portál / Biztonsági megfontolások 3.21 A központi adatbázist külön szerveren telepítettem. Erre csak a tanároknak és az irodai munkatársaknak van belépési joguk. Ezen a gépen fut a web-portál és a levelez lista-kezel  program. A diák-szerver, s t minden diák-munkaállomás el tudja érni az adatbázist Erre a belépési azonosítás miatt van szükség.(ld:3311) A postgresql szerver portja forwardolva van ezekre a gépekre az stunnel1 program segítségével. Így ezek a programok úgy érzékelik, mintha a saját gépükön lenne az adatbázis-kezel szerver. A web-felületet csak ssl titkosítással lehet elérni, hogy a web  rlappon kitöltött belépési jelszavak ne legyenek lehallgathatóak. 3.22

Adatvédelmi szempontok Az adatvédelem elve az információs önrendelkezés joga. Mindenkinek joga van tudni, hogy az egyes fórumokon megadott adatait milyen célra adja meg, és ezeket más célra nem is szabad felhasználni. Mi a felhasználók felvételénél tájékoztatjuk a szül ket ill diákokat arról, 1. ábra a minden lap alján hivatkozott adatvédelmi nyilatkozat 1 stunnel: hálózati titkosított port-átirányító program ld.: [stunnel] -8- A portál / Biztonsági megfontolások 3.22 hogy az iskolai kommunikáció céljára adta meg az adatait, és azt másnak nem adjuk ki, másra nem használjuk fel. Hogy kinek milyen jogot adunk, azt a 1 ábra mutatja 3.3 „Szolgáltatások” 3.31 Gépterem használata 3.311 Géptermi gépek belépési azonosítása A gimnáziumi gépteremben lev gépeken csak azonosítás után lehet dolgozni. Ez az azonosító megegyezik a portálon regisztrált azonosítóval és ugyanazzal a jelszóval lehet belépni. A jelszó

megváltoztatása csak a web-felületen keresztül történhet. A belépésre csak az jogosult, akik tagja valamelyik osztálynak, nincs letiltva a belépése. A kitiltott diákok akkor mégis beléphetnek, ha éppen most órájuk van a teremben. -9- A portál / „Szolgáltatások” 3.312 3.312 Internet-használat szabályozása Mivel az iskola védett környezet, fel kell vállalnia az internet-használat során felmerül etikai 2. ábra ezt az oldalt látják a diákok, ha blokkolt oldalra tévednek kérdések kezelését. El kell dönteni, hogy az internet-használatot milyen célból ajánlja fel a diákoknak, majd megfelel eszközökkel el kell érni ezen kit zött célt. A mi iskolánk szerint az internetet ,,hasznosan kell használni, vagyis a szórakoztatást nem tudjuk felvállalni. Hogy ezen cél minél inkább megvalósuljon a portál speciálisan internet-forgalom elemzésre is fel van készítve. Az internet használat alapelveit a mellékelt képerny képen

olvashatjuk (2. ábra) Ezt akkor látják diákjaink, ha valamely blokkolt oldalt próbálják letölteni. Ezek alapján az internettartalom három kategóriába sorolható: 1. Támogatott oldalak Ezek az olyan általunk „hasznosnak” min sített helyek, mint szótárak, programozási kézikönyvek, menetrendek, SMS-küld oldalak, program-javítások letöltése stb. Ezen oldalak használatát link-gy jteményekkel támogatjuk - 10 - A portál / „Szolgáltatások” 3.312 2. Szórakoztató oldalak: Ebbe a kategóriába az olyan „ártatlan” oldalak kerülnek, amelyek pusztán szórakoztatnak. Ide sorolódnak az online játékok is Ezek a helyek nem önmagukban rosszak, de egy-egy ilyen oldal népszer sége gyorsan túlterheli az iskola géptermének kapacitását. Ebbe a kategóriába tartoznak a már említett játékok mellett a zene-fájlokat tartalmazó oldalak, a TV-sorozatok honlapjai, a chat-oldalak stb. Ezeket az oldalakat esetenként blokkoljuk. Ehhez a

jesred1 squid2 redirector3 programot használom. 3. Tiltott oldalak: Ebbe a kategóriába azok az oldalak tartoznak amelyek „az iskola szellemiségével össze nem egyeztethet ” tartalommal bírnak. Ha valaki ilyen oldalra téved, akkor öt percenként figyelmeztet levelet kap. A nap végén a szerver készít nekem egy jelentést az ilyen értelemben gyanús hálózati tevékenységr l. Ebben diákonkénti csoportosításban azon belül id rendben szerepel a letölt diák azonosítója, a letöltött 3. ábra Az éppen érvényben lev kitiltások listája. A neveket és azonosítókat a képen elmaszatoltam. (és gyanúsnak talált) oldal címe, a letöltés id pontja és a gép neve. 3.313 Gépid foglalás Az iskola emberi er forrásai végesek. Sajnos egy iskola sem tudja felvállalni, hogy kell tanári felügyelet mellett korlátlan mennyiség számítógépen biztosít lehet séget a diákok egyéni kibontakoztatására. Ezért a meglev er forrásokat be

kell osztani. A konkrét hasznosság mellett pozitív nevelési hatása van annak, hogy a diákoknak el re érdemes megterveznie a gépteremben töltött idejüket. 1 http://ivs.csuni-magdeburgde/~elkner/webtools/jesred/[jesred] 2 A squid egy proxy program [squid] 3 redirector: A squid proxy-hoz illeszked modul, amely a kért oldal helyett egy másikat tölt le. ld: [squid FAQ] - 11 - A portál / „Szolgáltatások” 3.313 4. ábra a gépfoglalás beállítása A délutáni nyitvatartás idejére a diákok gépet jegyezhetnek el maguknak korlátozott id re. Ha a teremben szakkör van az adott, lefoglalni kívánt id ben, akkor csak a szakkör tagjai tudnak gépet foglalni. Az aktuális nap foglalási beosztása több helyen is megjelenik. Egyrészt a gépterem bejárata feletti monitoron látszik1: (ld.: foglalkiirphp 6217) Itt az els sorban az éppen kitiltott azonosítók is olvashatóak. 1 A monitoron való megjelentetéshez az autologin[autologin]

segítségével rácsatlakozok egy VNC[vnc] felületre, amelyen egy opera[opera] böngész fut teljes képerny s üzemmódban automatikus frissítéssel. - 12 - A portál / „Szolgáltatások” 3.313 5. ábra az ajtó feletti monitor a foglalási naplóval Másrészt a bejelentkezéskor ez van a képerny hátterében (ld.: 6 ábra) 6. ábra a foglalási napló, ahogy a belépési ablak hátterében látszik Ebb l az ábrából kett van egymás alatt, hogy a bejelentkezési nevet kér dialógus-ablak el ne takarja. (Ennek a php-kódnak a forrását kihagytam a mellékletb l, mivel szinte - 13 - A portál / „Szolgáltatások” 3.313 megegyezik a foglalkiir.php 6217 forrásával) A képet öt percenként tölti le egy lynx1 böngész a munkaállomások által használt fájlrendszerre. A pár percenként futó script: cd /tftpboot for i in 1.1* do echo $i lynx -source 193.22419366/db/fphp?ip=$i > /tftpboot/$i/etc/logojpeg done lynx -source

193.22419366/db/foglalhatterphp > /usr/client/usr/share/pixmaps/hatterjpeg Végül a gépterem nyitása el tt 10 perccel automatikusan kijön a „foglalási térkép” a tanári asztalon lev nyomtatóból az alábbi formában (7. ábra): 7. ábra a kinyomtatott formátuma a foglalási naplónak Ez alapján a felügyel tanár könnyen érvényre juttathatja a foglalásokat. 1 A lynx egy karakteres böngész . ld:[lynx] - 14 - A portál / „Szolgáltatások” 3.32 3.32 Szül - diák - iskola kommunikációja 3.321 Jegy-adatbázis Minden tanár minden általa tanított diáknak jegyeket tud beírni az adatbázisba. Ennek kétféle módja van: 1. Egyedi jegyadás: Dolgozat vagy felelés után a nap végén a tanár egyesével megadhatja az aznapi jegyeket. Ennek az az el nye, hogy az új jegyr l azonnal értesít levelet küld a rendszer a diáknak és a regisztrált szül knek. Hátránya a kett s könyvelés: valami papírról kell a jegyeket beadni, ha az adatbázist

nem tekintjük teljesen biztonságosnak. 2. Tömeges jegyfeltöltés: Ebben az esetben a tanár saját gépén valamely táblázat-kezel programmal tartja nyílván az általa adott osztályzatokat. Ez az els dleges nyilvántartás. Ezt tantárgyanként és osztályonként egyben is fel lehet tölteni, az adatbázisban lev adatok egyidej törlésével. Ennek az az el nye, hogy az adatbázis sérülése 8. ábra tanár jegyet ad egy diáknak vagy meghamisítása esetén sem vész el jegy-adat, hiszen azokat másutt tartja nyílván a tanár. Hátránya, hogy itt is plusz adminisztrációs terhet jelent az id nkénti feltöltés és az új jegyek kiértesítése nem megoldott. A mellékelt 8. ábrán látszik, hogy az adott tanuló eddigi jegyeib l kis grafikon látszik az illet neve mellett, az ebben a félévben elért súlyozott átlaga feltüntetésével. A grafikon a jegy súlyának megfelel vastagságú oszloppal jelzi az adott jegyet, kis (piros) vízszintes vonással

jelezve az addigi átlagot (ld.:jegygrafphp 6230) - 15 - A portál / „Szolgáltatások” 3.321 A diák jegyeit meg tudja nézni a diák, az a tanár, aki adta, a regisztrált szül és az osztályf nök. Az osztályf nöknek lehet sége van áttekint grafikont készíteni az osztályról, sorrendbe rakva a diákokat átlag szerint (ld.:9 ábra ill 6239) 3.322 „Beírások” 9. ábra az osztályban keletkezett minden jegy grafikonja egy képen A földrajz és hittan jegyek egy részlete van kinagyítva A terveim közé tartozik az „ellen rz s beírások” kiváltásának lehet sége. Jelenleg email-ben szoktam jelezni a regisztrált szül nek, ha beírást kap az illet gyermek, de talán jó volna egy archívumot erre fenntartani, amelyet a gyermeket tanító kollégák is látnak az ellen rz höz hasonlóan. 3.323 Iskolai adminisztráció A hivatalos adminisztrációt az év végi jegyek érdeklik Ezen a modulon most dolgozom, hogy év végére a statisztikai

kimutatásokat könnyen le lehessen kérdezni a min ségi iskolai munka javítására. - 16 - A portál / A központi adatbázis 3.4 3.4 A központi adatbázis 3.41 Az adatbázis felépítése 3.411 Áttekintés Hogy a további leírás jobban követhet legyen, a legfonto- sabb táblákra készítettem egy ábrát, amelyen az egymáshoz kapcsolódást is igyekeztem ábrázolni (10. ábra) 10. ábra a fontosabb táblák kapcsolódása 3.412 Az adatbázis alaptáblái alaptablaksql (ld:611) Jelmagyarázat: vastag: not null, d lt: unique/primary key); Minden adatbázisban szerepl belépési azonosító szerepel az „emberek” táblázatban. Ez az email címen kívül semmilyen személyes adatot nem tartalmaz (ld.:6111): 1. táblázat: emberek tábla mez név típus megjegyzés ember varchar(32) Rendszer szinten egyedi azonosító. Hetedik elején kapják nev varchar(50) Polgári név. Ez alapján gyártja le a regisztráció a belépési azonosítót. email

varchar(64) Lehet több is, vessz vel elválasztva; Ide kapja az automatikus értesítéseket és a listás leveleket uid smallint UNIX user id. Jelenleg nem használjuk gid smallint UNIX group id. Jelenleg nem használjuk homedir varchar(32) UNIX saját könyvtár helye. Jelenleg nem használjuk shell varchar(32) UNIX kezdeti program. Jelenleg nem használjuk vedett boolean Adminisztratív felhasználó. Jelszavára megkötések vannak A regisztráláshoz és az adatok (név, email) módosításához jóváhagyás szükséges. Ezeket, az átmeneti tárolóban lev adatokat, a táblázatok „ tmp” illetve „ mod” utótaggal ellátott - 17 - A portál / A központi adatbázis 3.412 táblázat-variánsok tartalmazzák. Jóváhagyás után bekerülnek az eredeti táblázatba Mivel ezek a táblázat-verziók az eredetivel azonos felépítés ek, ezért ezek felépítését itt nem ismertetem. A megfelel kódból könnyen kiolvasható (ld: 6112) A

hozzáférési jogok finom szabályozása érdekében az adatokat külön táblázatba gy jtöttük: ember adatok (ld.:6121) 2. táblázat: ember adatok tábla mez név típus megjegyzés ember varchar(32) => emberek.ember szuletes date születési dátum cim varchar(100) lakcím mobil varchar(20) saját mobil telefon diakig varchar(20) diákigazolvány túralisták esetére telotth varchar(15) otthoni telefon telmh varchar(32) munkahelyi telefon (szül knek) A jogosultságok, hozzáférések jórészt attól függnek, hogy milyen csoportba tartozik az illet . Az összes csoportot a csoportok tábla tartja nyílván: 3. táblázat: csoportok tábla mez név típus megjegyzés csoport varchar(20) Ez a csoport azonosítója nev varchar(30) Ez a csoport neve. Osztályok esetében évente át kell írni vezeto varchar(32) references emberek(ember) pl. osztályf nök, szakkörvezet tipus smallint Osztálynál 1 url varchar(100) A csoport

honlapja. A csoport tagságot két helyen tartjuk nyílván. A valóságos csoporthoz tartozást a csoport tagok real táblázat tartja nyílván. Ebb l dolgozik a csoport tagok view, amely olyan „leszármazott” csoportot is tartalmaz, mint a „beléphet” nev , amelyben azok vannak, akik jelenleg tagjai valamely osztálynak.  k léphetnek be a gépteremben. Ez a view kezeli a különféle alcsoportokat is. 4. táblázat: csoport tagok real tábla mez név típus megjegyzés csoport varchar(20) => csoportok.csoport ember varchar(32) => emberek.ember - 18 - A portál / A központi adatbázis mez név 3.412 típus megjegyzés kezdet date mikor lett a csoport tagja? veg date ha üres, akkor most is tag 3.413 A csoportok hierarchiája A csoportokba nem lehet akárkit betenni, háromfajta megkötést lehet megadni: 1. F csoport: a felhasználó tagja kell hogy legyen egy csoportnak ahhoz, hogy ebbe a csoportba belekerülhessen. Ezt f csoportnak

nevezzük 2. Ütköz csoportok: ha a felhasználó már tagja egy csoportnak, akkor ennek a csoportnak már nem lehet tagja. Pl egy ember vagy angolos vagy németes, nem lehet mindkett egyszerre. Ezt a megszorítást csoportosításokkal érjük el, vagyis ha egy csoport tagja egy csoportosításnak, akkor egy ember a csoportosításon belül csak egy csoportnak lehet tagja. Tehát a fenti példán létre kell hozni egy „els idegennyelv” csoportosítást, melynek tagjai: 2002aangol, 2002anemet, 2003aangol, 2003anemet stb. 3. Összevont csoportok: ha egy csoport tagja egy csoportnak, akkor biztosan tagja egy másik csoportnak is. Pl ha van egy 2002a meg egy 2002c osztály, akkor létrehozhatunk egy 2002ac csoportot, melynek tagjai 2002a és 2002c csoport minden tagja. Így lehet pl egy közös stúdiumot tartani Az ilyen csoportokat összevont csoportoknak nevezzük. 5. táblázat: csoportositasok tábla mez név típus megjegyzés csoportositasok varchar(20) A

csoportosítás azonosítója. nev varchar(30) A csoportosítás „hosszú neve”. kotelezo boolean Kötelez -e? 6. táblázat: alcsoportok tábla mez név típus megjegyzés focsoport varchar(20) => csoportok.csoport Honnan lehet jelentkezni? Ha null, akkor bárhonnan. alcsoport varchar(30) => csoportok.csoport az alcsoport neve mindenki boolean Ha ez true, akkor focsoport minden tagja tagja az alcsoportnak is - 19 - A portál / A központi adatbázis 3.413 7. táblázat: utkozo csoportok mez név típus megjegyzés csoport varchar(20) => csoportok.csoport Az egyik ütköz csoport neve. csoportositas varchar(20) => csoportositas.csoportositas Mely csoportosításban van? 3.414 Osztályzatok és az órarend tárolása Az osztályzatokat egy nagy közös táblázatban tároljuk, de a megtekintésük a hozzá definiált view segítségével történik. 8. táblázat:jegyek real mez név típus megjegyzés diak varchar(32) =>

emberek.ember Ki kapta a jegyet? tantargy varchar(20) => tantargyak.tantargy Melyik tantárgyból? datum date Mikor kapta a jegyet? jegy smallint Csak egész szám lehet. Ez ma zavaró korlátnak bizonyult ok varchar(100) Mire kapta a jegyet? sulyozas float4 Mekkora a jegy súlya az átlagban? id serial Törléskor fontos, hogy egyedileg azonosítható legyen. Ki is láthatja akkor? Íme a jegyek view megadása: create view jegyek as select * from jegyek real as jegy where diak=CAST(user as text) or szulo e(CAST(user as text), CAST(diak as text)) = true or tanar diakja e(CAST(user as text), jegy.diak, jegytantargy) = true or osztalyfonok e(CAST(user as text), jegy.diak) = true or csoport tag e(getpgusername(), jegy admin) = true; Az egyes függvényeket ugyanott definiáljuk. Például -- tanar diakja e(tanar, diak, tantargy) (ld.:6119) create function tanar diakja e(text, text, text) returns boolean as declare talalt smallint; begin select into talalt count(*)

from tanitas where tanar=$1 and tantargy=$3 and csoport in (select csoport from csoport tagok where ember=$2); if talalt>0 then return true; else return false; end if; end; language plpgsql; - 20 - A portál / A központi adatbázis 3.414 Látszik, hogy ez a függvény a „tanitas” táblát használja. Ez a következ képpen néz ki (9. táblázat): 9. táblázat: tanitas (ld:6119) mez név típus megjegyzés tanar varchar(32) => emberek.ember Ki tartja az órát? csoport varchar(20) => csoportok.csoport Kiknek tartja? tantargy varchar(20) => tantargyak.tantargy Milyen tantárgyból? nap smallint Melyik napon van az óra? ora smallint Hányadik óra? het smallint Ha van A és B hét terem varchar(20) => termek.terem Hol lesz az óra? Ez tehát egyben az órarendet is tárolja. Itt átmeneti nehézségek adódhatnak pl év elején, amikor még nincs órarend, de már jó lenne a többi adattal feltölteni az adatbázist. Ilyenkor fel

lehet venni egy „virtuális órát” pl. hétf nulladik órában minden tantárgyból A tanítás táblázatban csak olyan tantárgyat lehet felvenni, amelyet megtalálunk a „tantargyak” táblázatban: 10. táblázat:tantargyak (ld:6119) mez név típus megjegyzés tantargy varchar(20) A tantárgy azonosítója és egyben rövid neve. nev varchar(30) A tantárgy (hosszú) megnevezése. Hasonlóképpen meg kell adni, hogy melyik teremben lesz az óra: 11. táblázat:termek (ld:6119) mez név típus megjegyzés terem varchar(20) A terem azonosítója, és egyben rövid neve. nev varchar(30) A terem (hosszú) megnevezése. ferohely smallint Hány tanulót lehet leültetni? A csöngetési rendet egy hirdet tábla-script1 használja, ez ki tudja írni az órára várakozók ülésrendjét. Ennek olyan gépteremben van nagy jelent sége, ahol nem egyformák a gépek Az ülésrend táblázatot használja a röpdolgozat-irató2 rendszer. A két említett tábla: 1

A hirdet tábla scripteket nem ismertetem. Jelenleg nem használjuk, további fejlesztést igényel 2 A röpdolgozat-scriptek egy korábbi rendszeremre alapulnak és diákjaim készítették, ezért itt nem ismertetem. A mellékelt CD-n megtalálhatóak, de igen terjedelmesek - 21 - A portál / A központi adatbázis 3.414 12. táblázat: ulesrend (ld:6119) mez név típus megjegyzés nap date Melyik napon ül a diák az adott gépnél? ora smallint Hányadik órában ül a diák az adott gépnél? ember varchar(32) => emberek.ember Ki ez a diák? gép smallint Melyik gép el tt ül? 13. táblázat: csongetes (ld:6119) mez név típus megjegyzés ora smallint Hányadik óra adatai? kezd time Mikor kezd dik az óra? veg time Mikor csöngetnek ki? 3.415 A gépterem használatával kapcsolatos táblázatok Az használhatja a géptermet, aki jelenleg tagja egy osztálynak és nincs kitiltva. A kitiltásnak két fokozata van: csak internet-hozzáférés

tiltása illetve teljes kitiltás (ld.:3312) A kitiltásokat a „kitiltasok” táblázatban tartjuk nyilván (14. táblázat) 14. táblázat: kitiltasok (ld:615) mez név típus megjegyzés ember varchar(32) => emberek.ember Ki van kitiltva? kezdete date Mikor kezd dik a kitiltása? veg date Meddig van kitiltva? (Ha ez null, akkor végleg.) ok varchar(100) Pár szavas indoklás. Ez az elrettentést szolgálja (ld.: 3 ábra a 11 oldalon) belepes tilt boolean Megtiltjuk-e, hogy órán kívül bejöhessen. (Ha neki van itt óra, akkor ennek ellenére is beléphet.) internet tilt boolean Tud-e internetezni. (A helyi szerverek ekkor is elérhet ek számára.) id serial Egyedi azonosító a törléshez. Ha valaki használhatja a géptermet, akkor célszer el re gépet foglalnia (ld.:3313) Hogy milyen gépek vannak, azt a „gepek” ill. „geptipusok” táblázatban tároljuk, hogy mennyivel foglalhat több id t hetente illetve összesen, mint a többség, azt

a „foglalasi idok” táblázat tartalmazza. Ezeknek a táblázatoknak a felépítését is lássuk: - 22 - A portál / A központi adatbázis 3.415 15. táblázat: gepek mez név típus megjegyzés gep smallint Gép sorszáma. geptipus varchar(32) =>geptipusok.geptipus Milyen féle gép ez? 16. táblázat: geptipusok mez név típus megjegyzés geptipusok varchar(32) Ezt írja ki a foglalási napló. szines boolean Színes-e a monitor? processzor varchar(16) Processzor megnevezése. memoria smallint Memória mérete megabájtban. hdd float4 Merevlemez mérete. állapot varchar(16) Megjegyzések helye. kiegészít k varchar(32) Pl. nyomtató, scanner 17. táblázat: foglalasi idok mez név típus megjegyzés ember varchar(32) =>emberek.ember Kinek az ideje? heti ido interval Egy héten lefoglalható extra id . oszes ido interval Összes lefoglalható id ? Magát a foglalást a „foglalasok” táblázatban tartjuk

nyilván. 18. táblázat: foglalasok mez név típus megjegyzés ember varchar(32) =>emberek.ember Ki foglal id t? nap date Melyik napra foglal? kezdet time Mikor kezd dik a foglalási id ? vég time Mikor végz dik a foglalás? gep smallint =>gepek.gep Melyik gépet foglalja? Ha egy nap nem nyit ki a gépterem, akkor ezt a „spec napok” táblában kell regisztrálni. 19. táblázat: spec napok mez név típus megjegyzés nap date Melyik nap tér el a többit l? tanítás smallint Milyen nap szerint van tanítás? ok varchar(50) Mi az eltérés oka? - 23 - A portál / A központi adatbázis 3.415 Ha délután informatika szakkör van a gépteremben, akkor erre az id re csak a szakkör tagjai foglalhatnak. A szakkörök emberek csoportjai Itt a „sztech szakkorok” táblázatban csak az id pontot rendeljük hozzá, mert ez nem illeszkedik bele az órarendbe. 20. táblázat: sztech szakkorok mez név típus megjegyzés csoport

varchar(20) =>csoportok.csoport A szakkör azonosítója nap smallint A hét melyik napján van a szakkör? kezdet time Mikor kezd dik a szakkör? vég time Mikor végz dik a szakkör? Hasonló specialitás, hogy minden szakkörhöz meg kell adni, hogy mely gépekre tart igényt: „szakkori gepek”. 21. táblázat: szakkori gepek mez név típus megjegyzés ember varchar(32) =>emberek.ember Ki foglal id t? csoport varchar(20) =>csoportok.csoport Melyik szakkör gépei? gep smallint =>gepek.gep Melyik gép? 3.42 Felhasználói felületek az adatbázishoz 3.421 SYMPA levelezési lista kezel Az általam ismert magyar felülettel rendelkez szabad forráskódú listakezel k közül egyedül francia fejlesztés SYMPA t nt alkalmasnak, hogy integráljam adatbázishoz. Minden osztályhoz három listát hoztam létre: egyet a diákoknak, egyet a szül knek és egyet közösen. Az osztályf nök mindhárom listának tagja. A listán mindenki az

adatbázisba regisztrált címmel van rajta. A levelez szerver módosítás nélkül támogatja az adatbázisból lekérést, így csak a megfelel táblákat kellett létrehozni, valamint egy ,,sympa nev felhasználót. 3.422 Els dleges azonosítás a gépteremben Az adatbázisba kell belépnie mindenkinek, aki az iskola számítógépes laborjában dolgozni akar. Ezt a pam-pgsql1 modul segítségével oldottuk meg, azt némileg továbbfejlesztve azt A belépéskor a felhasználó által megadott nevet és jelszót megnézzük, hogy benne van-e a ,,beléphet csoportba, hogy nincsen-e kitiltva, illetve, hogy ezzel az azonosítóval rá lehet-e 1 pam: linuxos belépési azonosító rendszer ennek egyik eleme a pam pgsql [pam pgsql] - 24 - A portál / A központi adatbázis 3.422 csatlakozni az adatbázisra. Ha ezen feltételek mind teljesültek, akkor belépett a felhasználó Erre a célra külön view szolgál (ld: 6.114) 3.423 SMS-értesítés Jelenleg még kipróbálási

stádiumba van az smssend1 integrálása. Ez a program automatikusan képes lejátszani azt a folyamatot, amikor egy internet-böngész segítségével SMS-t küldünk valamely weboldal segítségével. Ilyen web oldal volt a közelmúltig az wwwmtnsmscom, de több magyar szolgáltató is kínál korlátozottan ingyenes sms küldési lehet séget. Ha a felhasználó regisztrálja magát valamelyik ilyen szolgáltatásra, és azonosítóját valamint jelszavát megadja, akkor a szerver ezzel a programmal értesítést tud neki küldeni,az el re meghatározott események esetén. Például, ha gyermeke elégtelent kap, vagy valamely tantárgyból átlaga egy küszöb alá s lyed, ha belép az adatbázisba, ha kifogásolható internet tevékenységet detektálunk az  azonosítójával, ha elfelejtett jelszót kéri stb. 3.424 Beléptet rendszer Minden gimnázium diákjai rendelkeznek egyedi azonosításra alkalmas eszközzel: a diákigazolvánnyal. Ennek felhasználásával,

valamint egy vonalkód-olvasóval megvalósítható volna az iskolába érkezés és az eltávozás nyomon követése. A kísérlet jelenleg ott akadt el, hogy a diákigazolványon lev vonalkód szerencsétlen elhelyezkedése következtében nehéz olcsó vonalkódolvasót találni hozzá. Ennek segítségével lehet vé válna, hogy a hetes vagy éppen az aktuális órát tartó tanár SMS- ben kap értesítést a hiányzó tanulókról. Hasonló módon lehetne a szül ket is tájékoztatni a mulasztásokról. A hónap végén az osztályf nök pontos kimutatással rendelkezne a mulasztott órákról. 3.425 Ebédeltetési rendszer Ez is a továbbfejlesztési lehet ségek közé tartozik. A diákigazolvánnyal rendelkez diák az ebédl el tt sorszámot kap (diákigazolványára), amelyre megkapja az ebédjét. Ezzel pontosan nyomon követhet vé válna az el nem fogyasztott (visszafizetend ) ebédek száma, és a hónap végi számlakészítés is automatizálható. Így

megoldhatóvá válik, hogy a gépfoglalás mintájára el re megadhassa a diák, hogy mely napokon kér ebédet. 1 smssend: a skytech program [smssend] - 25 - A portál / Kommunikációs eszközök 3.5 3.5 Kommunikációs eszközök 3.51 Levelezési listák integrálása Ha már minden diákot és szül t nyilvántartunk az adatbázisba, felmerült annak az igénye, hogy levelezési listák formájában is lehessen egymással kapcsolatba lépni. A szabadon hozzáférhet lista-szerver programok közül a francia fejlesztés SYMPA1 programra esett a választásom, mivel ez közvetlenül támogatja adatbázisok használatát, valamint támogatja a magyar nyelvet. Osztályonként három listát hoztam létre: egyet, amelyen a diákok vannak az osztályf nökkel, egyet amelyen a szül k vannak és az osztályf nök, valamint egyet, amely a másik két halmaz uniója. Ezzel a módszerrel elérhet , hogy úgy vannak rajta levelezési listán, hogy ezzel nem kell újabb

adminisztrációs terhet magukra vállalniuk. A listák un privát munkacsoportok, ami azt jelenti, hogy csak a tagok írhatnak rá és a lista archívumát is csak  k látják. Így a postaládákat a listákon keresztül nem fenyegetik a reklámszóró cégek 1 Sympa: http://listes.crufr/sympa/ [sympa] - 26 - A portál / Kommunikációs eszközök 3.52 11. ábra A SYMPA listák 3.52 Web felület Az egységes web felületet egy saját függvénytárral támogatjuk. Ez egyrészt biztosítja a portál egységes kinézetét, másrészt megkönnyíti a fejlesztést. A legfontosabb részeket az alapphp (ld.: 623) tartalmazza 3.521 Az adatbázis lekérdezéseket megkönnyít függvények query($sql) vansora($res) Lefuttatja a paraméterében adott lekérdezést. Van-e értékelhet sora a korábbi lekérdezésnek? sql get val($sql) A paraméterében adott lekérdezés egyetlen értékét adja eredményül. csoport tag vagyok e($csoport) Tagja-e a belépett user az adott

csoportnak? admin vagyok e() Tagja vagyok-e egy adminisztrációs csoportnak? 3.522 A html felületet egységesít függvény-tár html kezd spec($title, $spec) Kiírja egy weblap fejlécét az adott címme. Második paramétere a body tag opciója. html kezd($title) Kiírja egy weblap fejlécét az adott címmel. html veg() A lapok alján lev egységes szöveget írja ki. - 27 - A portál / Kommunikációs eszközök hiba($szoveg) info($szoveg) 3.522 Hibaüzenet kiírására. Kis ikont is kirajzol Értesítésre hívja fel a figyelmet kis ikonnal. html link($nev, $url) Hiperhivatkozás cim($szoveg) Középre igazított h1 címsor. kiscim($text) h2 rangú cím h3($text) h3 rangú cím alcim($text) középre igazított h2 címsor balra($url) Balra mutató nyíl alternatív szöveggel. jobbra($url) Jobbra mutató nyíl alternatív szöveggel vissza($url) Vissza gomb alternatív szövegel form kezd($action)  mehet() Jóváhagyó gomb. submit($text)

Szöveges jóváhagyó gomb. gomb($szoveg, $url) Két szögletes zárójel között egy hivatkozás. form veg() Középre egy mehet gomb. hidden tag($name, $val) Rejtett form tag. rlap kezdete. 3.523 Html táblázatokat nyomtató függvények result tablazat($res, $name, $kovetkezo form) sql link tablazat($lekerdezes, $name, $kovetkezo form) Lekérdezés eredménye táblázatban, úgy hogy a „name” mez hiperhivatkozással van ellátva. Az el z  függvényhez megcsinálja a lekérdezést. sorki($text) Kiír egy bekezdést. th($text, $modosito) Táblázatos függvények használják a fejléc-sorban. tbl fejlec kezd() A tr tag a fejléchez. tbl fejlec veg() /tr tr kezd() Új sor. Kezeli a sorszínek váltakozását tr veg() Sor vége. td($szoveg) Egy cella. td kezd() Cella eleje. td veg() Cella vége. td spec($szoveg, $modosito) Speciális cella. tbl kezd($oszlopok, $modosito) A tablazat kezd használja. Középre rakott táblázat tbl kezd

balra($oszlopok, $modosito) A tablazat kezd használja. Balra rakott táblázat tablazat kezd($oszlopok, $fejlec, $modosito) Új táblázat. A fejlec egy oszlopok hosszóságú tömb - 28 - A portál / Kommunikációs eszközök 3.523 tablazat kezd balra($oszlopok, $fejlec, $modosito) Balra igazított táblázat. tablazat veg() Táblázat vége. 3.524 Szövegfüggvények sqlstr2($text) Az üres stringet „null”-ra cseréli. sqlstr($text) Vessz t is tesz a string után. kelle str($text, $vizsgalat) A feltéltelt l függ  en „null”-ra cseréli a stringet. check str($vizsgalat, $igen, $nem) Feltételes értékadás. time to array($ido) array to perc($ido) Az id stringet tömbbé alakítja. A tömbben adott id t perccé alakítja. date to text($datum) Az sql dátum stingjéb l magyarított dátum stringet ad. pgbool to text($bool) A pgbool helyett igen vagy nem szavakat adja. 3.525 A dokumentáció függvényei konyv tartalom($konyv) Könyv

tartalomjegyzéke. resz tartalom($konyv, $resz) Fejezet részei. doc link($konyv, $resz, $fejezet, $text) Könyv részére hivatkozik. doc img($img) Könyvön belüli kép beillesztése. doc img spec($img, $mod) Könyvön belüli kép beillesztése extra paraméterrel. fej($szoveg, $nev) Fejezet kereszthivatkozással. 3.526 Értesít scriptek emailkuld($ember, $tema, $uzenet) jegy ertesit($diak, $tantargy, $jegy, $ok) Emailt küld az adott user regisztrált címére, vagy a szerverre. Megfogalmazza a jegy értesít üzenetet és elküldi a diáknak, és a regisztrált szül knek. 3.527 Foglalási napló függvényei time2perc($time) A szövegben adott id t perccé alakítja. fogl csikba($csik, $kezdet, $veg, $img, $alt, $link, $foglalhat) A „foglalási térkép” egy sora. fogl csik kiir($csik, $gep, $geptipus) A „foglalási térkép” egy sorát ki is írja. 3.528 Üdvözl oldal függvényei szulo e($pofa) A bejelentkezett felhasználó szül -e?

tanit e($pofa) A bejelentkezett felhasználó tanár-e? diak e($pofa) A bejelentkezett felhasználó jelenlegi diákunk-e? - 29 - A portál / Kommunikációs eszközök 3.528 A bejelentkezett felhasználó osztályf nök-e? ofo e($pofa) ofo szoveg() Az osztályf nök számára kiírandó szöveg. diak szoveg() A diákjaink számára kiírandó szöveg. szulo szoveg() A szül k számára kiírandó szöveg. tanar szoveg() A tanárok számára kiírandó szöveg. vendeg szoveg() A vendég felhasználó számára kiírandó szöveg. 3.529 Regisztrációs függvények nevtologin ($nev) A teljes névb l azonosítót készít. vanilyen($login) Van-e már ilyen azonosító? 3.5210 Menüt kezel függvények F menü kiírása. Ha ez az aktív, akkor más színnel menupont($text, $url, $nev, $aktiv,$szin) menu kiir($menu, $aktiv,$szin) spec menu($aktiv, $almenu, $almenu aktiv,$szin) menu($aktiv, $almenu aktiv,$szin) A teljes menü kiírása. Más szín  menü.

Ezt kell meghívni más scripb  l. 3.53 MS-Access felület A gazdasági irodán, még sajnálatos módon windows környezetben dolgoznak. Erre a rendszerrel a postgresql adatbázist egy access felületen keresztül lehet majd összekötni. Erre a postgresql adatbáziskezel saját szabványos felületével lesz lehet ség, kihasználva azt a tervezési szempontot, hogy a hozzáférési, biztonsági kérdéseket adatbázis-szinten biztosítjuk. 3.54 SMS értesítés A hálózatunk széles sávú internet- hozzáférése lehet séget biztosít arra, hogy kihasználjuk a különböz internet-oldalak SMS-küld szolgáltatásait. Itt a smssend1 programot kellett segítségül hívni. Az állandóan változó kínálatot a program scriptjeinek frissítésével lehet követni. Mivel az általam ismert összes ilyen helyen pillanatnyilag csak el re regisztrált felhasználók naponta korlátozott mennyiség SMS-t küldhetnek, ezért a regisztrációt a felhasználóra

hárítjuk és így mindenki a saját napi quotája rovására küldethet a rendszerrel értesítéseket. Arra is lehet ség van, hogy egy felhasználó akár több ilyen belépési nevet és jelszót megadjon, amelyekkel sorba próbálkozhat a szerver. Tervezett SMS-értesítési események: gyermekem elégtelent, „beírást” kapott. Valamely tárgyból az átlaga egy érték alá 1 Az smssend projekt nyilvános web-oldalak felhasználásával küld sms-t [smssend] - 30 - A portál / Kommunikációs eszközök 3.54 s lyedt. Beléptem az adatbázisba Gyermekem gyanús internet- tevékenységet folytat Valamely tantárgyból frissültek az adatbázisban tárolt jegyek stb. Ezeket az értesítéseket az esemény jellegéb l adódó módon kell elindítani. Például a jegy- átlag, vagy jegy-frissülést jelz értesítéseket a tanári jegy-adás oldalon lehet nyomon követni. Mindazonáltal célszer nek t nik egy FIFO táblát létrehozni az adatbázisba, amelyet

percenként ürít egy processz. Ezzel lehet ség van az egy percen belüli értesítések összevonására, csökkentve ezzel a forgalmat. - 31 - A kísérlet tanulságai / A kísérlet tanulságai 4. 4. A kísérlet tanulságai 4.1 Motiváció 4.11 Tanárok Mint bevezet mben említettem a portál a mi iskolánkban egy „alulról jöv kezdeményezés” volt, inkább egy lelkes tanár szakmai lendülete és nem a küls körülmények kényszerít nyomása volt az, amely miatt megvalósult. Ebb l szorosan következik, hogy a rendszer használatának iskolán belüli bevezetése nélkülözi az iskolavezetés kényszerít szigorát és a kollegiális kérés, a csodálkozó érdekl dés síkján mozog. Ebben akkor várható lényeges el relépés, amikor az év végi statisztikát is ez a program fogja elkészíteni. 4.12 Diákság Az iskolai gépterem-használat nélkülözhetetlen részét képezi a portál, így a diákoknak ismerniük kell ennek használatát.

Csak ezen keresztül tudnak maguk számára gép-id t foglalni, és itt tudják belépési jelszavukat is megváltoztatni. Az internet-használat során kitiltásra kerül k innen értesülnek hozzáférésük korlátozásáról. Így a géptermet használó diákság szükségszer en napi felhasználóvá válik. 4.13 Szül k Els sorban fogadóórák el tt látogatnak el a szül k a gyermekük eredményeit tartalmazó oldalra, amelyet ekkor tud az osztályf nök föltölteni a (papíros) osztályzónapló alapján. Jelenleg csak az általam tanított diákok szülei regisztrálták magukat, és igen értékes észrevételekkel szolgálnak a rendszer m ködésér  l. 4.2 A gyakorlat A folyó kísérleti évben a gépterem körüli funkciók (foglalási napló, belépés, kitiltások, hirdet tábla, nyomtatási rendszer) napi használatba kerültek és megállták a gyakorlat próbáját. Az írás pillanatáig a röpdolgozat-írató rendszert még nem használtam

„élesben” Ezért nem is foglaltam bele ebbe a dolgozatba az ismertetését. Az érdemjegyek feltöltése a saját tanári tevékenységemre korlátozódott. Az általam tanított diákok jegyei mindig rövid id alatt felkerültek a portálra. Ezen felül abban az osztályban, amelynek osztályf nöke vagyok, a többi jegyet is feltöltöttem az osztályzónapló alapján az - 32 - A kísérlet tanulságai / A gyakorlat 4.2 adott szaktanárok nevében belépve. Az ezek alapján készített heti óraszámmal súlyozott átlag alapján megállapított „rangsort” nagy érdekl dés kísérte. 4.3 Továbblépési pontok A használat során számos olyan tapasztalatra tettünk szert, amely további fejlesztésre sarkall minket: 4.31 Félévi jegyek A diákok jegyeinek adminisztrálásánál félévkor szembesültem azzal a ténnyel, hogy egyel re nincs hova beírni a félévi értesít jegyeit. Ezt az iskolaév vége el tt mindenképpen szeretném beilleszteni. 4.32

Év végi statisztika Most gondolkozik az igazgató azon, hogy valamelyik kollégát megkérje egy év-végi iskolastatisztika-program megírására. Nagyon jó volna, ha a portál egyik szolgáltatása lenne ezen statisztikák elkészítése. 4.33 Nyilvánosságra hozatal id pontja A diákok jegyeinek adminisztrálásakor merült fel annak igénye, hogy a beírt jegy mellé lehessen egy olyan dátumot vagy id pontot rendelni, amely el tt a jegyek ugyan benne vannak az adatbázisban, de nem kérdezhet k le. Enélkül az a méltánytalan helyzet áll el , hogy otthon a szül el bb tudja egy-egy dolgozat eredményét, mint a diák maga. Különösen is kellemetlen ez, ha a dolgozat kiosztásakor jogos reklamálás történik. 4.34 Frissülés ideje Az érdemjegyek csoportos, táblázatos feltöltésénél elvész annak lehet sége, hogy az új jegyr l a diák vagy a szül email-ban vagy SMS-ben értesítést kapjon. Jó volna, ha a tömeges feltöltés esetén figyelné a

rendszer a változásokat, és err l értesítést küldene az érintetteknek. Hasonló módon tájékoztathatna a rendszer a legutóbbi feltöltés idejér l. Ezt most legkönnyebben a legújabb jegy dátumaként lehetne értelmezni. 4.35 Nyílt forráskód A projekt hosszútávú jöv jét úgy tervezem, hogy a felhasznált programokhoz hasonlóan nyílt forráskódú projektként közzéteszem az interneten, majd felhívom rá a magyar középiskolában m köd rendszergazdák, tanárok figyelmét. Erre a célra már le is foglaltam a „suliportal” - 33 - A kísérlet tanulságai / Továbblépési pontok 4.35 nevet a sourceforge1 szerveren. Azt remélem, hogy így más nyílt forráskódú projektekhez hasonlóan csoportos fejlesztéssel egy ténylegesen jól használható, hatékony eszközt tudunk adni a magyar középiskolák közösségének. 12. ábra a projekt regisztrációja a sourceforge szerveren 1 Egyik legnépszer bb nyílt forráskódú fejlesztéseket

támogató szerver. A jelen projekt honlapja: http://suliportal.sourceforgenet [sourceforge] - 34 - Bibliográfia / Bibliográfia 5. 5. Bibliográfia [autologin]: http://www.linux-easycom/developmentphp Bernhard Rosenkraenzer [GNU]: A GNU Nem Unix! http://www.fsforg/homehuhtml Free Software Foundation [jargonfile]: Jargon File http://www.tuxedoorg/~esr/jargon/html/indexhtml Eric Raymond [jesred]: A jesred project http://ivs.csuni-magdeburgde/~elkner/webtools/jesred/ Jens Elkner [lynx]: A lynx brower honlapja http://lynx.browserorg/ TEDickey [mysql]: http://www.mysqlorg [netlingo]: NetLingo The Internet Dictionary http://www.netlingocom( Erin Jansen [opera]: opera böngész http://www.operacom/ [pam pgsql]: Project: sysauth-pgsql http://sourceforge.net/projects/sysauth-pgsql Joerg Wendland [perl]: http://www.perlorg [PHP intro]: Inroduction to PHP Stig Saether [postgresql]: http://www.postgresqlorg [smssend]: http://zekiller.skytechorg/smssend menu enhtml! [sourceforge]:

http://www.sourceforgenet [squid]: http://www.squid-cacheorg/ [squid FAQ]: http://www.squid-cacheorg/Doc/FAQ/FAQhtml Duane Wessels [stunnel]: Stunnel -- Universal SSL Wrapper http://www.stunnelorg Brian Hatch [sympa]: http://listes.crufr/sympa/ The CRU (Universities Network Committee) [vnc]: Virtual Network Computing http://www.ukresearchattcom/vnc/ AT&T Laboratories Cambridge - 35 - Az adatbázis program-részletei / Az adatbázis program-részletei 6. Az adatbázis program-részletei 6.1 Az adatbázis szerkezetét megadó kódok 6.11 alaptablaksql -- a jogok a jogok.sql-ben 6.111 emberek create table emberek ( ember varchar(32) not null primary key, -- nincs references! nev varchar(50) not null, email varchar(64), uid smallint, -- ezeket egyel re nem használjuk (helyette a /etc/passwd gid smallint, -- tárolja) homedir varchar(32), shell varchar(32), vedett boolean ); 6.112 emberek tmp -- ide jönnek a regisztrált jóváhagyandó userek create table emberek tmp ( ember

varchar(32) not null primary key, -- nincs references! nev varchar(50) not null, szuletes date, cim varchar(100), mobil varchar(20), diakig varchar(32), telotth varchar(15), telmh varchar(32), email varchar(64), uid smallint, gid smallint, homedir varchar(32), shell varchar(32) ); 6.113 emberek mod -- ide jönnek a modositando userek create table emberek mod ( ember varchar(32) not null, -- nincs references! nev varchar(50) not null, szuletes date, cim varchar(100), mobil varchar(20), diakig varchar(32), telotth varchar(15), telmh varchar(32), email varchar(32), uid smallint, gid smallint, homedir varchar(32), - 36 - 6. Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok shell varchar(32), id serial not null ); 6.114 szulok tmp -- regisztrált, jóváhagyandó szül" k create table szulok tmp ( szulo varchar(32) not null references emberek tmp(ember), gyerek varchar(32) not null references emberek(ember) ); 6.115 szulok mod -- regisztrált, újabb

szül " -kapcsolat create table szulok mod ( szulo varchar(32) not null references emberek(ember), gyerek varchar(32) not null references emberek(ember) ); 6.116 passwd tmp -- regisztrált, jóváhagyandó emberek jelszava create table passwd tmp ( ember varchar(32) not null references emberek tmp(ember), passwd varchar(32) not null ); 6.117 szulok create table szulok ( szulo varchar(32) not null references emberek(ember), gyerek varchar(32) not null references emberek(ember) ); 6.118 csoportok create table csoportok ( csoport varchar(20) not null primary key, nev varchar(30), vezeto varchar(32) references emberek(ember), tipus smallint, url varchar(100) -- evfolyam smallint, -- betu char(1), -- unique (evfolyam, betu) ); 6.119 csoportositasok create table csoportositasok ( csoportositas varchar(20) not null primary key, nev varchar(30), kotelezo boolean ); - 37 - 6.113 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.1110 alcsoportok create

table alcsoportok ( focsoport varchar(20) references csoportok(csoport), alcsoport varchar(20) not null references csoportok(csoport), mindenki boolean not null, -- mindenki automatikusan tagja-e az alcsoportnak unique (focsoport, alcsoport) ); 6.1111 utkozo csoportok create table utkozo csoportok ( csoport varchar(20) not null references csoportok(csoport), csoportositas varchar(20) not null references csoportositasok(csoportositas) ); 6.1112 csoport tagok real create table csoport tagok real ( csoport varchar(20) not null references csoportok(csoport), ember varchar(32) not null references emberek(ember), kezdet date not null, veg date ); 6.1113 tagok real tmp create table csoport tagok real tmp ( csoport varchar(20) not null references csoportok(csoport), ember varchar(32) not null, kezdet date not null, veg date ); 6.1114 csoport tagok (view) create view csoport tagok as select alcsoport as csoport, ember, kezdet, veg from alcsoportok, csoport tagok real where alcsoport=csoport

or (focsoport=csoport and mindenki=true); grant select on csoport tagok to public; CREATE SEQUENCE seq usesysid increment 1 start 1000; --insert into emberek values (vendeg, Látogató); ---- ez azért kell, mert spec jogai vannak. --insert into pg shadow values(vendeg, nextval(seq usesysid), f, --f,f, f,piar, null); 6.12 ember adatokplsql 6.121 ember adatok real create table ember adatok real ( -- ez régen együtt volt az emberek táblával, de a személyiségi jogok -- védelme érdekében kölön lett választva ember varchar(32) references emberek(ember), - 38 - 6.1110 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok szuletes date, cim varchar(100), mobil varchar(20), diakig varchar(32), telotth varchar(15), telmh varchar(32) ); 6.122 ember adatok (view) -- ember adatok -- egy ember adatait láthatják: az ember, a szül" k, tanárok, -- osztálytársak és az admin create view ember adatok as select * from ember adatok real regi where

ember=cast(user as text) or ember in (select gyerek as ember from szulok where szulo=cast(user as text)) or ember in (select ember from csoport tagok where csoport in ( select csoport from tanitas where tanar=cast(user as text))) or ember in (select ember from csoport tagok where csoport in (select cs.csoport from csoport tagok tag, csoportok cs where tipus=1 and tag.csoport=cscsoport and ember=user::text)) or csoport tag e(cast(user as text), ember admin); grant select, insert, update, delete on ember adatok to public; create rule "ember adatok insert" as on insert to ember adatok do instead insert into ember adatok real values (new.ember, newszuletes, new.cim, newmobil, newdiakig, newtelotth, newtelmh); create rule "ember adatok update" as on update to ember adatok do instead update ember adatok real set ember=new.ember, szuletes=new.szuletes, cim=newcim, mobil=newmobil, diakig=newdiakig, telotth=new.telotth, telmh=newtelmh; create rule "ember adatok

delete" as on delete to ember adatok do instead delete from ember adatok real where ember=old.ember; -- csak ember admin: jogok.plsql 6.13 adminplsql -- Sok comment: ezekre már nincs szükség, minden az adatok/*.sql-b" l jön create function csak admin() returns opaque as begin if csoport tag e(getpgusername(), admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return new; end; language plpgsql; create function csak admin delete() returns opaque as begin if csoport tag e(getpgusername(), admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; - 39 - 6.121 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok return old; end; language plpgsql; -- sajnos az összes admin csoportra létre kell hoznunk egy-egy függvényt create function csak ember admin() returns opaque as begin if csoport tag e(getpgusername(), ember admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end

if; return new; end; language plpgsql; create function csak ember admin delete() returns opaque as begin if csoport tag e(getpgusername(), ember admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return old; end; language plpgsql; create function csak csoport admin() returns opaque as begin if csoport tag e(getpgusername(), csoport admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return new; end; language plpgsql; create function csak csoport admin delete() returns opaque as begin if csoport tag e(getpgusername(), csoport admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return old; end; language plpgsql; create function csak kitiltas admin() returns opaque as begin if csoport tag e(getpgusername(), kitiltas admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return new; end; language plpgsql; create function csak kitiltas admin delete() - 40 - 6.13 Az adatbázis

program-részletei / Az adatbázis szerkezetét megadó kódok returns opaque as begin if csoport tag e(getpgusername(), kitiltas admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return old; end; language plpgsql; create function csak kredit admin() returns opaque as begin if csoport tag e(getpgusername(), kredit admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return new; end; language plpgsql; create function csak kredit admin delete() returns opaque as begin if csoport tag e(getpgusername(), kredit admin)=false then raise exception Nincs jogod ebbe a táblába írni.; end if; return old; end; language plpgsql; 6.14 csoport tagokplsql create function csoport tagok irasjog(text, text) -- $1:user, $2: csoport returns boolean as declare csoport admin boolean; admin boolean; csoport tipus smallint; vezet smallint; begin select into csoport admin csoport tag e($1, csoport admin); select into admin csoport tag e($1, admin);

select into csoport tipus tipus from csoportok where csoport=$2; select into vezet COUNT(*) from csoportok where csoport=$2 and vezeto=$1; if vezet>0 or admin=true or (csoport admin=true and csoport tipus!=2) then return true; end if; return false; end; language plpgsql; create function focsoport tag e(text, text) returns boolean as declare - 41 - 6.13 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok tag smallint; begin select into tag COUNT(*) from alcsoportok where alcsoport=$2 and (focsoport=null or focsoport in (select csoport as focsoport from csoport tagok where ember=$1 and veg=null)); if tag = 0 then return false; else return true; end if; end; language plpgsql; create function utkozo tag e(text, text) returns boolean as declare tag smallint; begin select into tag COUNT(*) from utkozo csoportok where csoportositas in ( select csoportositas from utkozo csoportok where csoport=$2) and (csoport in (select csoport from csoport tagok where

ember=$1 and veg=null)); if tag = 0 then return false; else return true; end if; end; language plpgsql; -- ezek a lapok hozzáférésénél használatosak create function kulso e(text) returns boolean as declare tag1 smallint; tag2 smallint; tag3 smallint; tag4 smallint; begin select into tag1 COUNT(*) from tanitas where tanar=$1; select into tag2 COUNT(*) from csoport tagok real c, csoportok cs where cs.tipus=1 and cember=$1 and cscsoport=ccsoport; select into tag3 COUNT(*) from szulok where szulo=$1; select into tag4 COUNT(*) from csoport tagok,csoportok where csoportok.csoport=csoport tagokcsoport and ember=$1 and tipus=2; if tag1 + tag2 + tag3 + tag4 = 0 then return true; else return false; end if; end; language plpgsql; create function tanar e(text) returns boolean - 42 - 6.14 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok as declare tag1 smallint; tag2 smallint; begin select into tag1 COUNT(*) from tanitas where tanar=$1; select into tag2

COUNT(*) from csoport tagok real c, csoportok cs where cs.tipus=1 and cember=$1 and cscsoport=ccsoport; if (tag1 > 0 ) AND ( tag2 = 0) -- diak tarthat szakkort then return true; else return false; end if; end; language plpgsql; create function diak e(text) returns boolean as declare tag smallint; begin select into tag COUNT(*) from csoport tagok real c, csoportok cs where cs.tipus=1 and cember=$1 and cscsoport=ccsoport; if tag > 0 then return true; else return false; end if; end; language plpgsql; -- csoport tag e(ember, csoport) create function csoport tag e(text, text) returns boolean as declare tag smallint; begin select into tag COUNT(*) from csoport tagok where csoport=$2 and ember=$1 and veg=null; if tag = 0 then return false; else return true; end if; end; language plpgsql; create function alcsoport tag e(text, text) returns boolean as declare tag smallint; begin select into tag COUNT(*) from alcsoportok where focsoport=$2 and mindenki=false and alcsoport in (select

csoport as alcsoport from - 43 - 6.14 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.14 csoport tagok where ember=$1 and veg=null); if tag = 0 then return false; else return true; end if; end; language plpgsql; create function csoport tagok insert() returns opaque as declare irasjog boolean; focsoport tag boolean; utkozo tag boolean; tag boolean; ember text; begin select into ember getpgusername(); -- Irasjog vizsgalat select into irasjog csoport tagok irasjog(ember, new.csoport); if irasjog = false then raise exception Nincs joga a csoportba embert felvenni.; end if; -- Focsoport tagsag select into focsoport tag focsoport tag e(new.ember, newcsoport); if focsoport tag = false then raise exception A felhasználó tagja kell hogy legyen a csoport valamelyik f" csoportjának.; end if; -- Utkozo csoport tagsag select into utkozo tag utkozo tag e(new.ember, newcsoport); if utkozo tag = true then raise exception A felhasználó már tagja egy

ütköz" csoportnak.; end if; -- Tagja-e mar a csoportnak select into tag csoport tag e(new.ember, newcsoport); if tag = true then raise exception A felhasználó már tagja a csoportnak.; end if; return new; end; language plpgsql; create function csoport tagok update() returns opaque as declare irasjog boolean; ember text; alcsoport tag boolean; begin select into ember getpgusername(); - 44 - Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.14 select into irasjog csoport tagok irasjog(ember, old.csoport); if irasjog = false then raise exception Nincs joga a csoport tagjait változtatni.; end if; if old.csoport != newcsoport or oldember != newember or old.kezdet != newkezdet then raise exception Csak ahhoz van joga, hogy a csoport tagság végét változtassa meg.; end if; select into alcsoport tag alcsoport tag e(old.ember, oldcsoport); if alcsoport tag = true then raise exception A felhasználó tagja a csoport valamelyik alcsoportjának,

így nem törölhetem ki.; end if; return new; end; language plpgsql; 6.15 foglalasplsql -- Tablak letrehozasa 6.151 geptipusok create table geptipusok ( geptipus varchar(32) not null primary key, szines boolean, processzor varchar(16), memoria smallint, hdd float4, allapot varchar(16), kiegeszitok varchar(32) ); grant select on geptipusok to public; 6.152 gepek create table gepek ( gep smallint not null primary key, geptipus varchar(32) not null references geptipusok(geptipus) ); 6.153 kitiltasok create table kitiltasok ( ember varchar(32) not null references emberek(ember), kezdet date not null, veg date, -- ha megöli a számtechtanárt, akkor ez null :-) ok varchar(100), belepes tilt boolean not null, internet tilt boolean not null, id serial not null primary key, check (belepes tilt = true or internet tilt = true) ); - 45 - Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.154 belepes tiltva e() create function belepes tiltva e(text) returns

boolean as declare kitiltva smallint; begin select into kitiltva COUNT(*) from kitiltasok where belepes tilt=true and ember=$1 and (veg=null or veg > now); if kitiltva != 0 then return true; else return false; end if; end; language plpgsql; 6.155 foglalasok create table foglalasok ( ember varchar(32) not null references emberek(ember), nap date not null, kezdet time not null, veg time not null, gep smallint not null references gepek(gep), check (veg > kezdet) ); grant select,insert,update,delete on foglalasok to public; 6.156 spec napok create table spec napok ( nap date not null primary key, tanitas smallint not null, -- azt adja meg, milyen orarend lesz aznap ok varchar(50) ); grant select on spec napok to public; -- a studiumokat egyszeruen taroljuk: tanitas tablaban, terem=szamtech 6.157 sztech szakkorok create table sztech szakkorok ( csoport varchar(20) not null references csoportok(csoport), nap smallint not null check (nap > 0 and nap < 8), kezdet time not null,

veg time not null ); grant select on sztech szakkorok to public; 6.158 szakkori gepek create table szakkori gepek ( csoport varchar(20) not null references csoportok(csoport), - 46 - 6.154 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok gep smallint not null references gepek(gep) ); grant select on szakkori gepek to public; 6.159 sztech felugyelet create table sztech felugyelet ( nap date not null, kezdet time not null, veg time not null, ember varchar(32) not null references emberek(ember) ); grant select on sztech felugyelet to public; -- TODO: felugyelo admin 6.1510 foglalas idok create table foglalas idok ( ember varchar(32) unique references emberek(ember), heti ido interval not null, osszes ido interval not null ); grant select on foglalas idok to public; create function utkozo foglalas e(time, time, time, time) returns boolean as begin if ($1 <= $3 and $2 <= $3) or ($1 >= $3 and $1 >= $4) then return false; else return true; end

if; end; language plpgsql; create function hetnap(date) returns float8 as select date part(dow, CAST($1 as date)); language sql; create function milyen nap(date) returns smallint as declare n smallint; begin select tanitas into n from spec napok where nap=$1; if not found then return hetnap($1); else return n; end if; end; language plpgsql; create function heti fogl ido(text, date) - 47 - 6.158 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok returns interval as declare hetfo date; vasarnap date; eddig heti interval; begin select CAST($2 AS DATE)-hetnap($2)+1 into hetfo; select CAST($2 AS DATE)-hetnap($2)+7 into vasarnap; select sum(CAST( CAST(veg AS TIME)-CAST(kezdet AS TIME) AS INTERVAL)) into eddig heti from foglalasok WHERE ember=$1 and nap>=hetfo and nap<=vasarnap; if eddig heti=null then eddig heti:= interval(0); end if; return eddig heti; end; language plpgsql; create function osszes fogl ido(text) returns interval as declare eddig

osszes interval; begin select sum(CAST( CAST(veg AS TIME)-CAST(kezdet AS TIME) AS INTERVAL)) into eddig osszes from foglalasok WHERE ember=$1 and nap>=now; if eddig osszes=null then eddig osszes:=interval(0); end if; return eddig osszes; end; language plpgsql; create function user foglalas ido(text, date) returns interval as declare heti interval; osszes interval; eddig osszes interval; eddig heti interval; maradek interval; begin select heti fogl ido($1, $2) into eddig heti; select osszes fogl ido($1) into eddig osszes; select heti ido into heti from foglalas idok where ember=$1; if found then select osszes ido into osszes from foglalas idok where ember=$1; else select heti ido into heti from foglalas idok where ember=null; select osszes ido into osszes from foglalas idok where ember=null; end if; select interval smaller(cast(cast(heti as interval)-cast(eddig heti as - 48 - 6.1510 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok interval) as

interval), cast(cast(osszes as interval)-cast(eddig osszes as interval) as interval)) into maradek; return maradek; end; language plpgsql; create function nyitvatartasban e(time, time, date) returns boolean as declare kezdes time; veg time; hetnap smallint; begin select milyen nap($3) into hetnap; select nyitas into kezdes from sztech nyitva where nap=hetnap; select zaras into veg from sztech nyitva where nap=hetnap; if $1>=kezdes and $2<=veg and $2>$1 then return true; else return false; end if; end; language plpgsql; create function foglalasok insert() returns opaque as declare utkozo foglalasok smallint; utkozo szakkorok smallint; kitiltva boolean; hetnap smallint; mar foglalt smallint; idotartam interval; foglido interval; emberke text; admin boolean; begin select into emberke getpgusername(); select into admin csoport tag e(emberke, foglalas admin); -- amit az admin sem ugorhat át select into utkozo foglalasok COUNT(*) from foglalasok where nap=new.nap and gep=newgep

and (select utkozo foglalas e(kezdet, veg, new.kezdet, newveg)) = true; if utkozo foglalasok != 0 then raise exception Ütköz" foglalást találtam!; end if; if admin=true then return new; end if; -- amit az admin átugorhat - 49 - 6.1510 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok select into kitiltva belepes tiltva e(new.ember); if kitiltva = true then raise exception Ki vagy tiltva.; end if; if nyitvatartasban e(new.kezdet, newveg, newnap) = false then raise exception A számtechterem nincs nyitva ilyenkor.; end if; if new.nap < now and csoport tag e(emberke, foglalas admin) = false then raise exception Ez a nap már elmúlt.; end if; if new.nap = now and csoport tag e(emberke, foglalas admin) = false and cast(new.kezdet - cast(now as time) as interval) < cast(1:00:00 as interval) then raise exception Addig nincs egy óra.; end if; select milyen nap(new.nap) into hetnap; select into utkozo szakkorok COUNT(*) from sztech szakkorok as

regi where nap=hetnap and utkozo foglalas e(kezdet, veg, new.kezdet, newveg) and csoport tag e(new.ember, csoport)=false and newgep in (select gep from szakkori gepek where csoport=regi.csoport); if utkozo szakkorok != 0 then raise exception Ütköz" szakkört találtam.; end if; select cast(cast(new.veg as interval)-cast(newkezdet as interval) as interval) into idotartam; select user foglalas ido(new.ember, newnap) into foglido; if idotartam > foglido then raise exception Túl sokat akarsz el" re foglalni.; end if; select into mar foglalt COUNT(*) from foglalasok where ember=new.ember and nap=new.nap and utkozo foglalas e(kezdet, veg, newkezdet, newveg); if mar foglalt != 0 then raise exception Már foglaltál gépet erre az id" pontra.; end if; if new.ember != emberke then raise exception Nem foglalhatsz gépet más nevében.; end if; return new; end; language plpgsql; create function foglalasok delete() returns opaque as declare emberke text; - 50 - 6.1510

Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok begin select into emberke getpgusername(); if csoport tag e(emberke, foglalas admin)=true then return old; end if; if old.ember != emberke then raise exception Nincs jogod más foglalását törölni.; end if; if old.nap <= now then raise exception Csak a jöv" beli foglalásokat törölheted.; end if; return old; end; language plpgsql; create trigger tr foglalasok insert before insert or update on foglalasok for each row execute procedure foglalasok insert(); create trigger tr foglalasok delete before delete on foglalasok for each row execute procedure foglalasok delete(); create table sztech nyitva ( nap smallint not null primary key, nyitas time not null, zaras time not null, check (nap>0 and nap<8) ); grant select on sztech nyitva to public; 6.16 iskolaeveksql 6.161 iskolaevek create table iskolaevek ( evkezd date not null, felev date not null, evveg date not null ); grant select on

iskolaevek to public; 6.17 jegyekplsql 6.171 jegyek real create table jegyek real ( diak varchar(32) not null references emberek(ember), tantargy varchar(20) not null references tantargyak(tantargy), datum date not null, jegy smallint not null, ok varchar(100), sulyozas float4 not null, id serial not null, check (jegy > 0 and jegy < 6) ); -- jegyek real táblára nincs joga senkinek - 51 - 6.1510 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok create function jegyek insert() returns opaque as declare tanit boolean; emberke text; begin select into emberke getpgusername(); select into tanit tanar diakja e(emberke, new.diak, newtantargy); if tanit = true or csoport tag e(emberke, jegy admin) = true then return new; else raise exception Nem tanítja ezt a diákot ebb" l a tantárgyból.; end if; end; language plpgsql; create function jegyek delete() returns opaque as declare tanit boolean; emberke text; begin select into emberke

getpgusername(); select into tanit tanar diakja e(emberke, old.diak, oldtantargy); if tanit = true or csoport tag e(emberke, jegy admin) = true then return old; else raise exception Nem tanítja ezt a diákot ebb" l a tantárgyból.; end if; end; language plpgsql; create trigger tr jegyek insert before insert or update on jegyek real for each row execute procedure jegyek insert(); create trigger tr jegyek delete before delete on jegyek real for each row execute procedure jegyek delete(); -- A diak jegyeit lathatjak: create function szulo e(text, text) returns boolean as declare szulo e smallint; begin select into szulo e COUNT(*) from szulok where gyerek=$2 and szulo=$1; if szulo e != 0 then return true; else return false; end if; end; language plpgsql; - 52 - 6.171 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.172 jegyek (view) create view jegyek as select * from jegyek real as jegy where diak=CAST(user as text) or szulo e(CAST(user as

text), CAST(diak as text)) = true or tanar diakja e(CAST(user as text), jegy.diak, jegytantargy) = true or osztalyfonok e(CAST(user as text), jegy.diak) = true or csoport tag e(getpgusername(), jegy admin) = true; grant select, insert, update, delete on jegyek to public; -- Na most jön a RULE. create rule "jegyek insert" as on insert to jegyek do instead insert into jegyek real values (NEW.diak, NEWtantargy, NEWdatum, NEWjegy, NEWok, NEW.sulyozas, nextval(jegyek real id seq)); create rule "jegyek delete" as on delete to jegyek do instead delete from jegyek real where id=OLD.id; create rule "jegyek update" as on update to jegyek do instead update jegyek real set diak=NEW.diak, tantargy=NEWtantargy, datum=NEWdatum, jegy=NEW.jegy, ok=NEWok, sulyozas=NEWsulyozas where id=OLDid; -- jegy atlag(diak,tantargy,ezután,eddig) create function jegy atlag(text, text, date, date) returns float4 as select sum(cast(jegy as float4)*sulyozas)/sum(sulyozas) from jegyek

where diak=cast($1 as text) and tantargy=cast($2 as text) and datum>=cast($3 as date) and datum<=cast($4 as date); language sql; 6.18 jelszavaksql -- az egésznek az a célja, hogy lehessen olyan (pl. diák) adminisztrátorokat -- létrehozni, akik a normál userek jelszavait meg tudják változtatni, -- de a jelszavakat nem tudják elolvasni (a pg shadow-ból), így titkos -- adatokhoz nem férhetnek hozzá nyom nélkül. -- Új dolog: emberek(vedett): ezeknek az usereknek csak egy superuser -- tudja megváltoztatni a jelszavát, ill. saját maguk 6.181 jelszavak (view) create view jelszavak as select usename, passwd from pg user where (user::text in (select ember from csoport tagok where csoport=jelszo admin) and usename::text not in (select ember from emberek where vedett=true)) or usename=user::text; -- ez a view azokat az usereket listázza ki, akiknek az user megváltoztathatja -- a jelszavát. A jelszavak helyén csillagokat ír ki (pg user) create function ujuser(name,

text) returns name as insert into pg shadow values ($1, nextval(seq usesysid), f, f, f, f, $2, null); select $1 where $1 in (select usename from pg shadow); language sql; - 53 - 6.172 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok create rule "jelszavak update" as on update to jelszavak do instead update pg shadow set passwd=new.passwd where usename=oldusename; grant select, update on jelszavak to public; --create rule "jelszavak insert" as on insert to jelszavak do instead -- select ujuser(new.usename, newpasswd) where -- csoport tag e(getpgusername(), ember admin)=true; 6.19 jogalapplsql -- jogalap.plsql: mivel a postgres groupos jogkezelése eléggé gyagya -- (pl. nem tudom, hogyan lehet lekérni, hogy egy user tagja-e egy -- csoportnak), + nálunk a csoport néhány más funkciót is tartalmaz -- (összevont csoportok stb.), a postgres jogkezelését triggerekkel -- helyettesítjük. Vigyázni kell, mert ha a jog()

függvény rossz, -- vagy valamelyik táblára elfelejtjük rátenni a triggert, annak -- beláthatatlan következményei lehetnek! 6.191 jogok create table jogok ( tabla name not null, csoport varchar(20) references csoportok(csoport), jog char(3) not null -- rövidítés: INSERT=I, UPDATE=U, DELETE=D ); grant select, insert, update, delete on jogok to public; -- Figyelem! A jogok táblát is le kell védeni a jog triggerrel! -- jelenleg csak megenged# funkciót tud, vagyis nem lehet azt megcsinálni, -- hogy egy csoportnak legyen vmihez joga, de egy alcsoportnak ne. create function jog() returns opaque as declare sorok integer; begin select into sorok count(*) from jogok where tabla=TG RELNAME and (csoport=null or csoport tag e(getpgusername(), csoport)=true) and jog like (%||substr(TG OP, 1, 1)||%); if sorok < 1 then raise exception Nincs jogod ebbe a táblába írni.; end if; if TG OP=DELETE then return old; else return new; end if; end; language plpgsql; 6.110 jogoksql --

jogok.sql: itt hozzuk létre az egyes táblákra a triggereket, itt adunk -- rájuk jogot. Azért is van különválasztva jogalapplsql-t # l, mert -- a jogok táblára is rátesszük a jog triggert, ezért el# bb kell kitöltenünk - 54 - 6.181 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok -- a tartalmát. -- a vendeg usernek ekkorra már léteznie kell grant select, update on jegyek real id seq to public; grant select, update on emberek mod id seq to public; -- enélkül is m $ ködik, mert nem használunk nextval-t. -- érdekes módon a ggt-n m $ ködik, a gimn-db-n nem, úgyhogy vissza. grant select, update on kitiltasok id seq to public; grant select, update, insert on emberek tmp to vendeg; grant select, insert on szulok tmp to vendeg; grant insert on passwd tmp to vendeg; grant select, insert on csoport tagok real tmp to vendeg; grant select,delete grant select,delete grant select,delete grant select,delete on emberek tmp to public; on

csoport tagok real tmp to public; on szulok tmp to public; on passwd tmp to public; grant insert on emberek mod to public; grant insert on szulok mod to public; grant select on csoport tagok real tmp to public; revoke all on naptar from vendeg; -- levlisták grant select, update, insert on user table to sympa; grant select, update, insert on subscriber table to sympa; -- ember admin (emberek, szulok, ember adatok real) grant select, insert, update, delete on emberek to public; create trigger jog before insert or update or delete on emberek for each row execute procedure jog(); grant select, insert, update, delete on szulok to public; create trigger jog before insert or update or delete on szulok for each row execute procedure jog(); create trigger jog before insert or update or delete on ember adatok real for each row execute procedure jog(); -- csoport admin grant select, insert, update, delete on csoportok to public; grant select, insert, update, delete on alcsoportok to public;

grant select, insert, update, delete on utkozo csoportok to public; grant select, insert, update, delete on csoportositasok to public; grant select, insert, update, delete on csoport tagok real to public; create trigger jog before insert or update or delete on csoportok for each row execute procedure jog(); create trigger jog before insert or update or delete on alcsoportok for each row execute procedure jog(); create trigger jog before insert or update or delete on utkozo csoportok for each row execute procedure jog(); create trigger jog before insert or update or delete on csoportositasok for each row execute procedure jog(); - 55 - 6.110 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok create trigger tr csoport tagok insert before insert on csoport tagok real for each row execute procedure csoport tagok insert(); create trigger tr csoport tagok update before update on csoport tagok real for each row execute procedure csoport tagok update(); --

kitiltasok grant select, insert, update, delete on kitiltasok to public; create trigger jog before insert or update or delete on kitiltasok for each row execute procedure jog(); -- kredit grant select, insert, delete, update on kredit to public; create trigger jog before insert or delete on kredit for each row execute procedure jog(); -- admin: tantargyak, termek, tanitas, geptipusok, gepek, spec napok, -- sztech szakkorok, szakkori gepek, sztech felugyelet grant select, insert, update, delete on tantargyak to public; create trigger jog before insert or update or delete on tantargyak for each row execute procedure jog(); grant select, insert, update, delete on termek to public; create trigger jog before insert or update or delete on termek for each row execute procedure jog(); grant select, insert, update, delete on tanitas to public; create trigger jog before insert or update or delete on tanitas for each row execute procedure jog(); grant select, insert, update, delete on geptipusok

to public; create trigger jog before insert or update or delete on geptipusok for each row execute procedure jog(); grant select, insert, update, delete on gepek to public; create trigger jog before insert or update or delete on gepek for each row execute procedure jog(); grant select, insert, update, delete on spec napok to public; create trigger jog before insert or update or delete on spec napok for each row execute procedure jog(); grant select, insert, update, delete on sztech szakkorok to public; create trigger jog before insert or update or delete on sztech szakkorok for each row execute procedure jog(); grant select, insert, update, delete on szakkori gepek to public; create trigger jog before insert or update or delete on szakkori gepek for each row execute procedure jog(); grant select, insert, update, delete on sztech felugyelet to public; create trigger jog before insert or update or delete on sztech felugyelet for each row execute procedure jog(); grant select, insert,

update, delete on sztech nyitva to public; create trigger jog before insert or update or delete on sztech nyitva for each row execute procedure jog(); grant select, insert, update, delete on iskolaevek to public; create trigger jog before insert or update or delete on iskolaevek for each row execute procedure jog(); grant select, insert, update, delete on csongetes to public; create trigger jog before insert or update or delete on csongetes for each row execute procedure jog(); -- JOGOK - 56 - 6.110 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok grant select, insert, update, delete on jogok to public; create trigger jog before insert or update or delete on jogok for each row execute procedure jog(); 6.111 kreditplsql create table kredit ( ember varchar(20) references emberek(ember), eszkoz varchar(20), kredit smallint default 0, primary key (ember, eszkoz) ); grant select on kredit to public; grant update on kredit to kredit; create function kredit

update() returns opaque as declare kredit admin boolean; begin select into kredit admin csoport tag e(getpgusername(), kredit admin); if (kredit admin=false or getpgusername()=kredit::text) and new.kredit > oldkredit then raise exception Csak a kredit adminisztrátor növelheti a kreditet.; end if; if old.ember != newember or oldeszkoz != neweszkoz then raise exception Csak a kreditmennyiséget változtathatja meg.; end if; if (kredit admin=false and getpgusername() != new.ember::text) then raise exception Csak a sajátját változtathatja meg.; end if; return new; end; language plpgsql; create trigger tr kredit update before update on kredit for each row execute procedure kredit update(); 6.112 naptarsql -- Tablak letrehozasa create table naptar ( ember varchar(32) not null references emberek(ember), -- aki beírta szoveg varchar(255) not null, -- a bejegyzés szövege mikor date, -- a bejegyzés dátuma mikorra date, -- melyik napra kiknek smallint -- kik lássák -- 1 csak

tanárok 2 diákok is 3 szül# k is ); grant select,insert,delete on naptar to public; - 57 - 6.110 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.113 orarendplsql drop function tanar orarend(text,integer); create function tanar orarend(text,integer) returns opaque as declare sor row; begin create table orarend as select distintct ora as hanyadik, null as h csop, null as h tant, null as h ter, null as k csop, null as k tant, null as k ter, null as s csop, null as s tant, null as s ter, null as c csop, null as c tant, null as c ter, null as p csop, null as p tant, null as p ter from tanitas; for s in select * from tanitas where tanar = quote literal($1) and (het = $2 OR het = null) loop if s.nap = 1 then update orarend set h csop=s.csoport,h tant=stantargy,h ter=sterem where hagyadik=s.ora; else if s.nap = 2 then update orarend set k csop=s.csoport,k tant=stantargy,k ter=sterem where hagyadik=s.ora; else if s.nap = 3 then update orarend set s

csop=s.csoport,s tant=stantargy,s ter=sterem where hagyadik=s.ora; else if s.nap = 4 then update orarend set c csop=s.csoport,c tant=stantargy,c ter=sterem where hagyadik=s.ora; else if s.nap = 5 then update orarend set p csop=s.csoport,p tant=stantargy,p ter=sterem where hagyadik=s.ora; end if;end if;end if;end if;end if; end loop; return select * from orarend order by hanyadik; end; language plpgsql; drop function t orarend(text,integer); create function t orarend(text,integer) returns pointer as declare begin return execute select * from tanitas order by tanar; - 58 - 6.113 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok end; language sql; 6.114 pamplsql create function bool to yn(boolean) returns char as begin if $1 = true then return y; else return n; end if; end; language plpgsql; create view oraja van as select distinct ember from csoport tagok where csoport = (select csoport from tanitas where terem=inf and nap = EXTRACT(DOW FROM now())

and ora in (select ora from csongetes where now() > kezd and now() < veg)); -- belépést szabályozó view create view pam login as select usename, case when usename::text in (select ember from csoport tagok where csoport=belephet and veg=null) and usename::text not in (select ember from kitiltasok where (veg=null or veg>=now()) and belepes tilt=t and ember::text not in (select * from oraja van) ) then n::char else y::char end as expired, n::char as newtok from pg user; GRANT SELECT ON pam login to vendeg; 6.115 regisql delete from pg shadow where usename <> postgres; -- a vacuum-ok azért kellenek, mert ha nagyon sokszor töröljük/újra -- létrehozzuk az adatbázist, nagyon lassú lesz pl. a pg shadow-ba írás -- (saját b# römön tapasztaltam). VACUUM pg aggregate; VACUUM pg am; VACUUM pg amop; VACUUM pg amproc; VACUUM pg attrdef; VACUUM pg attribute; - 59 - 6.113 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok VACUUM pg class;

VACUUM pg database; VACUUM pg description; VACUUM pg group; VACUUM pg index; VACUUM pg indexes; VACUUM pg inheritproc; VACUUM pg inherits; VACUUM pg ipl; VACUUM pg language; VACUUM pg listener; VACUUM pg opclass; VACUUM pg operator; VACUUM pg proc; VACUUM pg relcheck; VACUUM pg rewrite; VACUUM pg rules; VACUUM pg shadow; VACUUM pg statistic; VACUUM pg tables; VACUUM pg trigger; VACUUM pg type; VACUUM pg user; VACUUM pg views; 6.116 ropcsikplsql -- Koncepció: -- ----------- * A dolgozatokban több kérdéscsoport, ezekb% l a diák egyet kap -- kérdésnek -- * Egy kérdés lehet teszt vagy felelget% s. A felelget % snél nincs -- el% re megadott válasz, de lehet% ség van a beérkezett válaszokat -- reguláris kifejezésekkel automatikusan kijavítani. Ha a tanár -- ezt nem akarja, akkor végignézi az összes beérkezett választ, -- és mindegyiket pontozza (részpontokat is adhat) -- * ropcsik.elkezdodott: ekkor tudják meg a diákok, hogy van dolgozat, -- hogy mik a kérdések

(különben el% z % nap már tudhatnák) -- * ropcsik.vege: ekkor tudják meg a helyes válaszokat + eddig lehet -- beadni a válaszokat. -- megoldás rule-okkal: elég egyszer & , de nagyon sokat kell gépelni :-( -- egy probléma ezzel a megoldással: nem lehet references-t használni: view-ra -- ez nem megy, a real táblára pedig select jog kéne, márpedig pont ezt -- akartuk elkerülni. Ezért félmegoldás: a legtöbb táblába úgyis csak akkor -- lehet beszúrni, ha ez az én röpcsim, ez pedig ellen% rzi, hogy a röpcsi -- létezik-e. -- * ropcsik -- "fantomtábla" create table ropcsik real ( ropcsi varchar(20) not null primary key, nev varchar(50), - 60 - 6.115 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok csoport varchar(20) not null references csoportok(csoport), -- akivel a dolgozatot íratják tantargy varchar(20) not null references tantargyak(tantargy), datum date, -- amikor íratják elkezdodott boolean not null

default false, vege boolean not null default false, kijavitva boolean not null default false, ponthatar smallint[5] ); -- view tábla create view ropcsik as select * from ropcsik real where (elkezdodott=true and csoport in (select csoport from csoport tagok where ember=cast(user as text))) -- csak az az osztály láthatja, akivel a dolgozatot íratják or tanar csoportja e(cast(user as text), csoport, tantargy) or csoport tag e(cast(user as text), admin); create rule "ropcsik insert" as on insert to ropcsik do instead insert into ropcsik real values (new.ropcsi, newnev, newcsoport, new.tantargy, newdatum, newelkezdodott, newvege, newkijavitva, new.ponthatar); create rule "ropcsik update" as on update to ropcsik do instead update ropcsik real set nev=new.nev, csoport=newcsoport, tantargy=new.tantargy, datum=newdatum, elkezdodott=newelkezdodott, vege=new.vege, kijavitva=newkijavitva, ponthatar=newponthatar where ropcsik real.ropcsi=oldropcsi; create rule "ropcsik

delete" as on delete to ropcsik do instead delete from ropcsik real where ropcsik real.ropcsi=oldropcsi; grant select, insert, update, delete on ropcsik to public; create function ropcsim e(text) -- én vagyok-e a röpcsit írató tanár returns boolean as declare talalt smallint; begin select into talalt count(*) from ropcsik where ropcsi=$1 and tanar csoportja e(cast(user as text), csoport, tantargy); if talalt>0 or csoport tag e(cast(user as text), admin)=true then return true; else return false; end if; end; language plpgsql; create function ropcsik insert() returns opaque as begin if tanar csoportja e(cast(user as text), new.csoport, newtantargy) or csoport tag e(cast(user as text), admin) then return new; else raise exception Nem tanítja ezt a csoportot.; end if; end; language plpgsql; - 61 - 6.116 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok -- ropcsi insert abban különbözik a ropcsi insertt# l, hogy a ropcsik insertet -- csak

a ropcsik táblánál használjuk, ekkor ugyanis még nem lehet használni -- a ropcsim e függvényt create function ropcsi insert() returns opaque as begin if ropcsim e(new.ropcsi) then return new; else raise exception Nem tanítja ezt a csoportot.; end if; end; language plpgsql; create function ropcsi update() returns opaque as begin if ropcsim e(old.ropcsi) and ropcsim e(newropcsi) then return new; else raise exception Nincs joga változtatni ezt a röpdolgozatot.; end if; end; language plpgsql; create function ropcsi delete() returns opaque as begin if ropcsim e(old.ropcsi) then return old; else raise exception Nincs joga változtatni ezt a röpdolgozatot.; end if; end; language plpgsql; create trigger tr ropcsik insert before insert on ropcsik real for each row execute procedure ropcsik insert(); create trigger tr ropcsik update before update on ropcsik real for each row execute procedure ropcsi update(); create trigger tr ropcsik delete before delete on ropcsik real for each

row execute procedure ropcsi delete(); -- * kérdés csoportok create table ropcsi kerdcsop real ( ropcsi varchar(20) not null, kerdcsop smallint not null, pontszam smallint not null, primary key(ropcsi, kerdcsop) ); create view ropcsi kerdcsop as select * from ropcsi kerdcsop real where ropcsi in (select ropcsi from ropcsik); create rule "ropcsi kerdcsop insert" as on insert to ropcsi kerdcsop do instead insert into ropcsi kerdcsop real values (new.ropcsi, new.kerdcsop, newpontszam); - 62 - 6.116 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok create rule "ropcsi kerdcsop update" as on update to ropcsi kerdcsop do instead update ropcsi kerdcsop real set pontszam=new.pontszam where ropcsi=oldropcsi and kerdcsop=oldkerdcsop; create rule "ropcsi kerdcsop delete" as on delete to ropcsi kerdcsop do instead delete from ropcsi kerdcsop real where ropcsi=old.ropcsi and kerdcsop=old.kerdcsop; grant select, insert, update on

ropcsi kerdcsop to public; create trigger tr ropcsi kerdcsop insert before insert on ropcsi kerdcsop real for each row execute procedure ropcsi insert(); create trigger tr ropcsi kerdcsop update before update on ropcsi kerdcsop real for each row execute procedure ropcsi update(); create trigger tr ropcsi kerdcsop delete before delete on ropcsi kerdcsop real for each row execute procedure ropcsi delete(); -- * röpcsi kérdések create table ropcsi kerdesek real ( ropcsi varchar(20), kerdcsop smallint, kerdes smallint, tipus smallint not null, -- 1=teszt, 2=felelget# s jo valasz smallint, -- a ropcsi valaszok real(valasz)-ra hivatkozik jo valasz reg varchar(200), -- felelget# s dolgozatnál szoveg varchar(200) not null, primary key(ropcsi, kerdcsop, kerdes) ); -- valasz mutat függvény: azért kell, mert a ropcsi kerdesek view-ban -- nem használhatunk beágyazott select utasítást: ha innen kérdezünk -- a ropcsi kerdesek real-b# l, akkor kiírja, hogy Permission denied. create

function valasz mutat(text, text) returns text as begin if ropcsim e($2) or $2 in (select ropcsi from ropcsik where vege=true) then return $1; else return null; end if; end; language plpgsql; -- ropcsi kerdesek: a kérdéseket csak akkor mutatja, ha elkezd # dött -- a dolgozat, a jó válaszokat pedig csak a dolgozat után create view ropcsi kerdesek as select ropcsi, kerdcsop, kerdes, tipus, cast(valasz mutat(cast(jo valasz as text), ropcsi) as integer) as jo valasz, valasz mutat(jo valasz reg, ropcsi) as jo valasz reg, szoveg from ropcsi kerdesek real where ropcsi in (select ropcsi from ropcsik); -- vagyis elkezd# dött create rule "ropcsi kerdesek insert" as on insert to ropcsi kerdesek do instead insert into ropcsi kerdesek real values (new.ropcsi, new.kerdcsop, newkerdes, newtipus, newjo valasz, newjo valasz reg, new.szoveg); create rule "ropcsi kerdesek update" as on update to ropcsi kerdesek do instead update ropcsi kerdesek real set tipus=new.tipus, jo

valasz=new.jo valasz, jo valasz reg=newjo valasz reg, szoveg=newszoveg - 63 - 6.116 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok where ropcsi=old.ropcsi and kerdcsop=oldkerdcsop and kerdes=old.kerdes; create rule "ropcsi kerdesek delete" as on delete to ropcsi kerdesek do instead delete from ropcsi kerdesek real where ropcsi=old.ropcsi and kerdcsop=old.kerdcsop and kerdes=oldkerdes; grant select, insert, update, delete on ropcsi kerdesek to public; create trigger tr ropcsi kerdesek insert before insert on ropcsi kerdesek real for each row execute procedure ropcsi insert(); create trigger tr ropcsi kerdesek update before update on ropcsi kerdesek real for each row execute procedure ropcsi update(); create trigger tr ropcsi kerdesek delete before delete on ropcsi kerdesek real for each row execute procedure ropcsi delete(); -- * röpcsi teszt válaszok create table ropcsi valaszok real ( -- ha teszt jelleg a röpcsi ropcsi varchar(20),

kerdcsop smallint, kerdes smallint, valasz smallint, -- válasz száma szoveg varchar(200), -- a tesztben megadott válasz szövege primary key(ropcsi, kerdcsop, kerdes, valasz) ); create view ropcsi valaszok as select * from ropcsi valaszok real where ropcsi in (select ropcsi from ropcsik); create rule "ropcsi valaszok insert" as on insert to ropcsi valaszok do instead insert into ropcsi valaszok real values (new.ropcsi, newkerdcsop, new.kerdes, newvalasz, newszoveg); create rule "ropcsi valaszok update" as on update to ropcsi valaszok do instead update ropcsi valaszok real set szoveg=new.szoveg where ropcsi=oldropcsi and kerdcsop=oldkerdcsop and kerdes=old.kerdes and valasz=oldvalasz; create rule "ropcsi valaszok delete" as on delete to ropcsi valaszok do instead delete from ropcsi valaszok real where ropcsi=old.ropcsi and kerdcsop=old.kerdcsop and kerdes=oldkerdes and valasz=oldvalasz; grant select, insert, update, delete on ropcsi valaszok to public;

create trigger tr ropcsi valaszok insert before insert on ropcsi valaszok real for each row execute procedure ropcsi insert(); create trigger tr ropcsi valaszok update before update on ropcsi valaszok real for each row execute procedure ropcsi update(); create trigger tr ropcsi valaszok delete before delete on ropcsi valaszok real for each row execute procedure ropcsi delete(); -- * röpcsi diák válaszok create table ropcsi diak valaszok real ( -- amit a diák válaszolt diak varchar(32) not null references emberek(ember), ropcsi varchar(20), kerdcsop smallint, kerdes smallint, valasz smallint, -- tesztnél valasz szov varchar(200), -- felelget( s kérdésnél pontszam smallint, -- a tanár vagy a php szkript ide írja be az eredményt primary key(diak, ropcsi, kerdcsop) - 64 - 6.116 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok -- kerdes nincs benne a primary key-ben: a diák csak egy választ -- tudjon beadni egy kérdéscsoportra (magyarul ne

adhasson be több -- dolgozatot) ); create view ropcsi diak valaszok as select * from ropcsi diak valaszok real where diak=cast(user as text) or ropcsim e(ropcsi)=true; create rule "ropcsi diak valaszok insert" as on insert to ropcsi diak valaszok do instead insert into ropcsi diak valaszok real values (new.diak, newropcsi, new.kerdcsop, newkerdes, newvalasz, newvalasz szov, null); create rule "ropcsi diak valaszok update" as on update to ropcsi diak valaszok do instead update ropcsi diak valaszok real set pontszam=new.pontszam where diak=old.diak and ropcsi=oldropcsi and kerdcsop=oldkerdcsop and kerdes=old.kerdes; create rule "ropcsi diak valaszok delete" as on delete to ropcsi diak valaszok do instead delete from ropcsi diak valaszok real where diak=old.diak and ropcsi=oldropcsi and kerdcsop=oldkerdcsop and kerdes=old.kerdes; -- Diák jogai: insert és select. Tanár: select, delete, update -- update: dolgozatjavítás, csak a pontszámot változtathatja

-- delete: puskázás esetén -- Admin: insert is: adatok visszatöltése. grant select, insert, delete on ropcsi diak valaszok to public; create function ropcsi diak valaszok insert() returns opaque as declare admin boolean; begin if csoport tag e(cast(user as text), admin) then return new; -- az adatok visszatöltése end if; if new.diak != cast(user as text) then raise exception Nem írhatsz a táblába más nevében.; end if; if new.ropcsi in (select ropcsi from ropcsik where vege=true) then raise exception A dolgozatot már be kellett volna adni.; end if; -- csak a saját röpcsijét adhatja be: if new.ropcsi not in (select ropcsi from ropcsik) then raise exception Ez a röpcsi nem létezik vagy nem láthatja.; end if; return new; end; language plpgsql; create trigger tr ropcsi diak valaszok insert before insert on ropcsi diak valaszok real for each row execute procedure ropcsi diak valaszok insert(); create trigger tr ropcsi diak valaszok update before update on ropcsi diak

valaszok real for each row execute procedure ropcsi update(); create trigger tr ropcsi diak valaszok delete before delete on ropcsi diak valaszok real for each row execute procedure ropcsi delete(); - 65 - 6.116 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok 6.117 sequenceslst seq usesysid jegyek real id seq kitiltasok id seq 6.118 emberek mod id seqsympasql -- "gyári script" sympa dokumentációból -- PostgreSQL Database creation script -- CREATE DATABASE sympa; -- Connect to DB -- connect sympa DROP TABLE user table; CREATE TABLE user table ( email user varchar (100) NOT NULL, gecos user varchar (150), cookie delay user int4, password user varchar (40), lang user varchar (10), CONSTRAINT ind user PRIMARY KEY (email user) ); DROP TABLE subscriber table; CREATE TABLE subscriber table ( list subscriber varchar (50) NOT NULL, user subscriber varchar (100) NOT NULL, date subscriber datetime NOT NULL, update subscriber datetime, visibility

subscriber varchar (20), reception subscriber varchar (20), bounce subscriber varchar (30), comment subscriber varchar (150), CONSTRAINT ind subscriber PRIMARY KEY (list subscriber, user subscriber ) ); CREATE INDEX subscriber idx ON subscriber table (user subscriber,list subscriber); 6.119 tanitasplsql create table tantargyak ( tantargy varchar(20) not null primary key, nev varchar(30) not null, jelleg smallint ); grant select, update, insert on tantargyak to public; create table termek ( terem varchar(20) not null primary key, nev varchar(30) not null, ferohely smallint - 66 - 6.117 Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok ); grant select on termek to public; create table csongetes ( ora smallint not null, kezd time not null, veg time not null ); create table tanitas ( tanar varchar(32) not null references emberek(ember), csoport varchar(20) not null references csoportok(csoport), tantargy varchar(20) not null references

tantargyak(tantargy), nap smallint not null, ora smallint not null, het smallint, terem varchar(20) references termek(terem), check (nap>0 and nap<8) ); grant select on tanitas to public; create table ulesrend ( nap date, ora smallint, ember varchar(32) not null references emberek(ember), gep smallint ); grant select on ulesrend to public; -- tanar csoportja e(tanar, csoport, tantargy) create function tanar csoportja e(text, text, text) returns boolean as declare talalt smallint; begin select into talalt count(*) from tanitas where tanar=$1 and csoport=$2 and tantargy=$3; if talalt>0 then return true; else return false; end if; end; language plpgsql; -- tanar diakja e(tanar, diak, tantargy) create function tanar diakja e(text, text, text) returns boolean as declare talalt smallint; begin select into talalt count(*) from tanitas where tanar=$1 and tantargy=$3 and csoport in (select csoport from csoport tagok where ember=$2); if talalt>0 then return true; - 67 - 6.119

Az adatbázis program-részletei / Az adatbázis szerkezetét megadó kódok else return false; end if; end; language plpgsql; -- osztalyfonok e(tanar, diak) create function osztalyfonok e(text, text) returns boolean as declare talalt smallint; begin select into talalt count(*) from csoportok where vezeto=$1 and tipus=1 and csoport in (select csoport from csoport tagok where ember=$2); if talalt>0 then return true; else return false; end if; end; language plpgsql; 6.120 urlssql create table urls ( login varchar(20) references emberek(ember), url varchar(500), sites varchar(66), size int4, ip inet, date date, time time ); grant insert, select on urls to internet; 6.2 Az adatbázis felületét adó kódok 6.21 adminphp <?php if(!admin vagyok e()) { hiba("Erre az oldalra csak az adminisztrátorok léphetnek."); html veg(); exit; } ?> 6.22 adminokphp <?php include "alap.php"; require "belep.php"; html kezd("Adminisztrátorok"); - 68

- 6.119 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.22 menu("admin", "adminok",""); require "admin.php"; // Adatok beírása az adatbázisba if(isset($ember)) { if(isset($torol)) { query("update csoport tagok real set veg=now where csoport=$torol and ember=$ember;"); } if(isset($hozzaad)) { query("insert into csoport tagok real values ($hozzaad, $ember, now, null);"); } } cim("Adminisztrátorok"); tablazat kezd(2, array("Felhasználó", "Név"), "width=300"); sql link tablazat("select ember, nev from emberek where ember in (select ember from csoport tagok where veg=null and csoport in (select csoport from csoportok where tipus=2));", "ember", "adminok.php?"); form kezd("adminok.php"); tr kezd(); td spec("<input name=ember><input type=submit value="Új">", "colspan=2");

echo "</form>"; tr veg(); tablazat veg(); if(isset($ember)) { kiscim("$ember:"); sorki("Az alábbi táblázatban bejelölheted, hogy milyen adminisztrátori csoportoknak tagja $ember felhasználó."); tablazat kezd(3, array("Csoport", "Név", "M $ velet"), null); $res=query("select csoport, nev, csoport tag e($ember, csoport) from csoportok where tipus=2;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td($sor[1]); if($sor[2]==t) { td("<a href="adminok.php?ember=$ember&torol=$sor[0]">Töröl</a>"); } else { td("<a href="adminok.php?ember=$ember&hozzaad=$sor[0]">Hozzáad</a>"); } } tr veg(); tablazat veg(); } html veg(); ?> - 69 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.23 alapphp <? session start(); // Új folyamatot índítunk vele vagy a

meglévöt folytatjuk. $debug=1; //Konstansok //Kérem írjon a . define ("ERTESIT", "csm@piar.hu címre Csanády Miklós piaristának"); //Melyik cim kap éretesítést a szül# i kérelmekr# l define("SZULOADMIN","csm@piar.hu"); define("DISABLE","0"); /* Magyarító stringek / $honapok=array("január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"); $napok=array("hétf# ", "kedd", "szerda", "csütörtök", "péntek", "szombat", "vasárnap"); /* Alap SQL eljárások / function belep($user, $pass) { // Itt nincs hibakezelés, ezért a require "belep.php";-t kell használni $conn=pg connect("dbname=piardb user=$user password=$pass");

return $conn; } function query($sql) { global $conn, $debug; $ret=pg exec($conn, $sql); if(!$ret && $debug) { hiba("Hiba a kérésben: ".$sql); } return $ret; } function vansora($res) { if($res) { if(pg numrows($res) > 0 ) { return true; } } return false; } function sql get val($sql) { $res=query($sql); if(vansora($res)) { $val=pg fetch row($res, 0); } else - 70 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok { $val[0]=; } return $val[0]; } function csoport tag vagyok e($csoport) { global $sessuser; $res=query("select csoport tag e(getpgusername(), $csoport);"); $sor=pg fetch row($res, 0); if($sor[0]==t) { return true; } return false; } function admin vagyok e() { global $sessuser; $res=query("select * from csoportok where tipus=2 and csoport in ( select csoport from csoport tagok where ember=$sessuser and veg=null);"); if(pg numrows($res)) { return true; } return false; } /* HTML elemek / function html

kezd spec($title, $spec) { echo "<html><head><title>$title</title></head>"; echo " <style> <!-DIV.menu { color: white; font-family:Helvetica, Arial; font-size: 11pt; font-weight:bold } A.menu { text-decoration: none; color: white } TD.menu { text-align: center } --> </style>"; echo "<body bgcolor=white $spec>"; // Html fejléc. } function html kezd($title) { - 71 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok html kezd spec($title, null); } function html veg() { global $sessuser; echo "<hr><center>Próbaüzem. Az adatok feltöltése folyamatban"; echo "<br> Ha hibát talál kérem írjon a ".ERTESIT; echo ".<br>Az adatbázis rendszert a php szakkör " "tagjai készítették." "<br> Aktuális user a <b>$sessuser</b>." "<br><a

href="login.php?uj=1">Bejelentkezés más néven</a>" " <a href=privacy.php>Adatvédelmi nyilatkozat</a>"; echo "</body></html>"; } function hiba($szoveg) { echo "<p><img src="img/hiba.gif"><b>Hiba!</b> $szoveg</p>"; } function info($szoveg) { echo "<p><img src="img/info.gif">$szoveg</p>"; } function html link($nev, $url) { echo "<p><center><a href="$url">$nev</a></center></p>"; } function cim($szoveg) { echo "<center><h1>$szoveg</h1></center>"; } function kiscim($text) { echo "<h2>$text</h2> "; } function h3($text) { echo "<h3>$text</h3> "; } function alcim($text) { echo "<center><h2>$text</h2></center> "; } function balra($url) { echo "<a

href="$url"><img border=0 src="img/balra.gif" alt="&lt;&lt;"></a> "; } function jobbra($url) - 72 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok { echo "<a href="$url"><img border=0 src="img/jobbra.gif" alt=">>"></a> "; } function vissza($url) { echo "<p><center><a href="$url"><img border=0 src="img/vissza.gif" alt="&lt;&lt; Vissza"></a></center></p> "; } // ----------------- Formok -----------------function form kezd($action) { echo "<form method=post action="$action">"; } function mehet() { echo "<input type=image src="img/submit.gif" border=0></form> "; } function submit($text) { echo "<input type=submit value="$text"></form> "; } function

gomb($szoveg, $url) { echo "[<a href="$url">$szoveg</a>] "; } function form veg() { echo "<p><center>"; mehet(); echo "</center></p>"; } function hidden tag($name, $val) { echo "<input type=hidden name="$name" value="$val"> "; } /* Táblázatok / function result tablazat($res, $name, $kovetkezo form) { $sorok=pg numrows($res); $oszlopok=pg numfields($res); if(!$sorok) { return; } for($i=0; $i<$sorok; $i++) { - 73 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok $sor=pg fetch row($res, $i); tr kezd(); if($name) { td("<a href="$kovetkezo form$name=$sor[0]">$sor[0]</a></td> "); $jkezd=1; } else { $jkezd=0; } for($j=$jkezd; $j<$oszlopok; $j++) { td("$sor[$j]"); } tr veg(); } } function sql link tablazat($lekerdezes, $name, $kovetkezo form) { /* $kovetkezo form-nak nem elég

"x.php", "xphp?"-t vagy "x.php?a=b&c=d&"-t kell írni */ $res=query($lekerdezes); result tablazat($res, $name, $kovetkezo form); } function sorki($text) { echo "<p>$text</p> "; } function th($text, $modosito) { echo "<th bgcolor=#000099 $modosito><font color=white>$text</font></th>"; } function tbl fejlec kezd() { echo "<tr bgcolor=#000099> "; } function tbl fejlec veg() { echo "</tr> "; } $tbl sorszin=0; function tr kezd() { global $tbl sorszin; echo "<tr bgcolor="; if($tbl sorszin) { echo "#dddddd> "; $tbl sorszin=0; } else { echo "#eeeeee> "; - 74 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok $tbl sorszin=1; } } function tr veg() { echo "</tr> "; } function td($szoveg) { echo "<td>$szoveg</td> "; } function td kezd() { echo

"<td>"; } function td veg() { echo "</td>"; } function td spec($szoveg, $modosito) { echo "<td $modosito>$szoveg</td> "; } function tbl kezd($oszlopok, $modosito) { echo "<table cols=$oszlopok $modosito align=center> "; } function tbl kezd balra($oszlopok, $modosito) { echo "<table cols=$oszlopok $modosito align=left> "; } function tablazat kezd($oszlopok, $fejlec, $modosito) { tbl kezd($oszlopok, $modosito); tbl fejlec kezd(); for($i=0; $i<$oszlopok; $i++) { th($fejlec[$i], null); } tbl fejlec veg(); } function tablazat kezd balra($oszlopok, $fejlec, $modosito) { tbl kezd balra($oszlopok, $modosito); tbl fejlec kezd(); for($i=0; $i<$oszlopok; $i++) { th($fejlec[$i], null); } - 75 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok tbl fejlec veg(); } function tablazat veg() { echo "</table> "; } /* Stringkonvertálások / function

sqlstr2($text) /* az sql kérésekben használatos / { if($text) { return "$text"; } return "null"; } function sqlstr($text) { return sqlstr2($text).", "; } function kelle str($text, $vizsgalat) { if($vizsgalat) { return $text; } else return null; } function check str($vizsgalat, $igen, $nem) { if($vizsgalat) { return $igen; } return $nem; } function time to array($ido) { $tomb=explode(:, $ido); settype($tomb[0], integer); settype($tomb[1], integer); return $tomb; } function array to perc($ido) { return $ido[0]*60+$ido[1]; } function date to text($datum) { global $honapok; $datumtomb=explode(-, $datum); if(!$datum) { return "-"; - 76 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok } return "$datumtomb[0]."$honapok[$datumtomb[1]-1]" $datumtomb[2]"; } function pgbool to text($bool) { if($bool==t) { return "igen"; } return "nem"; } function find in array($tomb, $elem) { //

visszaadja, hogy a megadott elem hanyadik eleme a tmbnek for($i=0; $tomb[$i] != $elem and $tomb[$i]; $i++); if($elem!=$tomb[$i]) { // nem talalta meg return -1; } return $i; } include "menu.php"; ?> 6.24 arazphp <?php define("MIN AR",4); define("SZOR AR",1); define("INGY AR",2.5); include "alap.php"; require "belep.php"; require "ertesit.php"; function lefedett($fnev) { list($x,$y,$type)=getimagesize($fnev); if($type==1) $im = imagecreatefromjpeg($fnev); elseif($type==2) $im = imagecreatefromjpeg($fnev); elseif($type==3) $im = imagecreatefrompng($fnev); $i=0;$j=0; $fedett=0; echo "($x x $y)"; for($i=0;$i<$x;$i++) for($j=0;$j<$y;$j++) { $szin=ImageColorAt($im,$i,$j); $szinek = imagecolorsforindex($im, $szin); $r=$szinek["red"]; $g=$szinek["green"]; $b=$szinek["blue"]; - 77 - 6.23 Az adatbázis program-részletei / Az adatbázis felületét adó kódok $fedett

+= $r+$g+$b; // echo "RGB=$r-$g-$b"; }; $szazalek=100 - $fedett*100/($x$y765); //Imagejpeg($im); ImageDestroy($im); return($szazalek); } if (!function exists("array search")) { function array search ($needle, $haystack, $strict = FALSE) { foreach($haystack as $key => $value) { if ($strict) { if ($value === $needle) return $key; } else { if ($value == $needle) return $key; } } return FALSE; } } Header("Content-type: image/png"); //html kezd("Felrakott fájljaid"); //menu("nyomtat", "lista", 1); $le = `cat $txt`; if(!$le) { $le=lefedett($kep); exec("echo $le > $txt"); } //$forint=sprintf("%0.3f",abs(10*$le-4)+3); $forint=intval(sprintf("%0.3f",$le * SZOR AR)-INGY AR); if($forint <MIN AR ) { $forint = MIN AR; } $egyp=$ii+1; $y=20; $x=40; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 200, 200, 200); $vilagosszin

= ImageColorAllocate ($im, 240, 240, 240); $sotetszin = ImageColorAllocate ($im, 15, 15, 15); $fekete = ImageColorAllocate ($im, 0, 0, 0); $feher = ImageColorAllocate ($im, 255,255,200); $text color = ImageColorAllocate ($im, 233, 14, 91); $lea=substr($le,0,6); $forinta=sprintf("%0.3f",$forint); ImageString ($im, 1, 1, 1, "$lea%", $fekete); - 78 - 6.24 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.24 ImageString ($im, 1, 1, 10, "$forinta"."Ft", $fekete); imageline($im,0,0,0,$y-2,$vilagosszin); imageline($im,0,0,$x-2,0,$vilagosszin); imageline($im,$x-1,$y-1,$x-1,1,$sotetszin); imageline($im,$x-1,$y-1,1,$y-1,$sotetszin); ImagePng ($im); ?> 6.25 authphp <? function authenticate() { Header("WWW-Authenticate: Basic realm="PiarDB felhasználó/jelszó:""); Header("HTTP/1.0 401 Unauthorized"); } ?> 6.26 belepphp <? /* Ez egy belépésre használt programrészlet

hibakezeléssel. Egy föscript-b) l kell require-olni */ if(!$sessuser) { session register("sessuser"); session register("sesspass"); $sessuser="vendeg"; $sesspass="piar"; } $conn=belep($sessuser, $sesspass); if(!$conn) { html kezd("Bejelentkezési hiba"); menu("cimlap","cimlap",2); # $ip=getenv ("REMOTE ADDR"); # $parancs="nmap -I ". $ip; # $honnan=`$parancs`; # $parancs="finger @".$ip; # $honnan .= `$parancs`; # mail("abuse@$SERVER NAME","FAIL:$sessuser","FAIL:$sessuser from " . # $ip. # " at ".strftime("%D %T",time())" $honnan"); # $string=`netstat -p tcp --numeric-hosts 2>/dev/null 1|grep https|awk {print $5}|grep $ip|grep -v https`; # $hostport1=explode(" ",$string); hiba("Nem tudok belépni az adatbázisba! Rossz a jelszó?"); html link("Újra próbálom", "login.php?ujra=1");

html veg(); exit; - 79 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok } ?> 6.27 chpassphp <?php include "alap.php"; require "belep.php"; html kezd("Jelszóváltoztatás"); menu("cimlap", "chpass",""); if($sessuser=="vendeg") { /* elég gyatra védelem, mert psql-b) l úgyis meg tudja változtatni alter userrel :( */ hiba("A vendég felhasználó nem változtathatja meg a jelszavát."); html veg(); exit; } form kezd($PHP SELF); tablazat kezd(2, array("Adat", "Érték"), "width=300"); tr kezd(); td("Felhasználó:"); if(csoport tag vagyok e("jelszo admin")) { td("<input name=ember value="$sessuser">"); } else { td("<input type=hidden name=ember value="$sessuser">$sessuser"); } tr veg(); tr kezd(); td("Régi jelszó:"); td("<input name=oldpasswd

type=password>"); tr veg(); tr kezd(); td("Új Jelszó:"); td("<input name=passwd type=password>"); tr veg(); tr kezd(); td("Jelszó még egyszer:"); td("<input name=repasswd type=password>"); tr veg(); tablazat veg(); if(isset($passwd)) { if( !(csoport tag vagyok e("jelszo admin")) || $ember==$sessuser) { if($oldpasswd != $sesspass) { hiba("Hibás a régi jelszó!"); form veg(); html veg(); exit(); } } if($repasswd != $passwd) { hiba("Nem egyezik a két jelszó."); } else { - 80 - 6.26 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.27 $res=query("select * from jelszavak where usename=$ember;"); if(vansora($res)) { $res=query("update jelszavak set passwd=$passwd where usename=$ember;"); if($res) { info("A jelszót megváltoztattam."); $sesspass=$passwd; } else { hiba("Nem sikerült megváltoztatni a jelszót."); } } else {

hiba("Nem változtathatod meg $ember jelszavát."); } } } form veg(); html veg(); ?> 6.28 cimlapphp <?php include "alap.php"; html kezd("Piarista Adatbázis"); menu("cimlap", "cimlap",""); ?> <img align=right src=https://ggt.piarhu/~csm/forgalomphp> <center><h1>Üdvözöllek a Piarista Adatbázis oldalán!</h1></center> <b>Új felhasználó regisztrálásához</b> "vendeg" névvel és "piar" jelszóval tudsz belépni. <?php html veg(); ?> 6.29 confirmphp <?php include "alap.php"; require "belep.php"; html kezd("Új felhasználók felvétele"); menu("admin", "confirm",2); require "admin.php"; if($torol) { $torolmail=sql get val("select email from emberek tmp where ember=$torol;"); if($torolmail) { mail("$torolmail","regisztracios kerelem elutasitva",

"Sajnos a Piarista Gimnázium adatbázisába való felvételét". " elutasítottuk."); } } - 81 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok //########### jóváhagyott diák ############ if(($felvesz)and($diak)) { $ujpass=sql get val("select passwd from passwd tmp where ember=$felvesz;"); $res=query("INSERT INTO pg shadow VALUES (".sqlstr($felvesz) "nextval(seq usesysid),". " f, f, f, f, ".sqlstr($ujpass)"NULL);"); if(!$res) { hiba("A felhasználó hozzáadása sikertelen"); } else { query("begin;"); $res=query("select nev,szuletes,cim,mobil,diakig,". "telotth,telmh,email,uid,gid,email,shell ". "from emberek tmp where ember=$felvesz"); $ret=pg fetch row($res,0); $res2=query("insert into emberek (ember, nev, email) values (". sqlstr($felvesz).sqlstr($ret[0]) sqlstr2($ret[7]).");"); if(!$res2) { hiba("A

felhasználó adatainak felvétele sikertelen"); query("rollback;"); } else { $email=$ret[7]; $res2=query("insert into ember adatok real (ember,szuletes,". "cim,mobil,diakig,telotth,telmh)". " values (". sqlstr($felvesz).//login sqlstr($ret[1]). //szuletes sqlstr($ret[2]). //cim sqlstr($ret[3]). //mobil sqlstr($ret[4]). //diakig sqlstr($ret[5]). //telotth sqlstr2($ret[6]).");"); query("commit;"); if($email) { mail("$email","regisztracios ertesites", "A Piarista Gimnázium adatbázisába való felvételét". " elfogadtuk. $felvesz néven léphet be"); } $res=query("select csoport,kezdet,veg ". " from csoport tagok real tmp". " where ember=$felvesz;"); $nr=pg numrows($res); for($i=0;$i<$nr;++$i) { $ret=pg fetch row($res,$i); query("insert into csoport tagok real ". - 82 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét

adó kódok "(csoport, ember,kezdet,veg) ". "values(". sqlstr($ret[0]). //csoport sqlstr($felvesz).//ember sqlstr($ret[1]). //kezdet sqlstr2($ret[2]). //veg ");"); } sorki("User [$felvesz] létrehozva "); query("delete from passwd tmp where ember=$felvesz"); query("delete from csoport tagok real tmp where ember=$felvesz"); query("delete from emberek tmp where ember=$felvesz"); } } } ///////////// jóváhagyott szül) felvétele ///////////////////// if(($felvesz)and($szulo)) { $ujpass=sql get val("select passwd from passwd tmp where ember=$felvesz;"); $res=query("INSERT INTO pg shadow VALUES (".sqlstr($felvesz) "nextval(seq usesysid),". " f, f, f, f, ".sqlstr($ujpass)"NULL);"); if(!$res) { hiba("A felhasználó hozzáadása sikertelen"); } else { query("begin;"); $res=query("select nev,szuletes,cim,mobil,diakig,".

"telotth,telmh,email,uid,gid,email,shell ". "from emberek tmp where ember=$felvesz"); $ret=pg fetch row($res,0); $res2=query("insert into emberek (ember, nev, email) values (". sqlstr($felvesz).sqlstr($ret[0]) sqlstr2($ret[7]).");"); if(!$res2) { hiba("A felhasználó adatainak felvétele sikertelen"); query("rollback;"); } else { $email=$ret[7]; $res2=query("insert into ember adatok real (ember,szuletes,". "cim,mobil,diakig,telotth,telmh)". " values (". sqlstr($felvesz).//login sqlstr($ret[1]). //szuletes sqlstr($ret[2]). //cim sqlstr($ret[3]). //mobil sqlstr($ret[4]). //diakig sqlstr($ret[5]). //telotth sqlstr2($ret[6]).");"); query("commit;"); - 83 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok $res=query("select gyerek ". " from szulok tmp". " where szulo=$felvesz;"); $nr=pg numrows($res);

for($i=0;$i<$nr;++$i) { $ret=pg fetch row($res,$i); query("insert into szulok ". "(gyerek,szulo) ". "values(". sqlstr($ret[0]). //gyerek sqlstr2($felvesz).//szulo ");"); } sorki("User [$felvesz] létrehozva "); if($email) { mail("$email","regisztracios ertesites", "A Piarista Gimnázium adatbázisába való felvételét". " elfogadtuk. $felvesz néven léphet be"); }; query("delete from passwd tmp where ember=$felvesz;"); query("delete from szulok tmp where szulo=$felvesz;"); query("delete from emberek tmp where ember=$felvesz;"); } } } //########### töröljük a kijelöltet ################ if(($torol)and($diak)) { query("delete from passwd tmp where ember=$torol"); query("delete from csoport tagok real tmp where ember=$torol"); query("delete from emberek tmp where ember=$torol"); } if(($torol)and($szulo)) { query("delete from

passwd tmp where ember=$torol"); query("delete from szulok tmp where szulo=$torol"); query("delete from emberek tmp where ember=$torol"); } ////////// felveend) diákok listája //////////////////////// sorki("Diákok"); $res=query("select distinct e.ember, enev,eszuletes," "e.cim,emobil,ediakig,etelotth,etelmh" " from emberek tmp e,csoport tagok real tmp c,csoportok cs " ."where cstipus=1 and cscsoport=ccsoport and cember=eember; "); if(vansora($res)) { tablazat kezd(3, array("login","adatai","csoportjai"), null); $nr=pg numrows($res); for($i=0; $i<$nr; $i++) { $ret=pg fetch row($res,$i); - 84 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok tr kezd();td($ret[0] ." <a href=confirmphp?felvesz="$ret[0]"&diak=1>felvesz</a>" ." <a

href=confirmphp?torol="$ret[0]"&diak=1>töröl</a>"); echo "<td>"; tablazat kezd(2,array("",""),""); tr kezd();td("neve");td($ret[1]);tr veg(); tr kezd();td("születés");td($ret[2]);tr veg(); tr kezd();td("címe");td($ret[3]);tr veg(); tr kezd();td("mobil");td($ret[4]);tr veg(); tr kezd();td("diákig");td($ret[5]);tr veg(); tr kezd();td("telotth");td($ret[6]);tr veg(); tr kezd();td("telmh");td($ret[7]);tr veg(); tablazat veg(); echo "</td>"; $parancs="select csoport,kezdet from csoport tagok real tmp ". "where ember=".$ret[0]" ;"; $res2=query($parancs); echo "<td>"; tablazat kezd(2, array("","",""), null); result tablazat($res2, null, null); tablazat veg(); echo "</td>"; tr veg(); } tablazat veg(); } ////////////////// felvételre váró

szül) k sorki("Szül) k"); $res=query("select distinct e.ember, enev,eszuletes," "e.cim,emobil,ediakig,etelotth,etelmh,e2nev" " from emberek tmp e,szulok tmp s,emberek e2 " ."where sszulo=eember and sgyerek=e2ember; "); if(vansora($res)) { tablazat kezd(3, array("login","adatai","csoportjai"), null); $nr=pg numrows($res); for($i=0; $i<$nr; $i++) { $ret=pg fetch row($res,$i); tr kezd();td($ret[0] ." <a href=confirmphp?felvesz="$ret[0]"&szulo=1>felvesz</a>" ." <a href=confirmphp?torol="$ret[0]"&szulo=1>töröl</a>"); echo "<td>"; tablazat kezd(2,array("",""),""); tr kezd();td("neve");td($ret[1]);tr veg(); tr kezd();td("születés");td($ret[2]);tr veg(); tr kezd();td("címe");td($ret[3]);tr veg(); tr kezd();td("mobil");td($ret[4]);tr veg(); tr

kezd();td("diákig");td($ret[5]);tr veg(); tr kezd();td("telotth");td($ret[6]);tr veg(); tr kezd();td("telmh");td($ret[7]);tr veg(); tr kezd();td("gyereke");td($ret[8]);tr veg(); tablazat veg(); echo "</td>"; tr veg(); - 85 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok } tablazat veg(); html veg(); exit; } ////////////// Újabb gyerek felvétele if($ujgyerek AND $ujszulo) { if (query("insert into szulok (gyerek,szulo) values($ujgyerek,$ujszulo);")) { sorki("Felvettük a $ujszulo $ujgyerek gyerekét"); query("delete from szulok mod where szulo=$ujszulo and gyerek=$ujgyerek;"); } else { sorki("Nem sikerült a $ujszulo $ujgyerek gyerekét felvenni."); } } //////// Újabb gyermek felvételének elutasítása if($gyerektorol and $ujszulo) { if(query("delete from szulok mod ". "where szulo=$ujszulo and gyerek=$gyerektorol;")) {

sorki("Újabb gyerek felvételi kérelmét elutasítottuk ". "($gyerektorol,$ujszulo)"); } } ///////////// Újabb gyerekét regisztrálná valaki sorki("Újabb gyerekek"); $res=query("select es.nev,esember,egnev, egember,eg2nev,eg2ember from szulok sz,szulok mod s,emberek es,emberek eg,emberek eg2 where es.ember=szszulo and eg2.ember=szgyerek and egember=sgyerek and sszulo=szszulo"); if(vansora($res)) { tablazat kezd(3, array("Szül) ","Új gyerek","Régi gyerek"), null); $nr=pg numrows($res); for($i=0; $i<$nr; $i++) { $ret=pg fetch row($res,$i); tr kezd();td($ret[0]."("$ret[1]") gyereke "$ret[3] ." <a href=confirmphp?ujgyerek="$ret[3]"&ujszulo="$ret[1]">felvesz</a>" ." <a href=confirmphp?gyerektorol="$ret[3]"&ujszulo="$ret[1]">töröl</a>"); td($ret[2]." ("$ret[3]")");

td($ret[4]." ("$ret[5]")"); tr veg(); } tablazat veg(); html veg(); exit; } //////////// adatmódosítási kérelmet elvetettük if(isset($modelvet)) { if(query("delete from emberek mod where ember=$modelvet and id=$id;")) - 86 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok { sorki("$modelvet módosítási kérelmét elutasítottuk."); if($modemail=sql get val("select email from emberek mod ". "where ember=$modelvet and id=$id;")) { mail($email, "Adatmodositasi kerelem elutasitasa", "Adatmódosítási kérelmét elutasítottuk."); } } else { sorki("$modelvet ($id) kérelmének törlésénél hiba lépett fel."); } } //########### módosítjuk a jóváhagyottakat ############ if(($modosit)and($id)) { query("begin;"); $res=query("select nev,szuletes,cim,mobil,". "diakig,telotth,telmh,email,uid,gid,email,shell ". "from emberek

mod where ember=$modosit and id=$id"); $ret=pg fetch row($res,0); $res2=query("update emberek set". " nev=".sqlstr($ret[0]) " email=".sqlstr2($ret[7]) " where ember=".sqlstr2($modosit)";"); if(!$res2) { hiba("A felhasználó adatainak felvétele sikertelen"); query("rollback;"); } else { $email=$ret[7]; $res2=query("update ember adatok real ". " set ". " szuletes=".sqlstr($ret[1]) //szuletes " cim=".sqlstr($ret[2]) //cim " mobil=".sqlstr($ret[3]) //mobil " diakig=".sqlstr($ret[4]) //diakig " telotth=".sqlstr($ret[5]) //telotth " telmh=".sqlstr2($ret[6]) " where ember=".sqlstr2($modosit)";"); query("commit;"); if($email) { mail("$email","adatmodositas elfogadva", "A Piarista Gimnázium adatbázisában". " adatait kérelmére módosítottuk."); } } sorki("User

[$modosit] modositva "); query("delete from emberek mod where ember=$modosit and id=$id;"); } - 87 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok /////////// Adatmódosítási kérelmek listája sorki("Adatmódosítás"); $res=query("select distinct m.ember,mnev,enev,mszuletes,aszuletes,mcim," "a.cim,mmobil,amobil,mdiakig,adiakig,mtelotth,atelotth,mtelmh," " a.telmh, mid,memail,eemail from emberek mod m," "ember adatok a,emberek e " ."where member=aember and member=eember; "); if(vansora($res)) { tablazat kezd(3, array("login","adatai"), null); $nr=pg numrows($res); for($i=0; $i<$nr; $i++) { $ret=pg fetch row($res,$i); tr kezd();td($ret[0]."("$ret[15]")" ." <a href=confirmphp?modosit="$ret[0]"&id="$ret[15]">módosít</a>" ." <a

href=confirmphp?modelvet="$ret[0]"&id="$ret[15]">töröl</a>"); echo "<td>"; tablazat kezd(3,array("",""),""); tr kezd();td("neve");td($ret[2]);td($ret[1]);tr veg(); tr kezd();td("születés");td($ret[4]);td($ret[3]);tr veg(); tr kezd();td("címe");td($ret[6]);td($ret[5]);tr veg(); tr kezd();td("mobil");td($ret[8]);td($ret[7]);tr veg(); tr kezd();td("diákig");td($ret[10]);td($ret[9]);tr veg(); tr kezd();td("telotth");td($ret[12]);td($ret[11]);tr veg(); tr kezd();td("telmh");td($ret[14]);td($ret[13]);tr veg(); tr kezd();td("email");td($ret[17]);td($ret[16]);tr veg(); tablazat veg(); echo "</td>"; tr veg(); } tablazat veg(); form veg(); } ///// arca nem tetszett if($arctorles) { unlink("tmparcok/$arctorles"); sorki("Az $arctorles arc törölve."); $reszek=explode(.,$arctorles);

if($email=sql get val("select email from emberek where ember=".$reszek[0]";")) { mail($email,"Adatbázis arcod", "Adatbázisba küldött arcképed nem nyerte el tetszésünk, és nem került fel. " "Jobbat keress."); sorki("levél a $email cimre ment"); } } ///////////////// Újabb képek /////////////////////// sorki("Új arcok"); if($lista=`ls tmparcok/`) /*/ { $fajlok=explode(" ",$lista); tablazat kezd(2,array("Régi (törlés)","Új (parancs)"),""); - 88 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok for($i=0;$i<sizeof($fajlok)-1;$i++) { tr kezd(); $reszek=explode(.,$fajlok[$i]); $neve=sql get val("select nev from emberek where ember=".$reszek[0]";"); if(file exists("arcok/".$fajlok[$i])) { td("<img src=arcok/".$fajlok[$i]" width=200><br>" "<a href=$PHP

SELF?arctorles=".$fajlok[$i]">Ez jobb</a><br>$neve"); } else { td("<img src=arcok/monkey.gif width=200><br>" "<a href=$PHP SELF?arctorles=".$fajlok[$i]">Ez jobb</a><br>$neve"); } td("<img src=tmparcok/".$fajlok[$i]" widht=200> <br>" "cp /tmp arcok/".$fajlok[$i] " /arcok/".$fajlok[$i]); tr veg(); sorki($fajlok[$i]); } tablazat veg(); // } html veg(); ?> 6.210 csoport tagokphp <?php include "alap.php"; require "belep.php"; html kezd("Felhasználó felvétele egy csoportba"); menu("admin", "csoport tagok",""); // Adatok beírása az adatbázisba if(isset($torol)) { $res=query("update csoport tagok real set veg=now where csoport=$csoport and ember=$torol and veg=null"); if(!$res) { hiba("Nem sikerült törölni a felhasználót $torol csoportból."); } }

if(isset($ember)) { query("insert into csoport tagok real values ($csoport, $ember, now, null);"); } // Csoportok listája if(csoport tag vagyok e("csoport admin")) { $res=query("select csoport, nev from csoportok order by csoport;"); } else { $res=query("select csoport, nev from csoportok where vezeto=$sessuser order by csoport;"); - 89 - 6.29 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.210 } if(!pg numrows($res)) { sorki("Te nem változtathatod egy csoport tagjait sem."); html veg(); exit; } kiscim("Csoport:"); tablazat kezd(2, array("Csoport", "Név"), "width=300"); result tablazat($res, "csoport", "csoport tagok.php?"); tablazat veg(); // Tagok if(isset($csoport)) { kiscim("$csoport csoport tagjai:"); sorki("Megjegyzés: ha a felhasználó tagja a csoport egy alcsoportjának, akkor nem lehet innen törölni.");

sorki("select distinct emberek.ember, nev, kezdet from csoport tagok, emberek where csoport=$csoport and veg=null and csoport tagok.ember=emberekember order by ember;"); tablazat kezd(4, array("Felhasználó", "Név", "Mikortól", "Változtatás"), null); $res=query("select distinct emberek.ember, nev, kezdet from csoport tagok, emberek where csoport=$csoport and veg=null and csoport tagok.ember=emberekember order by ember;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td($sor[1]); td(date to text($sor[2])); $alcsoport res=query("select alcsoport tag e($sor[0], $csoport);"); $alcsoport tag=pg fetch row($alcsoport res, 0); if($alcsoport tag[0]==f) { td("<a href="csoport tagok.php?csoport=$csoport&torol=$sor[0]">Töröl</a>"); } else { td("Töröl"); } tr veg(); } tr kezd(); form kezd("csoport tagok.php"); hidden

tag("csoport", $csoport); td("Új felhasználó:"); td spec("<input name=ember>", "colspan=2"); td("<input type=submit value="Felvesz">"); echo "</form>"; tablazat veg(); } vissza("menu.php"); html veg(); ?> - 90 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.211 csoportokphp <?php include "alap.php"; if(isset($csoport)) { html kezd("$csoport csoport"); } else { html kezd("Csoportok"); } menu("admin", "csoportok",""); require "belep.php"; require "admin.php"; if(!isset($csoport) and !isset($ujcsoport)) { tablazat kezd(3, array("Csoport", "Név", "Vezet) "), "width=400"); sql link tablazat("select csoport, nev, vezeto from csoportok order by csoport;", "csoport", "csoportok.php?"); tr kezd(); form

kezd($PHP SELF); td("Új csoport:"); td("<input name=ujcsoport>"); echo "<td>"; form veg(); echo "</td> "; tr veg(); tablazat veg(); html veg(); exit; } // ----------- Az adatok beírása az adatbázisba ----------if(isset($uj)) { query("insert into csoportok values (".sqlstr($csoport)sqlstr($nev) sqlstr($vezeto).sqlstr2($tipus) .");"); } else if(isset($nev)) { query("update csoportok set nev=".sqlstr($nev)"vezeto=" sqlstr($vezeto)."tipus="sqlstr2($tipus) ." where csoport=$csoport"); } if(isset($uj focsoport)) { if($mindenki) { $m="t"; } else { $m="f"; } query("insert into alcsoportok values (".sqlstr($focsoport) sqlstr($csoport)."$m);"); } if(isset($focsoport torol)) { query("delete from alcsoportok where alcsoport=$csoport and focsoport=".sqlstr2($focsoport)";"); } if(isset($uj csoportositas)) {

query("insert into utkozo csoportok values($csoport,$csoportositas);"); } - 91 - 6.211 Az adatbázis program-részletei / Az adatbázis felületét adó kódok if(isset($csoportositas torol)) { query("delete from utkozo csoportok where csoport=$csoport and csoportositas=$csoportositas;"); } // ------------------- A csoport f) adatai ----------------if(isset($ujcsoport)) { $csoport=$ujcsoport; } form kezd("csoportok.php"); if(isset($ujcsoport)) { hidden tag("uj", 1); } hidden tag("csoport", $csoport); // Táblázat fejléc tbl kezd(2, "width=300"); tbl fejlec kezd(); th("$csoport", "colspan=2"); tbl fejlec veg(); // Táblázat $res=query("select nev, vezeto, tipus from csoportok where csoport=$csoport;"); if(pg numrows($res)) { $adatok=pg fetch array($res, 0); } tr kezd(); td("Név:"); td("<input name=nev value="".$adatok["nev"]"">"); tr

veg(); tr kezd(); td("Vezet) :"); td("<input name=vezeto value="".$adatok["vezeto"]"">"); tr veg(); tr kezd(); td("Típus:"); echo "<td><select name=tipus> "; echo "<option value=0 ".kelle str("selected",$adatok["tipus"]==0)">Normál "; echo "<option value=1 ".kelle str("selected",$adatok["tipus"]==1)">Osztály "; echo "<option value=2 ".kelle str("selected",$adatok["tipus"]==2)">Adminisztrátor "; echo "</select></td> "; tr veg(); tablazat veg(); form veg(); // ------------------ F ) csoportok -------------------form kezd("csoportok.php"); if(!isset($ujcsoport)) { kiscim("Jelentkezés a csoportba:"); sorki("Az alábbi táblázatban azt állíthatod be, hogy a csoportba mely csoportokból jelentkezhetnek. Ha a

Mindenki tag-ot bejelölöd, akkor automatikusan tag lesz a bal oldalon lév) csoport összes tagja. Ha a csoport mez) t üresen hagyod, akkor bárki jelentkezhet a csoportba."); tablazat kezd(3, array("Csoport", "Mindenki tag", "Változtatás"), null); $res=query("select focsoport, mindenki from alcsoportok where alcsoport=$csoport;"); - 92 - 6.211 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.211 for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); if($sor[1]==t) { td("Igen"); } else { td("Nem"); } td("<a href="csoportok.php?csoport=$csoport&focsoport=$sor[0]&focsoport torol=1">Töröl</a>"); tr veg(); } hidden tag("csoport", $csoport); hidden tag("uj focsoport", 1); tr kezd(); td("<input name=focsoport>"); td("<input type=checkbox name=mindenki>");

td("<input type=submit value="Új">"); tr veg(); tablazat veg(); echo "</form>"; } // ------------------- Ütköz) csoportok ---------------------if(!isset($ujcsoport)) { kiscim("Ütköz) csoportok"); sorki("A csoportok csoportosításokba sorolhatók, ami azt jelenti, hogy ha egy felhasználó tagja a csoportosításba tartozó csoportok egyikének, akkor a csoportosításba tartozó többi csoportnak nem lehet tagja. Az alábbi táblázatban azt állíthatod be, hogy $csoport csoport mely csoportosításokba tartozik."); tablazat kezd(2, array("Csoportosítás", "Változtatás"), "width=300"); $res=query("select nev, csoportositasok.csoportositas from utkozo csoportok, csoportositasok where csoport=$csoport and csoportositasok.csoportositas=utkozo csoportokcsoportositas;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td("<a

href="csoportok.php?csoport=$csoport&csoportositas=$sor[1]&csoportositas torol=1">Töröl</a>"); tr veg(); } tr kezd(); $res=query("select nev, csoportositas from csoportositasok where csoportositas not in (select csoportositas from utkozo csoportok where csoport=$csoport);"); form kezd("csoportok.php"); hidden tag("uj csoportositas", 1); hidden tag("csoport", "$csoport"); echo "<td><select name=csoportositas> "; for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); - 93 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok echo "<option value="$sor[1]">$sor[0] "; } echo "</select></td> "; td("<input type=submit value="Új"></form>"); tr veg(); tr kezd(); td spec("<a href=csoportositasok.php>Csoportosítás létrehozása</a>",

"colspan=2 align=center"); tablazat veg(); } vissza("csoportok.php"); html veg(); ?> 6.212 csoportositasokphp <?php include "alap.php"; require "belep.php"; html kezd("Csoportosítások"); menu("admin", "csoportok",""); require "admin.php"; // Adatok beírása az adatbázisba if(isset($torol)) { query("delete from csoportositasok where csoportositas=$torol;"); } if(isset($csoportositas)) { if($kotelezo) { $k="t"; } else { $k="f"; } query("insert into csoportositasok values ($csoportositas, " .sqlstr($nev)"$k);"); } $res=query("select * from csoportositasok order by csoportositas;"); tablazat kezd(4, array("Csoportosítás", "Név", "Kötelez) ", "Változtatás"), null); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch array($res, $i); tr kezd(); td($sor["csoportositas"]);

td($sor["nev"]); if($sor["kotelezo"]==t) { td("Igen"); } else { td("Nem"); } td("<a href="csoportositasok.php?torol="$sor["csoportositas"] "">Töröl</a>"); - 94 - 6.211 Az adatbázis program-részletei / Az adatbázis felületét adó kódok } tr kezd(); form kezd("csoportositasok.php"); td("<input name=csoportositas>"); td("<input name=nev>"); td("<input type=checkbox name=kotelezo>"); td("<input type=submit value="Új"></form>"); tr veg(); tablazat veg(); sorki("Megjegyzés: a Kötelez) mez ) azt jelenti, hogy ha egy felhasználónak lehet) sége van a csoportosítás egyik csoportjában lenni, akkor kötelez ) -e valamelyik csoportban lennie. Pl ha egy diák egy osztály tagja, akkor kötelez) valamelyik idegen nyelvet választania."); vissza("csoportok.php"); html veg(); ?>

6.213 dataeditphp <?php include "alap.php"; require "belep.php"; include "login function.php"; function diak e($pofa) {//ha valamelyik osztálynak tagja return ( vansora ( query ( "select * from csoport tagok ct,csoportok c ". "where ct.ember=$pofa " "and ct.csoport=ccsoport " "and c.tipus = 1;"))); }; function varakoz uzenet() { sorki("Adatmósítási kérelmét megkaptuk.<br>"); sorki("Most meg kell várnia, míg kérelmét jóváhagyjuk."); } function ertesit uzenet($email,$ember) { if($email) { sorki("Err) l a megadott ($email) címen fog értesítést kapni."); } else { sorki("Mivel nem adott meg email címet, így adatmódosítási kérelmér) l". " nem tudunk". " értesítést küldeni.<br> Néhány nap mulva ellen ) rizze," " hogy elvégeztük-e a módosítást."); } } html kezd("Adatok módosítása");

menu("dataedit","dataedit",""); if($sessuser == "vendeg") { - 95 - 6.212 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.213 sorki("A vendég felhasználó adatait nem lehet így módosítani."); vissza("cimlap.php"); html veg(); exit; } sorki("A jelszót azonnal meg tudja változtatni." "<br>Az adatok módosítását itt lehet kezdeményezni, de az". " adminisztrátoroknak kell jóváhagyni."); sorki("<ul>"); sorki("<li><a href=#passwd>jelszó</a> "); sorki("<li><a href=#nev>adatok</a> "); sorki("<li><a href=#gyerek>újabb gyermek regisztrálása</a> "); sorki("</ul>"); /////////////chpasswd.php-ból echo "<a name=passwd>"; alcim("A jelszó megváltoztatása"); form kezd($PHP SELF); tablazat kezd(2,

array("Adat", "Érték"), "width=300"); tr kezd(); td("Felhasználó:"); td("<input type=hidden name=ember value="$sessuser">$sessuser"); tr veg(); tr kezd(); td("Régi jelszó:"); td("<input name=oldpasswd type=password>"); tr veg(); tr kezd(); td("Új Jelszó:"); td("<input name=passwd type=password>"); tr veg(); tr kezd(); td("Jelszó még egyszer:"); td("<input name=repasswd type=password>"); tr veg(); tablazat veg(); if(isset($passwd)) { if($oldpasswd != $sesspass) { hiba("Hibás a régi jelszó!"); form veg(); html veg(); exit(); } if($repasswd != $passwd) { hiba("Nem egyezik a két jelszó."); } else { $res=query("select * from jelszavak where usename=$sessuser;"); if(vansora($res)) { $res=query("update jelszavak set passwd=$passwd where usename=$sessuser;"); if($res) { info("A jelszót

megváltoztattam."); } else { hiba("Nem sikerült megváltoztatni a jelszót."); } } - 96 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok else { hiba("Nem változtathatod meg $sessuser jelszavát."); } } } form veg(); ////////////////////////////////////////// /////////////adatok echo "<a name=nev>"; alcim("A név és jelszó"); form kezd($PHP SELF); $res=query("select nev,email from emberek where ember=$sessuser;"); $ret=pg fetch row($res,0); tablazat kezd(2, array("Adat", "Korábban regisztrált érték"), "width=300"); tr kezd(); td("Felhasználó:"); td("<input type=hidden name=ember value="$sessuser">$sessuser"); tr veg(); tr kezd(); td("Név:"); td("<input name=ujnev value="".$ret[0]"">");tr veg(); tr kezd(); td("E-mail:");td("<input name=ujemail

value="".$ret[1]"">"); tr veg(); $res=query("select * from ember adatok where ember=$sessuser;"); $ret=pg fetch row($res,0); tr kezd(); td("Születési id* :"); td("<input name=ujszul value="".$ret[1]"">");tr veg(); tr kezd(); td("Cím:"); td("<input name=ujcim value="".$ret[2]"">");tr veg(); tr kezd(); td("Mobil:"); td("<input name=ujmobil value="".$ret[3]"">");tr veg(); tr kezd(); td("Diákig.száma::"); td("<input name=ujdiakig value=""$ret[4]"">");tr veg(); tr kezd(); td("Otthoni telefon:"); td("<input name=ujtelotth value="".$ret[5]"">");tr veg(); tr kezd(); td("Munkahelyi telefon:"); td("<input name=ujtelmh value="".$ret[6]"">");tr veg(); tablazat veg(); form veg();

if(isset($ujnev)) { if($ujszul) { $res=query("insert into emberek mod". " (ember,email,nev,szuletes,cim,mobil,diakig,telotth,telmh)". " values($sessuser,$ujemail,$ujnev,$ujszul,$ujcim,". "$ujmobil,$ujdiakig,$ujtelotth,$ujtelmh)"); } else { $res=query("insert into emberek mod". " (ember,email,nev,cim,mobil,diakig,telotth,telmh)". " values($sessuser,$ujemail,$ujnev,$ujcim,". "$ujmobil,$ujdiakig,$ujtelotth,$ujtelmh)"); } if($res) { varakoz uzenet(); } else { - 97 - 6.213 Az adatbázis program-részletei / Az adatbázis felületét adó kódok sorki("Hiba lépett fel az adatmódosítási kérelemnél."); } } /////////////ujgyerek echo "<a name=gyerek>"; alcim("A szül* itt regisztrálhatja második vagy többedik gyermekét"); if(vansora($res=query("select e.nev from szulok s,emberek e " " where szulo=$sessuser ". "and e.ember=sgyerek order by

nev;"))) { $diakneve=""; for($i=0;$i<pg numrows($res);$i++) { $ret=pg fetch row($res,$i); if($diakneve) {$diakneve .= ", "$ret[0];} else {$diakneve = $ret[0];} } form kezd($PHP SELF); $ret=pg fetch row($res,0); tablazat kezd(2, array("Adat", "Korábban regisztrált érték"), "width=300"); tr kezd(); td("Felhasználó:"); td("<input type=hidden name=ember value="$sessuser">$sessuser"); tr veg(); tr kezd(); td("Eddig regisztált gyermeke(i):"); td($diakneve);tr veg(); tr kezd(); td("Most regisztrálandó gyermeke"); $res=query("select e.ember, enev from emberek e,csoportok c,csoport tagok ct where tipus=1 and c.csoport = ctcsoport and ct.ember=eember order by nev;"); $cstr="<select size=5 name=ujgyerek> "; for($i=0;$i<pg numrows($res);$i++) { $ret=pg fetch row($res,$i); $cstr .= "<option value="$ret[0]">"$ret[1]"

"; } $cstr .= "</select>"; td($cstr); tr veg(); tablazat veg(); form veg(); } else { sorki("Ön nem szül* ként regisztrálta magát."); } if(isset($ujgyerek)) { if(query("insert into szulok mod (szulo,gyerek)". " values ($sessuser,$ujgyerek);")) { sorki("Újabb gyermekének regisztrálása az adminisztrátorok jóváhagyására vár."); - 98 - 6.213 Az adatbázis program-részletei / Az adatbázis felületét adó kódok } else {sorki("Újabb gyermek regisztrálásakor hiba lépett fel.");} } /////////////// ARC if($ujarc) { $kepadat=GetImageSize($ujarc); if($kepadat[2] != 2) { sorki("A feltöltött fájl nem jpeg kép!!!!"); } else { sorki("A feltöltött kép mérete:".$kepadat[0]"x"$kepadat[1]" pixel"); if(($kepadat[0] >=100)and ($kepadat[0] < 800)) { if(copy($ujarc,"tmparcok/$sessuser.jpeg")) { sorki("sikeresen feltöltött képed:"); echo

"<a href=tmparcok/$sessuser.jpeg>" "<img src=tmparcok/$sessuser.jpeg width=100></a>"; sorki("Már csak az adminisztrátorok jóváhagyására kell várnod."); } else { sorki("gond volt a $ujarc file feltöltésénél"); } } else { sorki("A feltöltött fájl mérete nem megfelel* ."); } } } alcim("Tárolt arckép"); tablazat kezd(2,array("Megnevezés","Adat"),""); tr kezd();td("Jelenleg tárolt arcképed:"); if(file exists("arcok/$sessuser.jpeg")) { td("<center><a href=arcok/$sessuser.jpeg>" "<img src=arcok/$sessuser.jpeg width=100 align=center border=0></a></center>"); } else { if(diak e($sessuser)) { td("<center><img src=arcok/monkey.gif align=center></center>"); } else { td("Nincs tárolt kép."); } } tr veg();tr kezd();td("Az új arcképedet tartalmazó

fájl." "<BR><b>JPEG fájl jó csak, amely legalább ". - 99 - 6.213 Az adatbázis program-részletei / Az adatbázis felületét adó kódok "100 x 100 pixel méret + , ". " és az arcképedet tartalmazza."); td("<FORM ENCTYPE="multipart/form-data" ACTION="$PHP SELF" METHOD=POST>". "<INPUT TYPE="hidden" name="MAX FILE SIZE" value="500000">". "<INPUT NAME="ujarc" TYPE="file" accept="image/jpeg">"); tr veg(); tablazat veg(); form veg(); html veg(); ?> 6.214 docphp <? include "alap.php"; function konyv tartalom($konyv) { include "doc/$konyv.php"; /* Ez azért van, mert nem tudom automatikusan a $konyv.php-ben lév, összes változót global-lal beolvasni */ echo "<ol type="I"> "; for($i=0; ($kresz=$tartalom[$i]); $i++) // kresz=könyv rész, nem KRESZ ;-) {

echo "<li><a href="doc.php?konyv=$konyv&resz=$kresz[1]"> " "$kresz[0]</a><br> $kresz[2]</li> "; resz tartalom($konyv, $kresz[1]); } echo "</ol> "; } function resz tartalom($konyv, $resz) { include "doc/$konyv.php"; $fejezetek var=$resz." resz"; $fejezetek=$$fejezetek var; if($fejezetek) { echo "<ol> "; for($i=0; $fejezetek[$i]; $i+=2) { echo "<li><a href="doc.php?konyv=$konyv&resz=$resz#"$fejezetek[$i+1]"">$fejezetek[$i]</a></li> "; } echo "</ol> "; } } if(!$konyv) { hiba("Nem kaptam argumentumot."); html veg(); exit; } include "doc/$konyv.php"; - 100 - 6.213 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.214 // HTML elemek function doc link($konyv, $resz, $fejezet, $text) { if($resz) { echo "<a

href="doc.php?konyv=$konyv&resz=$resz#fejezet">$text</a>"; } else { echo "<a href="doc.php?konyv=$konyv">$text</a>"; } } function doc img($img) { global $konyvdir; echo "<img src="$konyvdir/$img">"; } function doc img spec($img, $mod) { global $konyvdir; echo "<img src="$konyvdir/$img" $mod>"; } function fej($szoveg, $nev) { global $fejezetszam; echo "<a name="$nev"> "; kiscim(++$fejezetszam." $szoveg"); } // F* program if(!$resz) { html kezd($konyvcim); menu($menu resz[0], $menu resz[1],""); cim($konyvcim); echo $konyvleiras; kiscim("Tartalom:"); konyv tartalom($konyv); } else { for($i=0; ($kresz=$tartalom[$i]); $i++) { if($kresz[1]==$resz) { $cim=$kresz[0]; break; } } html kezd($cim); menu($menu resz[0], $menu resz[1],""); // Navigálógombok echo "<p><center>";

if(($elozo=$tartalom[$i-1])) { echo "<a href="doc.php?konyv=$konyv&resz=$elozo[1]">&lt;&lt; El* z </a> | "; } echo "<a href="doc.php?konyv=$konyv">Tartalom</a> "; if(($kov=$tartalom[$i+1])) { - 101 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.214 echo "| <a href="doc.php?konyv=$konyv&resz=$kov[1]">Következ* >></a> "; } echo "</center></p> "; cim($cim); kiscim("Tartalom:"); resz tartalom($konyv, $resz); // Szöveg kiírása if(isset($cim)) { include "$konyvdir/$kresz[1].php"; } } html veg(); ?> 6.215 ertesitphp <?php function emailkuld($ember, $tema, $uzenet) { $email=sql get val("select email from emberek where ember=$ember;"); if(!$email) { $email="$ember@email.piarhu"; } $fejlec="From: Értesít* script <piardb@piar.hu> "; mail($email, $tema,

$uzenet, $fejlec); } function smskuld($ember, $uzenet) { /* ez még nincs meg :-( / } function jegy ertesit($diak, $tantargy, $jegy, $ok) { global $sessuser; $tanarnev=sql get val("select nev from emberek where ember=$sessuser;"); $res2=query("select email from emberek where ember=$sor[1];"); $dnev=sql get val("select nev from emberek where ember=$diak;"); $ttargy=sql get val("select nev from tantargyak where tantargy=$tantargy;"); $tema="Új osztályzat."; $diakkezd="Kedves $dnev! $tanarnev az alábbi jegyet írta be: "; $szulokezd="Kedves szül* ! $tanarnev az alábbi jegyet írta be $dnev tanulónak:"; $uzenet="Tantárgy: $ttargy "; $uzenet.="Osztályzat: $jegy "; $uzenet.="Ok: $ok"; // diák emailkuld($diak, $tema, $diakkezd.$uzenet); smskuld($diak, $diakkezd.$uzenet); // szül* k - 102 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok

$res=query("select szulo from szulok where gyerek=$diak;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); emailkuld($sor[0], $tema, $szulokezd.$uzenet); smskuld($sor[0], $szulokezd.$uzenet); } } ?> 6.216 fphp <?php include "alap.php"; require "belep.php"; //Header("Content-type: image/gif"); echo $ip; $string="1";//implode($argv," "); $im = imagecreatefromgif("p.gif"); $orange = ImageColorAllocate($im, 0, 0, 0); $px=($w-strlen($login)*5)/2; $tol=ido2szam($tol); $ig=ido2szam($ig); $string=$login; $szeles=$w; $dstim=imagecreate($szeles,10); imagecopyresized($dstim, $im, 0, 0, 0, 0, $szeles, 10, 30, 10); $orange = ImageColorAllocate($dstim, 0, 0, 0); ImageString($dstim,1,$px,0,$string,$orange); ImageGif($dstim); ImageDestroy($dstim); ?> 6.217 foglalkiirphp <?php define("SZ",11); define("X",640); define("Y",470); define("O",2);//oszlopok

száma include "alap.php";//vigyázat: helyi másolat require "/var/www/ssl/db/belep.php"; //Tanárok, és a szakkört tartó diákok is!! function szinek($im,$r,$g,$b) { $k=intval(SZ/2); for($i=0;$i<$k;$i++) { $szins[$i]=imagecolorallocate($im, ($i+1)*$r/($k+1), ($i+1)*$g/($k+1), ($i+1)*$b/($k+1) ); $szins[SZ-$i-1]=imagecolorallocate($im, - 103 - 6.215 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.217 255-($i+1)*(255-$r)/($k+1), 255-($i+1)*(255-$g)/($k+1), 255-($i+1)*(255-$b)/($k+1) ); } $szins[$k]=imagecolorallocate($im,$r,$g,$b); return $szins; } function lapra ($im,$font,$xkozep,$ytop,$string,$colors,$betuszin) { $szeles=intval(SZ/2)*2+2+imagefontwidth($font)strlen($string); $magas=intval(SZ/2)*2+2+imagefontheight($font); imagerectangleb($im,$xkozep-$szeles/2,$ytop,$xkozep+$szeles/2,$ytop+$magas,$colors); imagestring($im,$font,$xkozep-$szeles/2+intval(SZ/2)+1,$ytop+intval(SZ/2)+1,$string,$betuszin); return $magas; }

function tanit e($pofa) { return(vansora(query("select * from tanitas where tanar=$pofa;"))); }; function imagerectanglef($im,$xa,$yf,$xv,$yl,$szurke) { if($yf > $yl){$tmp=$yl;$yl=$yf;$yf=$tmp;}; for ($i=$yf;$i<=$yl;$i++) { imageline($im,$xa,$i,$xv,$i,$szurke); } } function imagerectangleb($im,$xa,$yf,$xv,$yl,$szurke) { global $fekete; if($yf > $yl){$tmp=$yl;$yl=$yf;$yf=$tmp;}; for ($i=$yf;$i<=$yl;$i++) { imageline($im,$xa,$i,$xv,$i,$szurke[intval(SZ/2)]); } for($k=0;$k<intval(SZ/2);$k++) { //vizszintes, világos imageline($im,$xa+$k,$yf+$k,$xv-1-$k,$yf+$k,$szurke[SZ-1-$k]); //függüleges, világos imageline($im,$xv-$k,$yf+$k,$xv-$k,$yl-$k,$szurke[$k]); //függ* leges sotét imageline($im,$xa+$k,$yf+$k,$xa+$k,$yl-$k,$szurke[SZ-1-$k]); //vizszintes sötét imageline($im,$xa+$k,$yl-$k,$xv-1-$k,$yl-$k,$szurke[$k]); }; } function vege($im) { Header("Content-type: image/jpeg"); imagejpeg($im); imagedestroy($im); } function diak e($pofa) - 104 - Az

adatbázis program-részletei / Az adatbázis felületét adó kódok {//ha valamelyik osztálynak tagja return ( vansora ( query ( "select * from csoport tagok ct,csoportok c ". "where ct.ember=$pofa " "and ct.csoport=ccsoport " "and c.tipus = 1;"))); }; if(!isset($ho)) { $ev=strftime("%Y"); $ho=strftime("%m"); $nap=strftime("%d"); } if($ho and !$nap) { $nap=1; } if(!checkdate($ho, $nap, $ev)) { $nap=1; } $top=0; $x=X;$y=Y; $font=5; $fh=imagefontheight($font); $fw=imagefontwidth($font); $im=imagecreate($x,$y); $hatter=szinek($im,0,50,0); for ($i=0;$i<O;$i++) { imagerectangleb($im,$i*$x/O,0,($i+1)$x/O,$y,$hatter); } $feher=imagecolorallocate($im,255,255,255); $vilagos=imagecolorallocate($im,200,200,200); $piros=szinek($im,160,50,50); $kek=szinek($im,200,255,200); $metal=szinek($im,50,50,50); $sarga=szinek($im,175,175,0); $s=imagecolorallocate($im,255,255,170); $szurke=imagecolorallocate($im,127,127,127);

$fekete=imagecolorallocate($im,0,0,0); imagerectangle($im,0,0,$x,$y,$feher); // El* ször is megtudjuk, milyen nap van ma $most=mktime(0, 0, 0, $ho, $nap, $ev); $hetnap=strftime("%u", $most); $irni="$ev. "$honapok[$ho-1]" $nap ("$napok[$hetnap-1]")"; //imagestring($im,$font,$x/2 -$fw*strlen($irni)/2,0,$irni,$s); $top += lapra ($im,$font,$x/2,0,$irni,$kek,$fekete); // "Tényleges" hétnap (ld. szombati tanítás) // Ezt kés* bb a naptár mellett iratjuk ki a naptári bejegyzésekkel. $res=query("select tanitas,ok from spec napok where nap=$ev-$ho-$nap"); if($res && pg numrows($res)) { $i=pg fetch row($res, 0); $hetnap=$i[0]; } - 105 - 6.217 Az adatbázis program-részletei / Az adatbázis felületét adó kódok // Nyitvatartás $res=query("select nyitas, zaras from sztech nyitva where nap=$hetnap;"); if(!$res || !pg numrows($res)) { $irni="Ma nincs nyitva a számítástechnika terem."; $top

+= lapra ($im,$font,$x/2,$top,$irni,$metal,$feher); vege($im); exit; } $nyitva=pg fetch row($res, 0); $nyitas=time to array($nyitva[0]); //Így $nyitas[0]=óra, $nyitas[1]=perc $zaras=time to array($nyitva[1]); $nyitasperc=array to perc($nyitas); $zarasperc=array to perc($zaras); $irni="Nyitvatartás: $nyitas[0]:$nyitas[1] - $zaras[0]:$zaras[1]"; imagestring($im,$font,$x/2 -imagefontwidth($font)*strlen($irni)/2,$top,$irni,$feher); $top += imagefontheight($font); $res=query("select * from spec napok where nap=$ev-$ho-$nap"); if(vansora($res)) //ha spec nap ez, vagyis más tanítási rend van { $ret=pg fetch row($res,0); $irni="Ma ". $napok[$ret[1]-1]"i tanrend lesz (" $ret[2] ")"; imagestring($im,$font,$x/2 -$fw*strlen($irni)/2,3+$top,$irni,$fekete); $top += $fh; } // Csoport tagság $res=query("select csoport from csoport tagok where ember=$sessuser and veg=null;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch

row($res, $i); $csoportok["$sor[0]"]=1; } // Táblázat kiírása $cols=($zarasperc-$nyitasperc)/5+4; // Most jön a neheze. $gepek res=query("select * from gepek order by gep;"); $gepek szama=pg numrows($gepek res); if(!$gepek szama) { $irni="Nem látok egyetlen gépet sem!"; imagestring($im,3,$x/2 -imagefontwidth(3)*strlen($irni)/2,$y/2,$irni,$fekete); vege($im); exit; } $top += $fh; $ymag=O*($y-$top)/$gepek szama; $xn=30; $f=4;//gépszámfont $g=3;//háttérfont $gh=imagefontheight($g); $gw=imagefontwidth($g); - 106 - 6.217 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.217 //$top += $fh; //Háttér kirajzolása for ($o=0;$o<O;$o++) { $xo=$o*$x/O; $xv=($o+1)*$x/O; for($i=$o*$gepek szama/O; $i<($o+1)$gepek szama/O; $i++) { $ytop=($i-$o*$gepek szama/O)$ymag+$top; imageline($im,$xn+$xo,$ytop,$xv,$ytop,$fekete); $st=($i+1).""; $xg=$xn+$xo-strlen($st)*imagefontwidth($f);

imagestring($im,$f,$xg,$ytop+$ymag/2-imagefontheight($f)/2,$st,$feher); //egészek for($j=intval($nyitasperc/60);$j<$zarasperc/60;$j++ ) { if($j*60 > $nyitasperc) { imagestring($im, $g,$xn+$xo+ ($j*60-$nyitasperc)($x/O-$xn)/($zarasperc-$nyitasperc)$gwstrlen($j)/2, $ytop+$ymag/2-$gh/2,$j,$feher); } } for($j=intval($nyitasperc/30);$j<$zarasperc/30;$j++ ) { if(($j*30 > $nyitasperc) and ($j % 2)) { $st=intval ($j /2).":30"; imagestring($im, $g,$xn+$xo+ ($j*30-$nyitasperc)($x/O-$xn)/($zarasperc-$nyitasperc)$gwstrlen($st)/2, $ytop+$ymag/2-$gh/2,$st,$feher); } } } }//for o vege //kitiltottak listája $bunosok=Kitiltott:; $kitiltottak res=query("select ember from kitiltasok where veg >= now() and belepes tilt=t;"); for($j=0; $j<pg numrows($kitiltottak res); $j++) { $sor=pg fetch row($kitiltottak res,$j); $bunosok .= " "$sor[0]; } imagestring($im,$font,$xeleje,40,$bunosok,$sarga); for ($o=0;$o<O;$o++) { $xo=($o+1)*$xn+$o($x-$xnO)/O;

$xv=($o+2)*$xn+($o+1)($x-$xnO)/O; - 107 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.217 for($i=$o*$gepek szama/O; $i<($o+1)$gepek szama/O; $i++) { $ytop=($i-$o*$gepek szama/O)$ymag+$top; $akt gep=pg fetch row($gepek res, $i); $foglcsik=array(); /* Szakkörök / $szakkorok res=query("select csoport, kezdet, veg from sztech szakkorok where nap=$hetnap and csoport in (select csoport from szakkori gepek where gep=$akt gep[0]);"); for($j=0; $j<pg numrows($szakkorok res); $j++) { $fogl=pg fetch row($szakkorok res, $j); $kezdet perc=(array to perc(time to array($fogl[1]))-$nyitasperc); $veg perc=(array to perc(time to array($fogl[2]))-$nyitasperc); $xeleje=$xo+($x-$xn*O)/O$kezdet perc/($zarasperc-$nyitasperc); $xvege=$xo+($x-$xn*o)/O$veg perc/($zarasperc-$nyitasperc); imagerectangleb($im,$xeleje,$ytop+3,$xvege-3,$ytop+$ymag-3,$sarga);

imagestring($im,$font,($xeleje+$xvege)/2imagefontwidth($font)*strlen($fogl[0])/2,3+$ytop,$fogl[0],$fekete); } /* Foglalások / $foglalasok res=query("select f.ember, kezdet, veg,nev from foglalasok f,emberek e where gep=$akt gep[0] and nap=$ev-$ho$nap and e.ember=fember;"); for($j=0; $j<pg numrows($foglalasok res); $j++) { $font=5; $fogl=pg fetch row($foglalasok res, $j); $kezdet perc=(array to perc(time to array($fogl[1]))-$nyitasperc); if($kezdet perc < 0) {$kezdet perc=0;}; $veg perc=(array to perc(time to array($fogl[2]))-$nyitasperc); $xeleje=$xo+($x-$xn*O)/O$kezdet perc/($zarasperc-$nyitasperc); $xvege=$xo+($x-$xn*O)/O$veg perc/($zarasperc-$nyitasperc); $mennyifer=intval(($xvege-$xeleje)/imagefontwidth($font)); $kistr1=$fogl[0]; $kistr2=substr($fogl[1],0,5)."-"substr($fogl[2],0,5); if(strlen($kistr1)>$mennyifer) { $kistr1=substr($kistr1,0,$mennyifer); }; if(strlen($kistr2)>$mennyifer) { $kistr2=substr($kistr2,0,$mennyifer); };

imagerectangleb($im,$xeleje,$ytop+1,$xvege-2,$ytop+$ymag-1,$piros); imagestring($im,$font,($xeleje+$xvege)/2imagefontwidth($font)*strlen($kistr1)/2,4+$ytop,$kistr1,$feher); imagestring($im,$font,($xeleje+$xvege)/2imagefontwidth($font)*strlen($kistr2)/2,4+$ytop+imagefontheight($font),$kistr2,$feher); } } - 108 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok } vege($im); ?> 6.218 gep listaphp <?php include "alap.php"; require "belep.php"; html kezd("A gépek adatai"); menu("foglalas", "gep lista",""); tablazat kezd(8, array("Gép", "Típus", "Színes-e", "Processzor", "Memória (MB)", "HDD (GB)", "Állapot", "Kiegészít* k"), null); sql link tablazat("select gep, gepek.geptipus, szines, processzor, memoria, hdd, allapot, kiegeszitok from gepek, geptipusok where gepek.geptipus=geptipusokgeptipus order by

gep;", null, null); tablazat veg(); html veg(); ?> 6.219 gep valasztphp <?php include "alap.php"; require "belep.php"; //Tanárok, és a szakkört tartó diákok is!! function tanit e($pofa) { return(vansora(query("select * from tanitas where tanar=$pofa;"))); }; function diak e($pofa) {//ha valamelyik osztálynak tagja return ( vansora ( query ( "select * from csoport tagok ct,csoportok c ". "where ct.ember=$pofa " "and ct.csoport=ccsoport " "and c.tipus = 1;"))); }; if(!isset($ho)) { $ev=strftime("%Y"); $ho=strftime("%m"); $nap=strftime("%d"); } if($ho and !$nap) { $nap=1; } if(!checkdate($ho, $nap, $ev)) { $nap=1; } - 109 - 6.217 Az adatbázis program-részletei / Az adatbázis felületét adó kódok function fogl csikba($csik, $kezdet, $veg, $img, $alt, $link, $foglalhat) { global $nyitasperc, $zarasperc; $kezdet perc=(array to perc(time to

array($kezdet))-$nyitasperc)/5; $veg perc=(array to perc(time to array($veg))-$nyitasperc)/5; $csikba array=array($img, $alt, $link, $foglalhat); for($i=$kezdet perc; $i<$veg perc; $i++) { $csik[$i]=$csikba array; } return $csik; } function fogl csik kiir($csik, $gep, $geptipus) { global $nyitasperc, $zarasperc, $ev, $ho, $nap; echo "<tr><td bgcolor=#dddddd><font size=-1>$gep</font>" ."<td bgcolor=#dddddd><font size=-1>$geptipus</font></td> "; $cellak=($zarasperc-$nyitasperc)/5; $regi i=-1; for($i=0; $i<$cellak; $i++) { $csik array=$csik[$i]; $kov csik array=$csik[$i+1]; settype($csik array, "array"); settype($kov csik array, "array"); if($csik array and $regi i==-1 and !$csik array[3]) { $regi i=$i; } if($csik array and !$csik array[3] and ($kov csik array!=$csik array or $i==$cellak-1)) { echo "<td background="img/$csik array[0]" colspan=". ($i-$regi i+1)."

height=15><font size=-1><center>"; if($csik array[2]) { echo "<a href="$csik array[2]$csik array[1]">". "$csik array[1]</a>"; } else { echo "$csik array[1]"; } echo "</center></font></td> "; $regi i=-1; } if(!$csik array or $csik array[3]) // Lehet foglalni { if($csik array[1]) { $alt="$csik array[1], "; - 110 - 6.219 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.219 } else { $alt=null; } $kezd=$nyitasperc+$i*5; $kezd ora=$kezd/60; $kezd perc=$kezd%60; if($csik array[0]) { $img="img/$csik array[0]"; } else { $img="img/szabad.png"; } settype($kezd ora, "integer"); echo "<td><a href="ido valaszt.php?ev=$ev&ho=$ho&nap=$nap&ora=$kezd ora&perc=$kezd perc&gep=$gep"> <img src="$img" border=0 alt="$alt$kezd ora:$kezd perc"></a></td>

"; //TODO: lynx-el jobban hasznalhatova tenni } } echo "</tr> "; } html kezd("Foglalási napló"); menu("foglalas", "foglalas",""); if(!diak e("$sessuser") and ! tanit e("$sessuser") and ($sessuser != postgres)) { sorki("Gépet csak tanárok és diákok foglalhatnak"); } else { // El* ször is megtudjuk, milyen nap van ma $most=mktime(0, 0, 0, $ho, $nap, $ev); $hetnap=strftime("%u", $most); alcim("$ev. "$honapok[$ho-1]" $nap ("$napok[$hetnap-1]")"); // "Tényleges" hétnap (ld. szombati tanítás) // Ezt kés* bb a naptár mellett iratjuk ki a naptári bejegyzésekkel. $res=query("select tanitas,ok from spec napok where nap=$ev-$ho-$nap"); if($res && pg numrows($res)) { $i=pg fetch row($res, 0); $hetnap=$i[0]; // sorki("Ezen a napon ".$napok[$hetnap-1]"i tanítás lesz ("$i[1]")"); } // Nyitvatartás

$res=query("select nyitas, zaras from sztech nyitva where nap=$hetnap;"); if(!$res || !pg numrows($res)) { sorki("Ma nincs nyitva a számítástechnika terem."); // Nap táblázat require "naptar.php"; naptar($ev, $ho, $nap, "gep valaszt.php"); html veg(); exit; } $nyitva=pg fetch row($res, 0); $nyitas=time to array($nyitva[0]); //Így $nyitas[0]=óra, $nyitas[1]=perc $zaras=time to array($nyitva[1]); - 111 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok $nyitasperc=array to perc($nyitas); $zarasperc=array to perc($zaras); sorki("<center><b>Nyitvatartás:</b> $nyitas[0]:$nyitas[1] - $zaras[0]:$zaras[1]</center>"); echo "<table><tr><td>"; // Nap táblázat require "naptar.php"; naptar($ev, $ho, $nap, "gep valaszt.php"); echo "</td><td>"; $res=query("select * from spec napok where nap=$ev-$ho-$nap");

if(vansora($res)) //ha spec nap ez, vagyis más tanítási rend van { $ret=pg fetch row($res,0); td("Ma ". $napok[$ret[1]-1]"i tanrend lesz (" $ret[2] . ")"); } $res=query("select nev,szoveg, mikor,mikorra,kiknek". " from naptar n,emberek e where mikorra=$ev-$ho-$nap". " and kiknek >=2 and e.ember=nember;"); if( $res && ($s=pg numrows($res))) //ha van bejegyzés { echo "<table><tr><td>Mai naptári bejegyzések:</td></tr>"; for($j=0;$j<$s;$j++) { $ret=pg fetch row($res,$j); tr kezd(); td ("<font size=-2>".$ret[0]":</font> " $ret[1]." "); tr veg(); } echo "</table>"; } echo "</td></tr></table>"; sorki("Kattints rá az alábbi ábrán a foglalás kezdetének megfelel* ". "id* pontra!"); // Csoport tagság $res=query("select csoport from csoport tagok where

ember=$sessuser and veg=null;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); $csoportok["$sor[0]"]=1; } // Táblázat kiírása $cols=($zarasperc-$nyitasperc)/5+4; echo "<table cols=$cols border=0 cellspacing=1 cellpadding=0 align=center width=1> "; tbl fejlec kezd(); th("Gép", null); th("Típus", null); th("$nyitas[0]", "colspan=".((60-$nyitas[1])/5)); for($i=$nyitas[0]+1; $i<$zaras[0]; $i++) { - 112 - 6.219 Az adatbázis program-részletei / Az adatbázis felületét adó kódok th("$i", "colspan=12"); } th("$zaras[0]", "colspan=".($nyitas[1]/5-1)); tbl fejlec veg(); // Most jön a neheze. $gepek res=query("select * from gepek order by gep;"); $gepek szama=pg numrows($gepek res); if(!$gepek szama) { hiba("Nem látok egyetlen gépet sem!"); html veg(); exit; } for($i=0; $i<$gepek szama; $i++) { $akt gep=pg fetch

row($gepek res, $i); $foglcsik=array(); /* Szakkörök / $szakkorok res=query("select csoport, kezdet, veg from sztech szakkorok where nap=$hetnap and csoport in (select csoport from szakkori gepek where gep=$akt gep[0]);"); for($j=0; $j<pg numrows($szakkorok res); $j++) { $fogl=pg fetch row($szakkorok res, $j); $foglcsik=fogl csikba($foglcsik, $fogl[1], $fogl[2], "szakkor.png", $fogl[0], null, $csoportok["$fogl[0]"]); } /* Foglalások / $foglalasok res=query("select ember, kezdet, veg from foglalasok where gep=$akt gep[0] and nap=$ev-$ho-$nap;"); for($j=0; $j<pg numrows($foglalasok res); $j++) { $fogl=pg fetch row($foglalasok res, $j); if(csoport tag vagyok e("foglalas admin") or $fogl[0]==$sessuser) { $url="user foglalasok.php?ev=$ev&ho=$ho&nap=$nap&ember="; } else { $url=0; } $img="foglalt.png"; if($fogl[0]==$sessuser) { $img="sajat.gif"; } $foglcsik=fogl csikba($foglcsik, $fogl[1],

$fogl[2], $img, $fogl[0], $url, 0); } fogl csik kiir($foglcsik, $akt gep[0], $akt gep[1]); } tablazat veg(); } - 113 - 6.219 Az adatbázis program-részletei / Az adatbázis felületét adó kódok html veg(); ?> 6.220 headersphp <?php $headers = getallheaders(); while (list ($header, $value) = each ($headers)) { echo "$header: $value<br> "; } ?> 6.221 hirdetphp <?php include "alap.php"; html kezd("Piarista Adatbázis"); menu("cimlap", "cimlap",""); ?> <img align=right src=https://ggt.piarhu/~csm/forgalomphp> <center><h1>Üdvözöllek a Piarista Adatbázis oldalán!</h1></center> <b>Új felhasználó regisztrálásához</b> "vendeg" névvel és "piar" jelszóval tudsz belépni. <?php html veg(); ?> 6.222 hirdetotablaphp <?php /* Ez a file hívogatja be a hirdet- tábla képerny- ket. Ebbe nem kell beleírni Lásd a

hirdet/hirdet.php-t */ include "alap.php"; require "belep.php"; ?> <html> <style> <!-h1 { font-family: Arial, Helvetica; font-size: 32pt; font-weight: bold } body { background-color: white; font-size: 16pt } --> </style> <?php require "hirdet/hirdet.php"; /* Tartalma: $kovetkezo létrehozása, $idok tömb / - 114 - 6.219 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.222 if(!$most) { $most=$kovetkezo; } // várakozandó id$ido=$idok[find in array($idok, $most)+1]; echo "<meta http-equiv="refresh" content="$ido; url=hirdetotabla.php?most=$kovetkezo"> "; echo "<body> "; require "hirdet/$most.php"; echo "</body></html>"; ?> 6.223 ido valasztphp <?php include "alap.php"; require "belep.php"; html kezd("Foglalási napló"); menu("foglalas",

"foglalas",""); if(!isset($ember)) { $ember=$sessuser; } if(csoport tag vagyok e("foglalas admin")) { $admin=1; } if(isset($ido) and $ido>=15) { $veg=$ora*60+$perc+$ido; $veg ora=$veg/60; settype($veg ora, "integer"); $veg perc=$veg%60; $res=query("insert into foglalasok values ($ember, $ev-$ho-$nap, $ora:$perc, $veg ora:$veg perc, $gep);"); if($res) { sorki("A foglalást sikeresen bejegyeztem:"); } else { sorki("Nem sikerült bejegyeznem a foglalást."); } } else { sorki("Ellen- rizd a foglalás adatait és jelöld be a kívánt id - tartamot."); } /* Táblázat / form kezd($PHP SELF); hidden tag("ev", $ev); hidden tag("ho", $ho); hidden tag("nap", $nap); hidden tag("ora", $ora); hidden tag("perc", $perc); hidden tag("gep", $gep); - 115 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok tablazat kezd(2,

array("Jellemz- ", "Érték"), null); tr kezd(); td("Dátum:"); td("$ev-$ho-$nap"); tr veg(); tr kezd(); td("Kezdés:"); td("$ora:$perc"); tr veg(); tr kezd(); td("Gép:"); td("$gep"); tr veg(); tr kezd(); td("Ember:"); if($admin and !isset($ido)) { td("<input name=ember value="$ember">"); } else { td("$ember"); } /* Id- tartam vizsgálat / tr kezd(); td("Id- tartam:"); // User foglalási ideje $res=query("select user foglalas ido($ember, $ev-$ho-$nap);"); $sor=pg fetch row($res, 0); $maradt=time to array($sor[0]); if(isset($ido)) { td("$ido perc"); } else { // El - ször az admin által átugorható szabályok: // User foglalási ideje $perc max=array to perc($maradt); // Ütköz - szakkor $res=query("select kezdet-$ora:$perc from sztech szakkorok, szakkori gepek where sztech szakkorok.csoport=szakkori gepekcsoport and

nap=milyen nap($ev-$ho-$nap) and gep=$gep and sztech szakkorok.csoport not in (select csoport from csoport tagok where ember=$ember and veg=null) and kezdet>=$ora:$perc order by kezdet;"); if(pg numrows($res)) { $sor=pg fetch row($res, 0); $perc max=min($perc max, array to perc(time to array($sor[0]))); } if($admin) { $perc max=1000; // ronda megoldás, de egy nagy if még rondább lenne } // Ezeket be kell tartania az adminnak is // Ütköz - foglalás $res=query("select kezdet-$ora:$perc from foglalasok where nap=$ev-$ho-$nap and kezdet>=$ora:$perc and gep=$gep order by kezdet;"); if(pg numrows($res)) { $sor=pg fetch row($res, 0); $perc max=min($perc max, array to perc(time to array($sor[0]))); } // Nyitvatartás $res=query("select zaras-$ora:$perc from sztech nyitva where nap=milyen nap($ev-$ho-$nap);"); if(pg numrows($res)) { $sor=pg fetch row($res, 0); $perc max=min($perc max, array to perc(time to array($sor[0]))); - 116 - 6.223 Az adatbázis

program-részletei / Az adatbázis felületét adó kódok } echo "<td><select name="ido"> "; for($i=15; $i<=$perc max; $i+=5) { echo "<option value=$i>$i "; } echo "</select> perc</td>"; } tr veg(); tablazat veg(); $res=query("select heti ido, osszes ido from foglalas idok where ember=$ember;"); if(!pg numrows($res)) { $res=query("select heti ido, osszes ido from foglalas idok where ember=null;"); } $sor=pg fetch row($res, 0); $heti=time to array($sor[0]); settype($heti[0], integer); settype($heti[1], integer); $osszes=time to array($sor[1]); settype($osszes[0], integer); settype($osszes[1], integer); if(!$admin) { sorki("Hetenként $heti[0] óra $heti[1] percet, összesen $osszes[0] óra $osszes[1] percet foglalhatsz el- re. Maradt még $maradt[0] óra $maradt[1] perced"); } if(!isset($ido)) { form veg(); } vissza("gep valaszt.php?ev=$ev&ho=$ho&nap=$nap"); html

veg(); ?> 6.224 indexphp <?php include "alap.php"; html kezd("Piarista Adatbázis"); menu("cimlap", "cimlap",""); ?> <img align=right src=https://ggt.piarhu/~csm/forgalomphp> <center><h1>Üdvözöllek a Piarista Adatbázis oldalán!</h1></center> <b>Új felhasználó regisztrálásához</b> "vendeg" névvel és "piar" jelszóval tudsz belépni. <?php html veg(); ?> 6.225 isknaptarphp <?php include "alap.php"; - 117 - 6.223 Az adatbázis program-részletei / Az adatbázis felületét adó kódok include "naptar.php"; require "belep.php"; html kezd("A gimnázium naptára"); // ------------- Biztonság ---------------if (t== sql get val("select kulso e($sessuser);")) { menu("cimlap","",""); sorki("Az iskola naptárát csak a tanárok, diákok és szüleik

nézhetik". "meg."); sorki("Ha ön tagja valamelyik csoportnak, akkor regisztrálja magát."); html veg(); exit; } $biztonsag=3; //3:szulo 2:diak 1:tanar if(t== sql get val("select diak e($sessuser);")) { $biztonsag=2; } if(t== sql get val("select tanar e($sessuser);")) { sorki("Önt tanárként ismerte fel a rendszer."); $biztonsag=1; } menu("naptar", "",""); // ------------- Adatok beírása -------------if($szoveg) { if (!query("insert into naptar values". "($sessuser,$szoveg,now,$insdate,$public);")) {sorki("Nem sikerült a bejegyzés.");exit; }; } // ----------------- Naptár ------------------if($ev) { if(!checkdate($ho, $nap, $ev)) { $nap=1; } $ma[0]=$ev;$ma[1]=$ho;$ma[2]=$nap; }else { $ma=explode(-,sql get val("select now::date;")); $ev=$ma[0];$ho=$ma[1];$nap=$ma[2]; } echo "<table><tr><td><table><tr><td>";

naptar($ev,$ho,$nap,"isknaptar.php"); echo "</td><td>"; $madate="$ev-$ho-$nap"; $dow=sql get val("select hetnap($madate)")-1; //-1 a kompatibilitás kedvéért - 118 - 6.225 Az adatbázis program-részletei / Az adatbázis felületét adó kódok // ----------- ujnapok elkészítése ------------// (a jobb oldali táblázat fejlécét tartalmazza) $fej=array(); for($i=0;$i<8;$i++) { $modstr=$i - $dow; //sorki ("[$modstr] dow=$dow i=$i"); $ujnapok[$i]=sql get val("select $madate ::date + $modstr;"); if($i==$dow) { array push($fej,"<font color=yellow>".$napok[$i]" " date to text($ujnapok[$i])."</font>"); } else { $n=explode("-",$ujnapok[$i]); $refstr="ev=".$n[0]"&ho="$n[1]"&nap="$n[2]; array push($fej,"<a href=isknaptar.php?$refstr>" "<font color=white>". $napok[$i]." "date to

text($ujnapok[$i])"</font></a>"); }; }; tablazat kezd(7,$fej,""); tr kezd(); // ha spec nap ez, vagyis más tanítási rend van, akkor kiírjuk // alá rövidítve, hogy ".-i tanrend (ok)" for($i=0;$i<7;$i++) { $res=query("select * from spec napok where nap=".$ujnapok[$i]""); if(vansora($res)) { $ret=pg fetch row($res,0); td(substr($napok[$ret[1]-1],0,3)."-i tanrend (" substr($ret[2],0,10).")"); } else{td("&nbsp;");}; } tr veg();tr kezd(); // ---------- táblázat tartalma ----------for($i=0;$i<7;$i++) { $res=query("select * from naptar where mikorra=".$ujnapok[$i]"" " and kiknek >=$biztonsag;"); if( $res && ($s=pg numrows($res))) //ha van bejegyzés {$ki=""; for($j=0;$j<$s;$j++) { $ret=pg fetch row($res,$j); $ki.= $ret[0]": " substr($ret[1],0,30)."<br>"; } td($ki); - 119 - 6.225 Az adatbázis

program-részletei / Az adatbázis felületét adó kódok } else{td("&nbsp;");}; } tr veg(); tablazat veg(); echo "</td></tr></table></td></tr><tr><td>"; tablazat kezd balra(1,array (date to text($madate)." "$napok[$dow] ), "width=600"); $res=query("select * from spec napok where nap=$madate"); if(vansora($res)) //ha spec nap ez, vagyis más tanítási rend van { $ret=pg fetch row($res,0); tr kezd(); td("Ma ". $napok[$ret[1]-1]"i tanrend lesz (" $ret[2] . ")"); tr veg(); } $res=query("select nev,szoveg, mikor,mikorra,kiknek". " from naptar n,emberek e where mikorra=".$madate"" " and kiknek >=$biztonsag and e.ember=nember;"); if( $res && ($s=pg numrows($res))) //ha van bejegyzés { for($j=0;$j<$s;$j++) { $ret=pg fetch row($res,$j); tr kezd(); td ($ret[0]." ("$ret[2]"): " $ret[1]."

"); tr veg(); } } if($biztonsag==1) { tr kezd(); form kezd("isknaptar.php"); td("Itt új bejegyzés lehet beszúrni az aktuális napra." "(A látható sornál hosszabb üzenet is beszúrható.)" "<input size=90 name=szoveg>"); tr veg();tr kezd(); td( "<input type=hidden name=ev value=$ev> ". "<input type=hidden name=ho value=$ho> ". "<input type=hidden name=nap value=$nap> ". "<input type=hidden name=insdate value=$madate> ". "<select name=public>". "<option value=3>diákok szülei is lássák ". "<option value=2>diákok is lássák ". "<option value=1>csak tanárok lássák</select> ". "<input type=image src="img/submit.gif" border=0></form> "); tr veg(); } tablazat veg(); echo "</td></tr></table>"; html veg(); - 120 - 6.225 Az adatbázis

program-részletei / Az adatbázis felületét adó kódok 6.225 ?> 6.226 jegyadasphp <?php include "alap.php"; require "belep.php"; html kezd("Jegyek beírása"); menu("tanar", "jegyadas",2); $res1=query("select distinct csoportok.csoport, csoportoknev, tantargyak.tantargy, tantargyaknev from tanitas, csoportok, tantargyak where tanar=$sessuser and csoportok.csoport=tanitascsoport and tantargyak.tantargy=tanitastantargy;"); if(!pg numrows($res1)) { sorki("Nem vagy tanár."); html veg(); exit; } if(isset($csoport)) { echo "<h1>$tantargy jegyek $csoport-nak</h1>"; ?> Lehet. ség van egy teljes jegy-tábla feltöltésére is <ul> <li>Az els. sorban legyen egy "login" nev / oszlopcím <li>Ezután minden jegy els. sorában legyen ott a jegy-adás neve (pl dolgozat) Speciális osztlop a min és a plu nev / , ezek a minuszok és pluszok. <li> Második

sorban legyen az egyes jegyek súlya. A minusz és plusz oszlopban a jegyhez szükséges szám legyen. <li>Ennek a login oszlopban legyen sulyok neve. A 0 súlyú jegyek nem kerülnek be az adatbázisba A következ. sor "datum" jelzéssel tartalmazza a jegyadás dátumát <li>Ezután jönnek az emberek a jegyekkel, majd az utolsó ember azonosítója után álljon egy "stop" azonosító. <li>A fájl pontosvessz. vel elválasztott csv text fájl legyen<li>MINDEN EDDIGI JEGY TÖRL 0 DIK! <a href=mintacsv.html>Minta-táblázat</a> <form enctype="multipart/form-data" action="jegyadas3.php" method="post"> <input type="hidden" name="MAX FILE SIZE" value="100000"> <input type="hidden" name="csoport" value="<?php echo $csoport; ?>"> <input type="hidden" name="tantargy" value="<?php echo

$tantargy; ?>"> Ezt töltöm fel: <input name="csvfile" type="file" value="*.csv"> <input type="submit" value="Send File"> </form> <?php form kezd("jegyadas2.php"); sorki("Írja be a jegyadás alkalmát (pl. dolgozat), majd jelölje be a diákok jegyeit, és nyomja meg a Mehet! gombot. Ha a diák nevére kattint, megnézheti a diák jegyeit ebben a félévben."); kiscim("Ok: <input name="ok">"); echo "<h2>Súlyozás: "; echo "<select name=sulyozas> ". "<option value="0.333">1/3 " "<option value="0.25">1/4 " "<option value="0.2">1/5 " - 121 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.226 "<option value=1 selected>1 ". "<option value=2>2 ". "<option value=3>3 ".

"</select></h2> "; kiscim("Diákok:"); $res=query("select distinct nev, csoport tagok.ember from csoport tagok, emberek where csoport=$csoport and csoport tagok.ember=emberekember and veg=null;"); hidden tag("csoport", $csoport); hidden tag("tantargy", $tantargy); tablazat kezd(2, array("Diák", "Jegy"), "width=300"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td("<a href="jegyek.php?ember=$sor[1]&tantargy=$tantargy">" "$sor[0]</a> ($sor[1])"); echo "<td width=100><select name="ember $sor[1]"> ". "<option value=0 selected>-"; for($j=1; $j<=5; $j++) { echo "<option value=$j>$j "; } echo "</select><img src=jegygraf.php?ember="$sor[1]"&tantargy=$tantargy></td>"; tr veg(); } tablazat veg(); form veg(); }

kiscim("Csoport:"); tablazat kezd(2, array("Csoport", "Tantárgy"), "width=300"); for($i=0; $i<pg numrows($res1); $i++) { $sor=pg fetch row($res1, $i); tr kezd(); td("<a href="$PHP SELF?csoport=$sor[0]&tantargy=$sor[2]">". "$sor[1]</a> "); td("$sor[3]"); tr veg(); } tablazat veg(); html veg(); ?> 6.227 jegyadas2php <?php include "alap.php"; require "belep.php"; require "ertesit.php"; html kezd("Jegyek beírása"); menu("tanar", "jegyadas", 2); sorki("Az alábbi jegyeket írtam be a naplóba:"); - 122 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok $res=query("select distinct nev, emberek.ember from csoport tagok, emberek where csoport=$csoport and emberek.ember=csoport tagokember and veg=null;"); query("begin;"); tablazat kezd(2, array("Diák",

"Jegy"), "width=300"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); $htmlvar="ember $sor[1]"; $jegy=$$htmlvar; // Azért ez durva. :-) if($jegy) { tr kezd(); td("$sor[0] ($sor[1])"); td("$jegy"); tr veg(); $res2=query("insert into jegyek values (".sqlstr($sor[1]) .sqlstr($tantargy)"now, "sqlstr($jegy)sqlstr($ok) .sqlstr2($sulyozas)");"); jegy ertesit($sor[1], $tantargy, $jegy, $ok); if(!$res2) { query("rollback;"); tablazat veg(); hiba("Nem tudok az adatbázisba írni."); html veg(); exit; } } } query("commit;"); tablazat veg(); vissza("jegyadas.php?csoport=$csoport&tantargy=$tantargy"); html veg(); ?> 6.228 jegyadas3php <?php include "alap.php"; require "belep.php"; require "ertesit.php"; if (!function exists("array search")) { function array search ($needle, $haystack, $strict = FALSE) {

foreach($haystack as $key => $value) { if ($strict) { if ($value === $needle) return $key; } else { if ($value == $needle) return $key; } } return FALSE; - 123 - 6.227 Az adatbázis program-részletei / Az adatbázis felületét adó kódok } } html kezd("Jegyek beírása"); menu("tanar", "jegyadas", 2); $filename=tempnam("/tmp","phpfel"); if (is uploaded file($csvfile)) { copy($csvfile, $filename); } else { echo "Possible file upload attack: filename $csvfile."; } $sorok=file($filename) ; $nr=count($sorok); for($i=0;$i<$nr;$i++) { $nagy[$i]=explode(";",$sorok[$i]); } $logind=array search("login",$nagy[0]); $min=array search("min",$nagy[0]); $plu=array search("plu",$nagy[0]); $sorhossz=count($nagy[0]); $sulyok=$nagy[1]; $datumok=$nagy[2]; if($sulyok[$logind] != "sulyok") { echo "Rossza a fájl felépítése, a második sorban nem sulyok van a login

alatt."; echo "<pre>$sorok</pre>"; exit; } if($datumok[$logind] != "datum") { echo "Rossza a fájl felépítése, a harmadik sorban nem datum van a login alatt."; echo "<pre>$sorok</pre>"; exit; } echo "nagy[0][$logind]=".$nagy[0][$logind]"<br> "$sorok[0]; $i=3; while(($nagy[$i][$logind] != "stop")and ($i<$nr)) { query($s="delete from jegyek where diak=".$nagy[$i][$logind]" and tantargy=$tantargy;"); echo "<br>$s "; for($j=0;$j<$sorhossz;$j++) { if(($j==$logind)OR (strtr(trim($sulyok[$j]),",",".")==00)OR (trim($nagy[$i][$j])==)) { continue; } if($j==$min) { $suly=floor($nagy[$i][$j]/$sulyok[$j]); if (!$suly) - 124 - 6.228 Az adatbázis program-részletei / Az adatbázis felületét adó kódok {continue;} $jegy=1; $diak=$nagy[$i][$logind]; $ok="Összejött minuszok"; } else { if($j==$plu) {

$suly=floor($nagy[$i][$j]/$sulyok[$j]); if (!$suly) {continue;} $jegy=5; $diak=$nagy[$i][$logind]; $ok="Összejött pluszok"; $datum="now"; } else { $jegy=strtr(trim($nagy[$i][$j]),",","."); $suly=strtr(trim($sulyok[$j]),",","."); $datum=$datumok[$j]; if (!$datum){$datum=now;} $diak=$nagy[$i][$logind]; $ok=$nagy[0][$j]; } } query($s="insert into jegyek values ($diak,$tantargy,$datum,$jegy,$ok,$suly);"); echo "<br>$s "; } $i++; } exit; sorki("Az alábbi jegyeket írtam be a naplóba:"); $res=query("select distinct nev, emberek.ember from csoport tagok, emberek where csoport=$csoport and emberek.ember=csoport tagokember and veg=null;"); query("begin;"); tablazat kezd(2, array("Diák", "Jegy"), "width=300"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); $htmlvar="ember $sor[1]"; $jegy=$$htmlvar; // Azért ez

durva. :-) if($jegy) { tr kezd(); td("$sor[0] ($sor[1])"); td("$jegy"); tr veg(); $res2=query("insert into jegyek values (".sqlstr($sor[1]) .sqlstr($tantargy)"now, "sqlstr($jegy)sqlstr($ok) - 125 - 6.228 Az adatbázis program-részletei / Az adatbázis felületét adó kódok .sqlstr2($sulyozas)");"); jegy ertesit($sor[1], $tantargy, $jegy, $ok); if(!$res2) { query("rollback;"); tablazat veg(); hiba("Nem tudok az adatbázisba írni."); html veg(); exit; } } } query("commit;"); tablazat veg(); vissza("jegyadas.php?csoport=$csoport&tantargy=$tantargy"); html veg(); ?> 6.229 jegyekphp <?php include "alap.php"; require "belep.php"; require "ertesit.php"; if(!$ember and ($res=query("select nev,gyerek from szulok,emberek ". "where szulo=$sessuser and ember=gyerek ". "order by nev;"))) { $nr=pg numrows($res); if($nr > 1)// ha

több gyereke van, itt választ { html kezd("Szül - gyerekei"); menu("diak","jegyek","2"); alcim("Válassza ki, melyik gyermekének jegyeit kívánja megtekinteni!"); for($i=0;$i<pg numrows($res);$i++) { $ret=pg fetch row($res,$i); sorki("<a href=$PHP SELF?ember=".$ret[1]">"$ret[0]" jegyei</a> "); } html veg(); exit; } else { if($nr==1) { $ret=pg fetch row($res,0); $ember=$ret[1]; } } } if(!$ember) { $ember=$sessuser; } $nev=sql get val("select nev from emberek where ember=$ember;"); - 126 - 6.228 Az adatbázis program-részletei / Az adatbázis felületét adó kódok html kezd("$nev jegyei"); menu("diak", "jegyek", 3); cim("$nev jegyei"); if(file exists("arcok/$ember.jpeg")) { echo "<a href=arcok/$ember.jpeg>" "<img src=arcok/$ember.jpeg width=100 align=right border=0></a>"; } //

Tanár-e $tanar e=sql get val("select tanar diakja e($sessuser, $ember, $tantargy);"); if($tanar e==t) { $tanar e=1; } else { $tanar e=0; } // Jegy törlése if(isset($torol) and $tanar e) { query("delete from jegyek where id=$torol;"); } // Jegy beírása if(isset($jegy) and $tanar e) { query("insert into jegyek values ($ember, $tantargy, now, $jegy, $ok, $sulyozas);"); jegy ertesit($ember, $tantargy, $jegy, $ok); } // Tantárgy kiválasztása $res=query("select distinct tantargyak.tantargy, tantargyaknev, embereknev from tanitas, tantargyak, emberek where csoport in ( select csoport from csoport tagok where ember=$ember and veg=null) and tanitas.tanar=emberekember and tanitas.tantargy=tantargyaktantargy;"); if(!pg numrows($res)) { sorki("Nem tanítanak semmilyen tantárgyból."); html veg(); exit; } kiscim("Tantárgy:"); tablazat kezd(3, array("Tantárgy","Grafikon", "Tanár"),

"width=400"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td("<a href="jegyek.php?ember=$ember&tantargy=$sor[0]"> " "$sor[1]</a>"); td("<img src=jegygraf.php?ember=$ember&tantargy=$sor[0]>"); td("$sor[2]"); tr veg(); } tablazat veg(); // Jegyek if(isset($tantargy)) { $res=query("select evkezd, felev, evveg from iskolaevek where - 127 - 6.229 Az adatbázis program-részletei / Az adatbázis felületét adó kódok evkezd<=now and evveg>=now;"); $tanev=pg fetch array($res, 0); $tantargynev=sql get val("select nev from tantargyak where tantargy=$tantargy"); // Félév megállapítása $felevutan=sql get val("select date gt(now, ".$tanev["felev"]");"); if($felevutan==t) { kiscim("$tantargynev (második félév):"); $felev kezd=$tanev["felev"]; $felev veg=$tanev["evveg"]; } else

{ kiscim("$tantargynev (els1 félév):"); $felev kezd=$tanev["evkezd"]; $felev veg=$tanev["felev"]; } // Táblázat $res=query("select jegy, sulyozas, datum, ok, id from jegyek where ". "diak=$ember and datum>=$felev kezd and datum<=$felev veg ". "and tantargy=$tantargy ". "order by datum;"); if(!pg numrows($res)) { sorki("$nev ebben a félévben nem kapott jegyet."); if(!$tanar e) { html veg(); exit; } $nincs jegy=1; } tablazat kezd(4+$tanar e, array("Jegy", "Súlyozás", "Dátum", "Ok", "M 2 velet"), null); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td($sor[1]); td(date to text($sor[2])); td($sor[3]); if($tanar e) { td("<a href="jegyek.php?ember=$ember&tantargy=$tantargy&torol=$sor[4]">Töröl</a>"); } tr veg(); } if($tanar e) { tr kezd(); form

kezd("jegyek.php"); hidden tag("ember", $ember); hidden tag("tantargy", $tantargy); td("<input size=2 name=jegy>"); td kezd(); echo "<select name=sulyozas> ". - 128 - 6.229 Az adatbázis program-részletei / Az adatbázis felületét adó kódok "<option value="0.333">1/3 " "<option value="0.25">1/4 " "<option value="0.2">1/5 " "<option value=1 selected>1 ". "<option value=2>2 ". "<option value=3>3 ". "</select> "; td veg(); td("most"); td("<input name=ok>"); td("<input type=submit value="Hozzáad"></form>"); tr veg(); } tablazat veg(); if(!$nincs jegy) { /* $res=query("select avg(cast(jegy as float4)) from jegyek where diak=$ember and $datum megszoritas and tantargy=$tantargy;");*/ /* súlyozott átlag / $felev

atlag=sql get val("select jegy atlag($ember, $tantargy, $felev kezd, $felev veg);"); $ev atlag=sql get val("select jegy atlag($ember, $tantargy," .sqlstr($tanev["evkezd"])sqlstr2($tanev["evveg"])");"); sorki("<b>Jegyek átlaga ebben a félévben:</b> $felev atlag"); sorki("<b>Jegyek átlaga egész évben:</b> $ev atlag"); } } html veg(); ?> 6.230 jegygrafphp <?php include "alap.php"; require "belep.php"; Header("Content-type: image/png"); if(!$ember) { $ember=$sessuser; } if(!($ember and $tantargy)) { exit; } // Jegyek if(isset($tantargy)) { $res=query("select evkezd, felev, evveg from iskolaevek where evkezd<=now and evveg>=now;"); $tanev=pg fetch array($res, 0); $tantargynev=sql get val("select nev from tantargyak where tantargy=$tantargy"); // Félév megállapítása $felevutan=sql get val("select date gt(now,

".$tanev["felev"]");"); - 129 - 6.229 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.230 if($felevutan==t) { $felev kezd=$tanev["felev"]; $felev veg=$tanev["evveg"]; } else { $felev kezd=$tanev["evkezd"]; $felev veg=$tanev["felev"]; } // Táblázat $res=query("select jegy, sulyozas, datum, ok, id from jegyek where ". "diak=$ember and datum>=$felev kezd and datum<=$felev veg ". "and tantargy=$tantargy ". "order by datum;"); if(!pg numrows($res)) { if(!$tanar e) { } $nincs jegy=1; } // tablazat kezd(4+$tanar e, array("Jegy", "Súlyozás", "Dátum", "Ok", "M 3 velet"), null); $jegyszam=0;$osszuly=0;$osszjegy=0; for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); // tr kezd(); // echo($sor[0]); //td($sor[1]); $osszsuly += $sor[1]; $jegyszam++; $osszjegy+=$sor[0];

$jegy[$i][0]=$sor[0]; $jegy[$i][1]=$sor[1]; $jegy[$i][2]=1.0*$osszjegy/$osszsuly; //td(date to text($sor[2])); //td($sor[3]); //tr veg(); } //tablazat veg(); if(!$nincs jegy) { $y=20; $x=$osszsuly * 4 + $jegyszam + 20; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 200, 200, 200); $vilagosszin = ImageColorAllocate ($im, 240, 240, 240); $sotetszin = ImageColorAllocate ($im, 15, 15, 15); $fekete = ImageColorAllocate ($im, 0, 0, 0); $feher = ImageColorAllocate ($im, 255,255,200); /* súlyozott átlag / $felev atlag=sql get val("select jegy atlag($ember, $tantargy, $felev kezd, $felev veg);"); $ev atlag=sql get val("select jegy atlag($ember, $tantargy," .sqlstr($tanev["evkezd"])sqlstr2($tanev["evveg"])");"); $text color = ImageColorAllocate ($im, 233, 14, 91); for($k=0;$k<$jegyszam;$k++) - 130 - Az adatbázis program-részletei / Az adatbázis

felületét adó kódok { for($l=0;$l<$jegy[$k][1]*3;$l++) { imageline($im,1+$k*4+$l,$y-2,1+$k4+$l,$y-2-$jegy[$k][0]3,$fekete); imagesetpixel($im,1+$k*4+$l,$y-2-$jegy[$k][2]3,$text color); } } ImageString ($im, 1, $x-17, 5, "$felev atlag", $text color); imageline($im,0,0,0,$y-2,$vilagosszin); imageline($im,0,0,$x-2,0,$vilagosszin); imageline($im,$x-1,$y-1,$x-1,1,$sotetszin); imageline($im,$x-1,$y-1,1,$y-1,$sotetszin); ImagePng ($im); sorki("$felev atlag jegye van"); //sorki("<b>Jegyek átlaga ebben a félévben:</b> $felev atlag"); //sorki("<b>Jegyek átlaga egész évben:</b> $ev atlag"); // } else{ $y=20; $x=30; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 200, 200, 200); $text color = ImageColorAllocate ($im, 233, 14, 91); ImageString ($im, 1, 2, 5, "nincs", $text color); ImagePng ($im); } } //html veg(); ?> 6.231

kisarcphp <?php if(ereg(".*[./]*", $ember)) { echo "Rossz embernév: $ember"; exit; } if(!file exists("arcok/$ember.jpeg")) { header("Content-type: image/gif"); readfile("arcok/monkey.gif"); exit; } header("Content-type: image/jpeg"); $fnev=tempnam("/tmp", "kicsinyit"); system("/usr/bin/X11/convert -sample 100x100 arcok/$ember.jpeg $fnev"); readfile($fnev); unlink($fnev); ?> - 131 - 6.230 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.232 6.232 kitiltphp <?php include "alap.php"; require "belep.php"; html kezd("Kitiltások"); menu("admin", "kitilt",2); if(csoport tag vagyok e("kitiltas admin")) { $admin=1; if(isset($torol)) { $res=query("delete from kitiltasok where id=$torol;"); if(!$res) { hiba("Nem sikerült törölni a kitiltást."); } } if(isset($ember)) {

$res=query("insert into kitiltasok values (".sqlstr($ember) .sqlstr($kezdet)sqlstr($veg)sqlstr($ok) .check str($belepes, "t, ", "f, ") .check str($internet, "t", "f") .");"); if(!$res) { hiba("Ezt az elvetemültet még kitiltani sem tudod!"); } } } $select="select distinct t.ember,tkezdet,tveg,ok,belepes tilt,internet tilt,id,enev ,c2nev from kitiltasok t,emberek e,csoport tagok c,csoportok c2 where c2.csoport=ccsoport and c2tipus=1 and c.ember=eember and eember=tember and (tveg=null or tveg>=now) order by enev;"; $res=query($select); tablazat kezd(7+$admin, array("Neve","login", "Kezdet", "Vég", "Ok", "Belépés tiltás", "Internet tiltás", "M 3 velet"), null); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[7]);td($sor[8].":"$sor[0]); td(date to text($sor[1])); td(date

to text($sor[2])); td($sor[3]); td(pgbool to text($sor[4])); td(pgbool to text($sor[5])); /* bocs, hogy ilyen randa / if($admin) { td("<a href="kitilt.php?torol=$sor[6]">Töröl</a>"); } tr veg(); } if($admin) { form kezd("kitilt.php"); tr kezd(); td("<input name=ember size=10>"); td("<input name=kezdet size=12>"); td("<input name=veg size=12>"); td("<input name=ok>"); td("<input type=checkbox name=belepes>"); td("<input type=checkbox name=internet>"); - 132 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok td kezd(); submit("Mehet"); td veg(); tr veg(); echo "</form> "; } tablazat veg(); if($admin) { sorki("<b>Megjegyzés:</b> a dátumot év-hó-nap formátumban írd be; ha a felhasználót végleg ki akarod tiltani, hagyd üresen a Vég mez4 t."); } html veg(); ?>

6.233 loginphp <?php include "alap.php"; function szulo e($pofa) { return(vansora(query("select * from szulok where szulo=$pofa;"))); }; //Tanárok, és a szakkört tartó diákok is!! function tanit e($pofa) { return(vansora(query("select * from tanitas where tanar=$pofa;"))); }; function diak e($pofa) {//ha valamelyik osztálynak tagja return ( vansora ( query ( "select * from csoport tagok ct,csoportok c ". "where ct.ember=$pofa " "and ct.csoport=ccsoport " "and c.tipus = 1;"))); }; function ofo e($pofa) {//ha valamelyik osztálynak vezet4 je return ( vansora ( query ( "select * from csoportok c ". "where c.vezeto=$pofa " "and c.tipus = 1;"))); }; function ofo szoveg() { sorki("Az osztályf4 nök által megoldható feladatok:"); sorki("<i>Az alábbi lehet4 ségeket tervezzük. </i><ul>" "<li>Osztályból kilép4 diák törlése a

névsorból,". "<li>osztályába járók adatainak javítása ". "<li>osztályába járók jegyeinek megtekintése ". "<li>utazáshoz diákigazolvány lista ". "<li>magukat regisztrált szül4 knek körlevél ". - 133 - 6.232 Az adatbázis program-részletei / Az adatbázis felületét adó kódok "<li>diákok, szül4 k címeinek listázása körlevél céljára ". "<li>osztályának tantárgy-átlagai ". "<li>osztáyl-honlap címének megadása". "</ul> "); }; function diak szoveg() { sorki("A diákok számára készített funkciók:"); sorki("<i>Az alábbi lehet4 ségeket tervezzük. </i><ul>" "<li><a href=dataedit.php>adataid módosítása</a> " "<li><a href=jegyek.php>" "jegyeid feletti búsulás / örvendezés</a> ". "<li><a

href=orarend.php>órarend tanulmányozása</a> " "<li><a href=gep valaszt.php>gépid4 foglalása</a> " "<li><a href=isknaptar.php>iskolai naptár megtekintése</a> " "<li>osztály-körlevél írása ". "<li>osztálytársak címeinek listázása körlevél céljára ". "<li>osztályod tantárgy-átlagai ". "<li>osztály-honlap olvasgatása". "</ul> "); }; function szulo szoveg() { sorki("A szül4 k számára készített funkciók:"); sorki("<i>Az alábbi lehet4 ségeket tervezzük. </i><ul>" "<li><a href=dataedit.php>saját adatai módosítása</a> " "<li><a href=jegyek.php>" "a gyermek jegyei feletti búsulás / örvendezés</a> ". "<li><a href=orarend.php>órarend tanulmányozása</a> " "<li><a

href=isknaptar.php>iskolai naptár megtekintése</a> " "<li>szül4 i-körlevél írása ". "<li>osztálytársak szülei címeinek listázása körlevél céljára ". "<li>az osztly tantárgy-átlagai ". "<li>osztály-honlap olvasgatása". "</ul> "); }; function tanar szoveg() { sorki("A tanárok számára készített funkciók:"); sorki("<i>Az alábbi lehet4 ségeket tervezzük. </i><ul>" "<li>jegyek beírása, javítása ". "<li>gépes röpdolgozat iratása ". "<li>tanmenet készítése ". "<li>ülésrend készítése ". "<li>körlevél az órára járó diákoknak ". "<li>tanított diákok címeinek listázása körlevél céljára ". "</ul> "); }; function vendeg szoveg() { sorki("A vendégek számára készített funkciók:");

sorki("<i>Az alábbi lehet4 ségeket tervezzük. </i><ul>" "<li><a href=register.php?szulo=1>Új szül4 ként regisztrálja magát</a> " "<li><a href=register.php?diak=1>Új diákként regiszrálja magát</a> " "<li>A Gimnázium honlapja". "</ul> "); - 134 - 6.233 Az adatbázis program-részletei / Az adatbázis felületét adó kódok }; if(isset($user)) { session destroy(); session start(); session register("sessuser"); session register("sesspass"); $sessuser=$user; $sesspass=$pass; require "belep.php"; } if(!$sessuser OR $uj OR $ujra) { html kezd("PiarDB bejelentkezés"); menu("cimlap", "belepes", ""); cim("PiarDB bejelentkezés"); sorki("<b>Ha vendégként akar belépni:</b> felhasználó:vendeg, jelszó:piar"); form kezd($PHP SELF); tablazat kezd(2,

array("Felhasználó", "Jelszó"), "width=200"); tr kezd(); td("<input name=user>"); td("<input name=pass type=password>"); tr veg(); tablazat veg(); form veg(); } else //ha bejelentkezett: { html kezd("belépett"); menu("cimlap","belepes",""); if(ofo e($sessuser)){ofo szoveg();$be=1;}; if(diak e($sessuser)){diak szoveg();$be=1;}; if(tanit e($sessuser)){tanar szoveg();$be=1;}; if(szulo e($sessuser)){szulo szoveg();$be=1;}; if($sessuser == "vendeg" ){vendeg szoveg();$be=1;}; sorki("<b>Jelenleg bejelentkezett felhasználó:</b> $sessuser"); } html veg(); ?> 6.234 login functionphp <? function vanilyen($login) { $res=query("select ember,nev from emberek where ember=$login". " union select ember,nev from emberek tmp where ember=$login"); if (vansora($res)) { $ret=pg fetch row($res,0); - 135 - 6.233 Az adatbázis

program-részletei / Az adatbázis felületét adó kódok 6.234 echo $ret[1]." (" $ret[0]")<br> "; }; return (vansora($res)); } function nevtologin ($nev) { $nevek=explode( ,$nev); $veznev=$nevek[0]; $kernev=$nevek[1]; $ujveznev = strtr($veznev, "ÁáÉéÍíÓóÖö 576 ÚúÜü 8:9 ?","aaeeiioooooouuuuuuo"); $ujkernev = strtr($kernev, "ÁáÉéÍíÓóÖö 5;6 ÚúÜü 8<9 ?","aaeeiioooooouuuuuuo"); $login=strtolower(substr($ujveznev,0,7).substr($ujkernev,0,1)); if(vanilyen($login)) { $login=strtolower(substr($ujveznev,0,8)); if(vanilyen($login)) { $login=strtolower(substr($ujveznev,0,4).substr($ujkernev,0,4)); if(vanilyen($login)) { $login=strtolower(substr($ujveznev,0,3).substr($ujkernev,0,3)); if(vanilyen($login)) { $login=strtolower(substr($ujveznev,0,1).substr($ujkernev,0,7)); $num=1; while (vanilyen($login)) { $login=strtolower(substr($ujveznev,0,6)).$num; ++$num; } } } }} return($login); } ?> 6.235

menuphp <?php function menupont($text, $url, $nev, $aktiv,$szin) { if($aktiv==$nev) { echo "<td class=menu width=150 background="img/active menu $szin.png"> " ."<div class=menu>$text</div></td> "; } else { echo "<td class=menu width=150><div class=menu> " ."<a href="$url" class=menu>$text</a></div></td> "; } } function menu kiir($menu, $aktiv,$szin) { - 136 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok echo "<table align=left cellspacing=0 cellpadding=0> <tr>"; for($i=0; $menu[$i]; $i+=3) { if($menu[$i]=="-") { echo "</tr> <tr>"; } else { menupont($menu[$i], $menu[$i+1], $menu[$i+2], $aktiv,$szin); } } echo "</tr></table>"; } function spec menu($aktiv, $almenu, $almenu aktiv,$szin) { include "menu/fomenu.php"; if(DISABLE) { $kep="logo

5.gif"; } else { $kep="img/logo $szin.png"; } echo "<table width="100%" border=0 rows=3 cols=2 ". "cellspacing=0 cellpadding=0 background="img/menu hatter $szin.png">" " <tr><td><img src="$kep"></td><td>"; menu kiir($fomenu, $aktiv,$szin); if($almenu) { echo "<tr><td colspan=2>"; menu kiir($almenu, $almenu aktiv,$szin); echo "</td></tr>"; } echo "</table>"; } function menu($aktiv, $almenu aktiv,$szin) { include "menu/$aktiv.php"; spec menu($aktiv, $almenu, $almenu aktiv,$szin); } ?> 6.236 naptarphp <?php function naptar($ev, $ho, $nap, $kovetkezo) { global $honapok; if(!checkdate($ho, $nap, $ev)) { $nap=1; } - 137 - 6.235 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.236 if($ho==1) { $elozo ho=12; $elozo ev=$ev-1; } else { $elozo ho=$ho-1; $elozo ev=$ev; } echo

"<center><h3>"; balra("$kovetkezo?ev=$elozo ev&ho=$elozo ho&nap=$nap"); echo "$ev. "$honapok[$ho-1]" "; if($ho==12) { $kov ho=1; $kov ev=$ev+1; } else { $kov ho=$ho+1; $kov ev=$ev; } jobbra("$kovetkezo?ev=$kov ev&ho=$kov ho&nap=$nap"); echo "</h3></center> "; $tstamp=mktime(0, 0, 0, $ho, 1, $ev); $elso nap=strftime("%u", $tstamp); $regi het=strftime("%W", $tstamp); tablazat kezd(7, array("H", "K", "Sz", "Cs", "P", "Szo", "V"), "border=1 width=1"); echo "<tr>"; for($i=1; $i<$elso nap; $i++) echo "<td>&nbsp;</td>"; for($i=1; $i<32; $i++) { if(!checkdate($ho, $i, $ev)) { break; } $most tstamp=mktime(0, 0, 0, $ho, $i, $ev); $most het=strftime("%W", $most tstamp); if($most het>$regi het) { echo "</tr> <tr> ";

$regi het=$most het; } if($i==$nap) { echo "<td bgcolor=#000099><b><font color=white size=-1>$i</font></b></td> "; } else { echo "<td bgcolor=#cccccc><font size=-1><a href="$kovetkezo?ev=$ev&ho=$ho&nap=$i">$i</font></td> "; } } $utolso nap=strftime("%u", $most tstamp); for($i=$utolso nap; $i<7; $i++) { echo "<td>&nbsp;</td>"; } echo "</tr> "; tablazat veg(); - 138 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok } ?> 6.237 nincsphp <? include "alap.php"; html kezd("Hiba"); hiba("Ez az oldal még nem készült el."); html veg(); ?> 6.238 orarendphp html kezd("Órarend"); if($sessuser==vendeg) {menu("cimlap","",""); sorki("Az iskola órarendjét csak a tanárok, diákok és szüleik nézhetik".

"meg."); sorki("Ha ön tagja valamelyik csoportnak, akkor regisztrálja magát."); html veg(); exit; } if (isset($terem)) { menu("orarend", "terem",""); kiscim(sql get val("select nev from termek where terem=$terem"). " beosztása"); orarend("terem","$terem"); html veg(); exit; } if (isset($tanar)) { menu("orarend", "tanar",""); kiscim(sql get val("select nev from emberek where ember=$tanar") ." tanár órarendje"); orarend("tanar","$tanar"); html veg(); exit; } if (isset($csoport)) { if(!vansora(query("select csoport from csoportok". " where csoport = $csoport and tipus = 1"))) $csoport = sql get val("select c.csoport " "from csoportok c,alcsoportok a ". "where c.tipus=1 and afocsoport=ccsoport " "and a.alcsoport=$csoport"); menu("orarend",

"osztaly",""); kiscim(sql get val("select nev from csoportok where csoport=$csoport"). " osztály órarendje"); orarend("csoport","$csoport"); html veg(); - 139 - 6.236 Az adatbázis program-részletei / Az adatbázis felületét adó kódok exit; } if(isset($mode)) { if($mode=="tanar") { menu("orarend", "tanar",""); cim("Tanár órarendjének kiválasztása"); $res=query("select distinct e.ember,nev from tanitas t, emberek e " " where e.ember=ttanar order by nev;"); tablazat kezd(2, array("azonosito","tanár neve"), "width=300"); result tablazat($res, "tanar", "orarend.php?"); tablazat veg(); html veg(); exit; } if($mode=="osztaly") { menu("orarend", "osztaly",""); cim("Osztály órarendjének kiválasztása"); $res=query("select csoport,c.nev,enev

from csoportok c,emberek e" " where c.vezeto=eember and tipus=1 order by csoport;"); tablazat kezd(3, array("azonosito","osztály","osztályf4 nok"), "width=300"); result tablazat($res, "csoport", "orarend.php?"); tablazat veg(); html veg(); exit; } if($mode=="terem") { menu("orarend", "terem",""); cim("terem beosztása"); $res=query("select terem,nev from termek order by nev;"); tablazat kezd(3, array("azonosito","terem"),"width=300"); result tablazat($res, "terem", "orarend.php?"); tablazat veg(); html veg(); exit; } } $res=query("select tanar from tanitas where tanar=$sessuser;"); if(vansora($res)) { menu("orarend", "orarend",""); kiscim(sql get val("select nev from emberek where ember=$sessuser") ." tanár órarendje");

orarend("tanar","$sessuser"); } - 140 - 6.238 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.238 $res=query("select ct.csoport from csoport tagok ct, csoportok ck where ember=$sessuser and tipus=1 and ck.csoport=ctcsoport;"); if(vansora($res)) { menu("orarend", "orarend",""); $ret=pg fetch row($res,0); kiscim(sql get val("select nev from emberek where ember=$sessuser")." diák órarendje"); orarend("csoport",$ret[0]); } html veg(); ?> 6.239 osztalyjegyphp <?php define("SORTAV","22"); define("TANH","70"); $font=1; define("MAXNEV","25"); include "alap.php"; require "belep.php"; if(!$ember) { $ember=$sessuser; } if(!$oszt) { exit; } $restantargy=query ("select distinct t.tantargy from tanitas t,alcsoportok a,jegyek j where ((a.focsoport=$oszt and aalcsoport=tcsoport) or

tcsoport=$oszt) and jtantargy=ttantargy;"); //$restantargy=query ("select distinct tantargy from tanitas where csoport=$oszt"); $tantargyszam=pg numrows($restantargy); for ($i=0;$i<$tantargyszam;$i++) { $sor=pg fetch row($restantargy,$i); $tantargyak[$i]=$sor[0]; } $resoszt=query ("select distinct e.ember,nev from emberek e, csoport tagok c where c.csoport=$oszt and cember=eember order by enev;"); $osztalyletszam=pg numrows($resoszt); $y=$osztalyletszam*SORTAV; $x=TANH*$tantargyszam+MAXNEVimagefontwidth($font) + 40; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 255, 255, 255); $jegyszin[1]=ImageColorAllocate ($im, 0, 0, 0); $jegyszin[2]=ImageColorAllocate ($im, 255, 0, 0); $jegyszin[3]=ImageColorAllocate ($im, 0, 0, 255); $jegyszin[4]=ImageColorAllocate ($im, 200, 200, 0); $jegyszin[5]=ImageColorAllocate ($im, 0, 255, 0); $vilagosszin = ImageColorAllocate ($im, 240, 240, 240);

$sotetszin = ImageColorAllocate ($im, 15, 15, 15); $fekete = ImageColorAllocate ($im, 0, 0, 0); - 141 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.239 $feher = ImageColorAllocate ($im, 255,255,200); $text color = ImageColorAllocate ($im, 233, 14, 91); // Jegyek $res=query("select evkezd, felev, evveg from iskolaevek where evkezd<=now and evveg>=now;"); $tanev=pg fetch array($res, 0); // Félév megállapítása $felevutan=sql get val("select date gt(now, ".$tanev["felev"]");"); if($felevutan==t) { $felev kezd=$tanev["felev"]; $felev veg=$tanev["evveg"]; } else { $felev kezd=$tanev["evkezd"]; $felev veg=$tanev["felev"]; } for ($j=0;$j<$osztalyletszam;$j++) { $sor=pg fetch row($resoszt,$j); $ember=$sor[0]; imagestring($im,1,2,$j*SORTAV+3,$sor[1],$fekete); $hanyatlag=0;$atlagosszeg=0; for($u=0;$u<$tantargyszam;$u++) { $tantargy=$tantargyak[$u]; unset($jegy);

unset($nincs jegy); unset($felev atlag); $resa=query("select jegy, sulyozas, datum, ok, id from jegyek where ". "diak=$ember and datum>=$felev kezd and datum<=$felev veg ". "and tantargy=$tantargy ". "order by datum;"); if(!pg numrows($resa)) { if(!$tanar e) { } $nincs jegy=1; } $jegyszam=0;$osszsuly=0;$osszjegy=0; for($ia=0; $ia<pg numrows($resa); $ia++) { $sor=pg fetch row($resa, $ia); $osszsuly += $sor[1]; $jegyszam++; $osszjegy+=$sor[0]; $jegy[$ia][0]=$sor[0]; $jegy[$ia][1]=$sor[1]; $jegy[$ia][2]=1.0*$osszjegy/$osszsuly; // echo $jegy[$ia][2]."<br> "; } if(!$nincs jegy) { /* súlyozott átlag / - 142 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.239 $felev atlag=sql get val("select jegy atlag($ember, $tantargy, $f elev kezd, $felev veg);"); $ev atlag=sql get val("select jegy atlag($ember, $tantargy,"

.sqlstr($tanev["evkezd"])sqlstr2($tanev["evveg"])");"); for($k=0;$k<$jegyszam;$k++) { for($l=0;$l<$jegy[$k][1]*3;$l++) { imageline ($im,$u*TANH+MAXNEVimagefontwidth($font)+1+$k4+$l, ($j+1)*SORTAV, $u*TANH+MAXNEVimagefontwidth($font)+1+$k4+$l, -$jegy[$k][0]*3+($j+1)SORTAV, $jegyszin[$jegy[$k][0]]); imagesetpixel($im,$u*TANH+MAXNEVimagefontwidth($font)+1+$k4+$l, -$jegy[$k][2]*3+($j+1)SORTAV,$fekete); } } $hanyatlag++;$atlagosszeg+=$felev atlag; } ImageString ($im, 1,$u*TANH+MAXNEVimagefontwidth($font),$jSORTAV, "$tantargy:".substr($felev atlag,0,4), $fekete); imageline($im,0,$j*SORTAV,$x,$jSORTAV,$fekete); # echo "$hanyatlag ++; $atlagosszeg += $felev atlag<br>"; } if($hanyatlag) {$gyerekatlag=1.0*$atlagosszeg/$hanyatlag;} ImageString ($im, 2,$tantargyszam*TANH+MAXNEVimagefontwidth($font),$jSORTAV,substr($gyerekatlag,0,4), $fekete); } Header("Content-type: image/png"); ImagePng ($im); ?> 6.240 osztalyokphp

<?php include "alap.php"; include "belep.php"; html kezd("Osztályok"); menu("dataedit", "osztalyok", ""); if(!csoport tag vagyok e("ember admin")) { $osztaly=sql get val("select csoportok.csoport from " "csoport tagok,csoportok where ". - 143 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok "csoportok.csoport=csoport tagokcsoport and " "ember=$sessuser and veg=null and tipus=1;"); } if(!isset($osztaly)) { sorki("Válaszd ki az osztályt:"); tablazat kezd(2, array("Osztály", "Osztályf4 nök"), "width=300"); sql link tablazat("select csoport, emberek.nev from csoportok, emberek" " where vezeto=ember and tipus=1 order by csoport;", "osztaly", "osztalyok.php?"); tablazat veg(); html veg(); exit; } tablazat kezd(3, array("Név", "Adatok",

"Fénykép"), "width=100%"); $res=query("select nev, cim, telotth, mobil, emberek.ember " "from emberek, ember adatok ". "where emberek.ember=ember adatokember and emberekember in " "(select ember from csoport tagok where veg=null and csoport=$osztaly)". " order by nev;"); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td("<b>Cím:</b> $sor[1] <br><b>Telefon:</b> $sor[2] <br>". "<b>Mobil:</b> $sor[3]"); $arcstr="<img src="kisarc.php?ember=$sor[4]">"; if(file exists(($str="arcok/$sor[4].jpeg"))) { td("<center><a href="$str">$arcstr</a></center>"); } else { td("<center>$arcstr</center>"); } tr veg(); } tablazat veg(); html veg(); ?> 6.241 osztalyzoivphp <?php include "alap.php"; require

"belep.php"; //Header("Content-type: image/png"); if(!$ember) { $ember=$sessuser; } if(!($csoport and $tantargy)) { exit; - 144 - 6.240 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.241 } $res00=query("select distinct ember from csoport tagok where csoport=$csoport;"); for($o=0;$o<pg numrows($res00);$o++) { list($ember)=pg fetch row($res00,$o); echo "<b>$ember:</b>"; // Jegyek if(isset($tantargy)) { $res=query("select evkezd, felev, evveg from iskolaevek where evkezd<=now and evveg>=now;"); $tanev=pg fetch array($res, 0); $tantargynev=sql get val("select nev from tantargyak where tantargy=$tantargy"); // Félév megállapítása $felevutan=sql get val("select date gt(now, ".$tanev["felev"]");"); if($felevutan==t) { $felev kezd=$tanev["felev"]; $felev veg=$tanev["evveg"]; } else { $felev kezd=$tanev["evkezd"];

$felev veg=$tanev["felev"]; } // Táblázat $nincs jegy=0; $res=query("select jegy, sulyozas, datum, ok, id from jegyek where ". "diak=$ember and datum>=$felev kezd and datum<=$felev veg ". "and tantargy=$tantargy ". "order by datum;"); if(!pg numrows($res)) { if(!$tanar e) { } $nincs jegy=1; } null); // tablazat kezd(4+$tanar e, array("Jegy", "Súlyozás", "Dátum", "Ok", "M 3 velet"), $jegyszam=0;$osszuly=0;$osszjegy=0; for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); // tr kezd(); // echo($sor[0]); //td($sor[1]); $osszsuly += $sor[1]; $jegyszam++; $osszjegy+=$sor[0]; $jegy[$i][0]=$sor[0]; $jegy[$i][1]=$sor[1]; $jegy[$i][2]=1.0*$osszjegy/$osszsuly; //td(date to text($sor[2])); - 145 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.241 //td($sor[3]); //tr veg(); } //tablazat veg(); if(!$nincs jegy) { $y=20; $x=$osszsuly * 4

+ $jegyszam + 20; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 200, 200, 200); $vilagosszin = ImageColorAllocate ($im, 240, 240, 240); $sotetszin = ImageColorAllocate ($im, 15, 15, 15); $fekete = ImageColorAllocate ($im, 0, 0, 0); $feher = ImageColorAllocate ($im, 255,255,200); /* súlyozott átlag / $felev atlag=sql get val("select jegy atlag($ember, $tantargy, $f elev kezd, $felev veg);"); $ev atlag=sql get val("select jegy atlag($ember, $tantargy," .sqlstr($tanev["evkezd"])sqlstr2($tanev["evveg"])");"); $text color = ImageColorAllocate ($im, 233, 14, 91); for($k=0;$k<$jegyszam;$k++) {$merete=$jegy[$k][1] *3; echo "<font size=$merete>".$jegy[$k][0]"("$jegy[$k][1]")</font> "; } //ImageString ($im, 1, $x-17, 5, "$felev atlag", $text color); echo "<b>$felev atlag</b><br>";

//imageline($im,0,0,0,$y-2,$vilagosszin); //imageline($im,0,0,$x-2,0,$vilagosszin); //imageline($im,$x-1,$y-1,$x-1,1,$sotetszin); //imageline($im,$x-1,$y-1,1,$y-1,$sotetszin); //ImagePng ($im); // sorki("$felev atlag jegye van"); //sorki("<b>Jegyek átlaga ebben a félévben:</b> $felev atlag"); //sorki("<b>Jegyek átlaga egész évben:</b> $ev atlag"); } else{ $y=20; $x=30; $im=imagecreate($x,$y) or die ("Cannot Initialize new GD image stream"); $background color = ImageColorAllocate ($im, 200, 200, 200); $text color = ImageColorAllocate ($im, 233, 14, 91); //ImageString ($im, 1, 2, 5, "nincs", $text color); echo "nincs jegye($ember,$tantargy)<br> "; //ImagePng ($im); } } }//ember léptetése //html veg(); ?> - 146 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.242 6.242 privacyphp <?php include "alap.php"; html kezd("Adatvédelmi

nyilatkozat"); menu("sugo","",""); cim("Adatvédelmi nyilatkozat"); sorki("A Piarista Gimnázium adatbázisa harmadik félnek nem szolgáltatja ki a regisztráláskor vagy kés4 bb megadott adatokat. Ezek a iskolán belüli kommunikációt szolgálják az alábbiak szerint"); alcim("A részletek"); sorki("A diákok nevét és belépési nevét bárki láthatja (szül4 -regisztrációs oldalon)."); sorki("Diákok email-címét tanáraik, szülei, osztálytársaik és szakkör-társaik látják."); sorki("Diákok személyes adatait (telefonszámai, lakcíme, diakigazolvány-száma) csak az osztályf4 nöke, és a diák maga látja."); sorki("Diákok jegyeit látja: 4 maga, szülei és tanárai. Egymás jegyeit nem látják, csak egymás tantárgy-átlagait látják az osztálytársak."); sorki("Szül4 k személyes adatait (telefonszámai, lakcíme) csak a diák osztályf 4 nöke,

és a szül4 maga látja."); sorki("Szül4 k email címeit azok a szül 4 -társak látják, akikkel közös osztályba jár gyermekük."); sorki("Az iskolai naptárat és órarendet a diákok, tanárok és szül 4 k látják. A naptári bejegyzésknél ezen belül lehet szabályozni a láthatóságot."); sorki("<br>Ha azt tapasztalja, hogy a fenti szabályok nem teljesülnek, akkor kérem írjon ".ERTESIT""); html veg(); ?> 6.243 registerphp <?php include "alap.php"; require "belep.php"; include "login function.php"; function varakoz uzenet() { sorki("Regisztrálása sikeres volt."); sorki(" Most meg kell várnia, míg jelentkezését jóváhagyjuk."); } function ertesit uzenet($email,$ember) { if($email) { sorki("Err4 l a megadott ($email) címen fog értesítést kapni."); } else { sorki("Mivel nem adott meg email címet, így jelentkezésének

jóváhagyásáról nem tudunk". " éresítést küldeni.<br> Néhány nap mulva próbálja ki, hogy be tud-e lépni a kapott" " belépési névvel ($ember) és a megadott jelszóval."); } } html kezd("Új diák vagy szül4 felvétele"); if($sessuser != "vendeg") { menu("cimlap","",""); - 147 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.243 sorki("De hiszen már $sessuser azonosítóval már belépél!!"); sorki("Új diák vagy szül= regisztrálásához vendeg néven kell belépni."); vissza("cimlap.php"); html veg(); exit; } if(!isset($ujuser) and !isset($ujszulo)) { if(isset($diak)) { menu("cimlap", "ujdiak",2); cim("Új diák adatainak felvétele"); // aktuális osztályaink listája $res=query("select csoport, emberek.nev from csoportok,emberek where tipus=1 and ember=vezeto order by

csoport;"); kiscim("Melyik osztályba jársz?"); tablazat kezd(2, array("osztály", "osztályf = nök"), "width=300"); result tablazat($res, "ujosztaly", "register.php?"); tablazat veg(); } if(isset($szulo)) { menu("cimlap", "ujszulo",2); //Kiválasztja, hogy kinek a szül= je // Aktuális diákjaink listája $res=query("select distinct e.ember, enev from emberek e,csoportok c,csoport tagok ct where tipus=1 and c.csoport = ctcsoport and ct.ember=eember order by nev;"); cim("Szül= , gondvisel = regisztrálása"); kiscim("Ki az ön gyermeke?"); sorki("Ha több gyermeke is diákunk, akkor most egyiküket jelölje meg." " A többieket majd els = belépésekor tudja megadni."); tablazat kezd(2, array("azonosítója", "neve"), "width=300"); result tablazat($res, "gyereke", "register.php?"); tablazat veg(); }

// Ha már tudjuk, hogy kinek a gyermeke if(isset($gyereke)) { menu("cimlap","ujszulo",2); $ret=query("select e.nev,eember from szulok s, emberek e where sgyerek=$gyereke and e.ember=sszulo"); if (pg numrows($ret)){ kiscim("A diáknak már regisztráltak szül= t:"); tablazat kezd(2, array("szül = neve", "azonosítója"), "width=300"); result tablazat($ret,"",""); tablazat veg(); } cim(sql get val("select nev from emberek where ember=$gyereke;")." szül= je regisztrálja magát"); sorki("Csak a nevet és a jelszót kötelez= kitölteni. Az e-mail címet is célszer > megadni"); - 148 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.243 form kezd($PHP SELF); tablazat kezd(3, array("kérdés", "válasz","megjegyzés"), null); tr kezd(); td("Kérem adja meg saját nevét:");td( "<input

type=hidden name=ujszulo value=1>". "<input type=hidden name=ujgyerek value=$gyereke>". "<input name=nev>*"); td("kis- és nagybet ? ket vegyesen használjon");tr veg(); tr kezd(); td("Címe:");td("<input name=cim>"); td("Akkor érdemes megadni, ha nem él gyermekével egy helyen.");tr veg(); tr kezd(); td("Otthoni telefon:");td("<input name=telotth>"); td("vezetékes telefon, <br>vagy ennek hiányában mobil szám");tr veg(); tr kezd(); td("Munkahelyi telefon:");td("<input name=telmh>"); td("munkahelyi szám");tr veg(); tr kezd(); td("Mobil telefonszáma:");td("<input name=mobil>"); td("Nemzetközi formában szóköz nélkül <br>ide kérhet SMS értesítést ". "(pl +36204322516)");tr veg(); tr kezd(); td("Email címe:");td("<input name=email>");

td("Ide kaphat automatikus értesítéseket, <br>valamint a szül@ knek szánt körleveleket.");tr veg(); tr kezd(); td("Titkos jelszava:");td("<input type=password name=pwd1>*"); td("Ne legyen benne ékezet vagy szóköz, legalább 8 hosszú." "<br> Ez lesz az ön jelszava, amelyet soha senkinek ne áruljon el." ." Ne alkalmazzon másútt használt értékes jelszót "); tr veg(); tr kezd(); td("Titkos jelszava mégegyszer:");td("<input type=password name=pwd2>*"); td("Azért kell ugyanazt mégegyszer begépelni, hogy nehogy elgépelje.");tr veg(); tablazat veg(); form veg(); } // Tagok if(isset($ujosztaly)) { menu("cimlap", "ujdiak",2); if(!isset($ujalcsoport)) $res=query("select alcsoport,c.nev from alcsoportok a,csoportok c where focsoport=$ujosztaly and c.csoport=aalcsoport;"); if(vansora($res)) { kiscim("Melyik csoportba

tartozol?"); tablazat kezd(2, array("csop.azonosító", "csop neve"), "width=300"); result tablazat($res, "ujalcsoport", "register.php?ujosztaly=$ujosztaly&"); tablazat veg(); vissza("cimlap.php"); html veg(); exit; } - 149 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok cim("Új diák adatainak felvétele $ujosztaly $ujalcsoport"); //Kilistázzuk, hogy kik a jóváhagyott tagok kiscim("A jóváhagyott tagok listája:"); if(isset($ujalcsoport)) { $res=query("select emberek.ember, nev, kezdet from csoport tagok, emberek where csoport=$ujalcsoport and veg=null and csoport tagok.ember=emberekember order by ember;"); if(vansora($res)) {kiscim("$ujosztaly osztály $ujalcsoport csoportjának regisztrált tagjai:");}; }else { $res=query("select emberek.ember, nev, kezdet from csoport tagok, emberek where csoport=$ujosztaly and veg=null and csoport

tagok.ember=emberekember order by ember;"); if(vansora($res)) {kiscim("$ujosztaly osztály regisztrált tagjai:");}; } if(vansora($res)) { tablazat kezd(3, array("Felhasználó", "Név", "Mikortól"), null); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td($sor[1]); td(date to text($sor[2])); $ujalcsoport res=query("select alcsoport tag e($sor[0], $csoport);"); $ujalcsoport tag=pg fetch row($ujalcsoport res, 0); tr veg(); } tablazat veg(); }else { sorki("Még egy tag sincs ide regisztrálva."); } //Kilistázzuk, hogy kik a jóváhagyandó tagok kiscim("A regisztrált, és jóváhagyásra váró tagok listája:"); if(isset($ujalcsoport)) { $res=query("select e.ember, nev, kezdet from csoport tagok real tmp c, emberek tmp e where csoport=$ujalcsoport and veg=null and c.ember=eember order by nev;"); if(vansora($res)) {kiscim("$ujosztaly osztály

$ujalcsoport csoportjának regisztrált tagjai:");}; }else { $res=query("select e.ember, nev, kezdet from csoport tagok real tmp c, emberek e where csoport=$ujosztaly and veg=null and - 150 - 6.243 Az adatbázis program-részletei / Az adatbázis felületét adó kódok c.ember=eember order by nev;"); if(vansora($res)) {kiscim("$ujosztaly osztály regisztrált tagjai:");}; } if(vansora($res)) { tablazat kezd(3, array("Felhasználó", "Név", "Mikortól"), null); for($i=0; $i<pg numrows($res); $i++) { $sor=pg fetch row($res, $i); tr kezd(); td($sor[0]); td($sor[1]); td(date to text($sor[2])); $ujalcsoport res=query("select alcsoport tag e($sor[0], $csoport);"); $ujalcsoport tag=pg fetch row($ujalcsoport res, 0); tr veg(); } tablazat veg(); }else { sorki("Senki nem vár jóváhagyásra."); } form kezd($PHP SELF); tablazat kezd(3, array("kérdés", "válasz","megjegyzés"),

null); tr kezd(); td("Neved:");td( "<input type=hidden name=ujuser value=1>". "<input type=hidden name=ujosztaly value=$ujosztaly>". "<input type=hidden name=ujalcsoport value=$ujalcsoport>". "<input name=nev>*"); td("kis- és nagybet A ket vegyesen használj");tr veg(); tr kezd(); td("Születésed dátuma");td("<input name=szul>*"); td("<B>Ebben a formában: 1986-2-12</b>");tr veg(); tr kezd(); td("Címed:");td("<input name=cim>*"); td("ahol most laksz");tr veg(); tr kezd(); td("Otthoni telefon");td("<input name=telotth>"); td("vezetékes otthoni telefonszámotok");tr veg(); tr kezd(); td("Mobil telefonod száma:");td("<input name=mobil>"); td("Nem a papádé, a tied száma kell! Nemzetközi formában szóköz nélkül". "(pl

+36204322516)");tr veg(); tr kezd(); td("Diákigazolvány szám:");td("<input name=diakig>"); td("diákigazolványod száma");tr veg(); tr kezd(); td("Email címed:");td("<input name=email>"); td("Ha otthonról szoktál te magad személyesen valamilyen címet használni.");tr veg(); tr kezd(); - 151 - 6.243 Az adatbázis program-részletei / Az adatbázis felületét adó kódok td("Titkos jelszavad:");td("<input type=password name=pwd1>*"); td("Ne legyen benne ékezet vagy szóköz. Legalább <b>8</b> betü hosszú! Ez lesz a titkos jelszavad, amelyet soha senkinek nem szabad elmodndanod. ");tr veg(); tr kezd(); td("Titkos jelszavad mégegyszer:");td("<input type=password name=pwd2>*"); td("Azért kell ugyanazt mégegyszer begépelni, hogy nehogy elrontsd.");tr veg(); tablazat veg(); form veg(); } ?> <?php }

if(isset($ujuser)) { $jo=1; menu("cimlap", "ujdiak",2); if(!isset($nev) or (($aa=strlen($nev)) <5)) {alcim("A név túl rövid ($aa karakter). Legalább 5 bet A legyen");$jo=0;}; if(!isset($szul) or (($aa=strlen($szul)) <5)) {alcim("Születési dátumod hiányzik, vagy hibás!");$jo=0;}; if(!isset($cim) or (($aa=strlen($cim)) <5)) {alcim("Címedet nem adtad meg.");$jo=0;}; $ember=nevtologin($nev); if(($aa=strlen($pwd1)) <8){alcim("A jelszó túl rövid ($aa karakter).");$jo=0;}; if($pwd1 != $pwd2){alcim(A két jelszó különbözik);$jo=0;}; if($jo) { $res=query("insert into emberek tmp ". "(ember, nev, cim, szuletes,mobil,diakig,telotth,email) ". "values (". sqlstr($ember). sqlstr($nev).sqlstr($cim)sqlstr($szul) sqlstr($mobil).sqlstr($diakig)sqlstr($telotth) sqlstr2($email). ");"); } if(!$jo OR !$res) { hiba("A felhasználó adatainak felvétele sikertelen"); form

kezd($PHP SELF); tablazat kezd(3, array("kérdés", "válasz","megjegyzés"), null); tr kezd(); td("Neved:");td( "<input type=hidden name=ujuser value=1>". "<input type=hidden name=ujosztaly value=$ujosztaly>". "<input type=hidden name=ujalcsoport value=$ujalcsoport>". "<input name=nev value="$nev">*"); td("kis- és nagybet A ket vegyesen használj");tr veg(); tr kezd(); td("Születésed dátuma");td("<input name=szul value="$szul">*"); td("<B>Ebben a formában: 1986-2-12</b>");tr veg(); tr kezd(); td("Címed:");td("<input name=cim value="$cim">*"); td("ahol most laksz");tr veg(); tr kezd(); - 152 - 6.243 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.243 td("Otthoni telefon");td("<input name=telotth

value="$telotth">"); td("vezetékes otthoni telefonszámotok");tr veg(); tr kezd(); td("Mobil telefonod száma:");td("<input name=mobil value="$mobil">"); td("Nem a papádé, a tied száma kell! Nemzetközi formában szóköz nélkül". "(pl +36204322516)");tr veg(); tr kezd(); td("Diákigazolvány szám:");td("<input name=diakig value="$diakig">"); td("diákigazolványod száma");tr veg(); tr kezd(); td("Email címed:");td("<input name=email value="$email">"); td("Ha otthonról szoktál te magad személyesen valamilyen címet használni.");tr veg(); tr kezd(); td("Titkos jelszavad:");td("<input type=password name=pwd1>*"); td("Ne legyen benne ékezet vagy szóköz. Ez lesz a titkos jelszavad, amelyet soha senkinek nem szabad elmodndanod. ");tr veg(); tr kezd(); td("Titkos

jelszavad mégegyszer:");td("<input type=password name=pwd2>*"); td("Azért kell ugyanazt mégegyszer begépelni, hogy nehogy elrontsd.");tr veg(); tablazat veg(); form veg(); } else { $res=query("insert into passwd tmp". " values($ember,$pwd1)"); $res=query("insert into csoport tagok real tmp". " values($ujosztaly,$ember,now)"); if($ujalcsoport) { $res=query("insert into csoport tagok real tmp". " values($ujalcsoport,$ember,now)"); } alcim("</b>Belépési neved: <b>$ember</b>"); varakoz uzenet(); ertesit uzenet($email,$ember); $res=query("select * from emberek tmp where ember=$ember;"); if(!$res) { hiba("Rossz lekérdezés: $sql"); } else { $fejlec=array(); for($i=0; $i<pg numfields($res); $i++) { $fejlec[$i]=pg fieldname($res, $i); } tablazat kezd($i, $fejlec, null); result tablazat($res, null, null); tablazat veg(); } } } if(isset($ujszulo))

- 153 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok { menu("cimlap", "ujszulo",2); if(!isset($nev) or (($aa=strlen($nev)) <5)) {alcim("A név túl rövid ($aa karakter). Legalább 5 bet ? legyen");exit;}; $ember=nevtologin($nev); if(($aa=strlen($pwd1)) <8){alcim("A jelszó túl rövid ($aa karakter).");exit;}; if($pwd1 != $pwd2){sorki(A két jelszó különbözik);exit;}; $res=query("insert into emberek tmp ". "(ember, nev, cim, mobil,telotth,telmh,email) ". "values (". sqlstr($ember). sqlstr($nev).sqlstr($cim) sqlstr($mobil).sqlstr($telotth)sqlstr($telmh) sqlstr2($email). ");"); if(!$res) { hiba("A felhasználó adatainak felvétele sikertelen"); } else { $res=query("insert into passwd tmp". " values($ember,$pwd1)"); $res=query("insert into szulok tmp". " values($ember,$ujgyerek)"); alcim("</b>Belépési

neve: <b><font size=+2>$ember</font></b>"); varakoz uzenet(); ertesit uzenet($email,$ember); if($email) { mail("$email", "Kérelme megérkezett", "Kedves $nev ! A Piarista Gimnázium Adatbázisa". " megkapta az ön regisztrálási kérelmét. Kérjük várjon" " türelemmel az elbírálásra. A felvételr@ l ugyanitt fog értesítést" " kapni. Amennyiben kérdése van, írjon "ERTESIT ". az adatbázis készít@ i"); } mail(SZULOADMIN, "szuloi kerelem", "gyereke:$ujgyerek, neve:$nev, cime:$cim,email:$email"); $res=query("select * from emberek tmp where ember=$ember;"); if(!$res) { hiba("Rossz lekérdezés: $sql"); } else { $fejlec=array(); for($i=0; $i<pg numfields($res); $i++) { $fejlec[$i]=pg fieldname($res, $i); } tablazat kezd($i, $fejlec, null); result tablazat($res, null, null); tablazat veg(); } - 154 - 6.243 Az adatbázis

program-részletei / Az adatbázis felületét adó kódok } } html veg(); ?> 6.244 sqlshellphp <?php include "alap.php"; require "belep.php"; html kezd("SQL parancssor"); menu("admin", "sql",2); require "admin.php"; cim("SQL parancssor"); form kezd($PHP SELF); echo "<center><input size=60 name=sql value="$sql"> "; submit("Mehet"); echo "</center></form>"; if($sql) { $sql=preg replace("/\/", null, $sql); $res=query($sql); if(!$res) { hiba("Rossz lekérdezés: $sql"); } else { $fejlec=array(); for($i=0; $i<pg numfields($res); $i++) { $fejlec[$i]=pg fieldname($res, $i); } tablazat kezd($i, $fejlec, null); result tablazat($res, null, null); tablazat veg(); } } html veg(); ?> 6.245 ujuserphp <?php include "alap.php"; require "belep.php"; html kezd("Új felhasználó létrehozása");

menu("admin", "ujuser",2); require "admin.php"; form kezd($PHP SELF); ?> <ul> <li>Usernév: <input name=ujuser> - 155 - 6.243 Az adatbázis program-részletei / Az adatbázis felületét adó kódok 6.245 <li>Jelszó: <input type=password name=ujpass> <li>Név: <input name=nev> <li>Email: <input name=email> </ul> <?php if(isset($ujuser)) { // Teljesen lecserélve tranzakcióval // query("create user "$ujuser" with password "$pass";"); query("begin;"); $res=query("INSERT INTO pg shadow VALUES (".sqlstr($ujuser)"nextval(seq usesysid), f, f, f, f, ".sqlstr($ujpass)"NULL);"); if(!$res){ hiba("A felhasználó hozzáadása sikertelen"); query("rollback;"); } else { $res=query("insert into emberek (ember, nev, email) values (". sqlstr($ujuser).sqlstr($nev)sqlstr2($email)");");

if(!$res) { hiba("A felhasználó adatainak felvétele sikertelen"); query("rollback;"); } else { query("commit;"); sorki("User létrehozva "); } } } form veg(); html veg(); ?> 6.246 user foglalasokphp <?php include "alap.php"; require "belep.php"; html kezd("$ember felhasználó foglalásai"); menu("foglalas", "user foglalasok",""); if(!isset($ember)) { $ember=$sessuser; } if(isset($foglnap)) { query("delete from foglalasok where ember=$ember and nap=$foglnap and kezdet=$kezdet and veg=$veg and gep=$gep;"); } tablazat kezd(5, array("Dátum", "Kezdet", "Vég", "Gép", "Törlés"), null); $res=query("select nap, kezdet, veg, gep from foglalasok where nap >=now and ember=$ember;"); for($i=0; $i<pg numrows($res); $i++) - 156 - Az adatbázis program-részletei / Az adatbázis felületét adó kódok

6.246 { $sor=pg fetch row($res, $i); tr kezd(); td("$sor[0]"); td("$sor[1]"); td("$sor[2]"); td("$sor[3]"); if(csoport tag vagyok e("foglalas admin") or $ember==$sessuser) { if(isset($ev)) { td("<a href="user foglalasok.php?ev=$ev&ho=$ho&nap=$nap&foglnap=$sor[0]&kezdet=$sor[1]&veg=$sor[ 2]&gep=$sor[3]&ember=$ember">Törlés</a>"); } else { td("<a href="user foglalasok.php?foglnap=$sor[0]&kezdet=$sor[1]&veg=$sor[2]&gep=$sor[3]&ember=$em ber">Törlés</a>"); } } else { td("Törlés"); } tr veg(); } tablazat veg(); if(isset($ev)) { vissza("gep valaszt.php?ev=$ev&ho=$ho&nap=$nap"); } else { vissza("gep valaszt.php"); } html veg(); ?> - 157 -