Tartalomjegyzék

1. fejezet PHP-bevezető ............................................... 1
Áttekintés ......................................................................... 2
Programozási 1x1 ..................................................................... 3 Egy kis történelem ................................................................ 3 Hibakeresés ........................................................................... 5 A PHP előnyei ........................................................................... 5 Értelmezés kontra fordítás ....................................................... 5 Részkódok kontra programozás ............................................ 6 Kimenet-ellenőrzés .................................................................. 6 PHP4 ............................................................................................ 7 Új függvények .......................................................................... 7 Új név ...................................................................................... 7 Sebesség ............................................................................... 8 PHP-hibakereső ..................................................................... 8 A Windowsos COM .................................................................. 9 Reguláris kifejezések függvényei .......................................... 9 PHP és Apache............................................................................ 9 A platformfüggetlen Apache .................................................. 9 Modul vagy CGI .................................................................. 10 A PHP Zenje ............................................................................. 11 Szintaktika ........................................................................... 11 Ha, akkor, különben ............................................................ 12 A megfelelő adattípus .......................................................... 14 Szűkítsd a bejáratot, tágítsd a kijáratot .............................. 14

Gyors megoldások

..................................................... 15

Apache-konfiguráció ................................................................ 15 Egyedi Apache-függvények ..................................................... 15 apache_lookup_uri() ............................................................ 16 apache_note()........................................................................ 16 ascii2ebcdic() és ebcdic2ascii() ............................................. 17 getallheaders() .................................................................... 17 PHP-konfiguráció ...................................................................... 17 dl{) ....................................................................................... 17 extension_loaded() .............................................................. 18 Hibakeresés............................................................................... 18 assert() .................................................................................. 18 assert_options() .................................................................. 19 die() ..................................................................................... 19 Hibák ....................................................................................... 20 Naplózás .................................................................................... 20 Kimenet-ellenőrzés ................................................................ 20

Biztonság..................................................................................... 21 Reguláris kifejezések ................................................................. 21 ereg() .................................................................................... 21 ereg_replace() ......................................................................... 22 eregi() ...................................................................................... 22 eregij-eplace() ..................................................................... 23 split() ..................................................................................... 23 splitiQ .................................................................................... 23

2. fejezet: Adatok .............................................................25
Áttekintés ........................................................................ 26
Adattípusok .............................................................................. 26 Változók ................................................................................ 26 Automatikus létrehozás ........................................................... 27 Konstansok ............................................................................. 27 Hatókör.................................................................................... 28 Műveletek az adatokkal ........................................................... 28 Kifejezések .............................................................................. 29 Operátorok ............................................................................ 30 Ellenőrzés és szerkezet ....................................................... 37 Függvények ......................................................................... 44 Kategóriák és objektumok .................................................. 44 Adatok az adatbázisoknak ................................................... 44 Adatok a HTML-nek ............................................................. 44 Dátum és idő ............................................................................. 45 Julianus-dátum ...................................................................... 45 Idő ......................................................................................... 45 Naptár ..................................................................................... 46 Matematika ................................................................................ .48 Egész matematika ................................................................... 48 Lebegőpontos matematika ................................................... 49 Tetszőleges pontosságú matematika ...................................... 49

Gyors megoldások . ................................................... .51
Adatok létrehozása ..................................................................... 51 Sztring-adatok .......................................................................... 51 Egész és lebegőpontos adatok ............................................... 52 Adatok ellenőrzése .................................................................. 52 Adatkonvertálás .......................................................................... 55 Sztringfüggvények ...................................................................... 57 rand(), srand() és microtime() ................................................. 62 Dátum és idő kiszámítása .......................................................... 63 Húsvét ....................................................................................... 65

VI

3. fejezet: Tömbök .......................................................... 67
Áttekintés ........................................................................ 68
Egyszerű tömbök ................................................................... 68 A világ legegyszerűbb tömbje ........................................... 68 A tömböket O-tól számozzuk ............................................... 69 A tömb elemeit bárminek elnevezhetjük ........................... 70 Tömblétrehozó függvények ................................................. 71 Lehetséges problémák ....................................................... 71 Többdimenziós tömbök ......................................................... 72 A tömbmutató ........................................................................ 73 Tömbök rendezése ................................................................ 74 Push, Pop, Pad és Mérge ...................................................... 75 Push és Pop ....................................................................... 76 Pad .................................................................................... 76 Mérge..............................................^ ................................. 77

Gyors megoldások ........................................................ 78
Tömbök létrehozása listából az array()-jel .......................... 78 Tömbök létrehozása sztringböl az explode()-dal ............... 78 Tömbök létrehozása sztringböl az implode()-dal ............... 79 Elemi SQL ....................................................................... 79 select ............................................................................... 80 where ................................................................................. 80 order by ........................................................................... 80 group by............................................................................. 80 SQL építése ..................................................................... 80 Az adatok tartományának kijelölése a range() segítségével 83 Kulcstartomány kijelölése a range() és az array_flip() segítségével 84 Duplikát tömbértékek megszüntetése az array_flip{) segítségével 84 Tömb véletlenszerűsítése a shuffle() segítségével ................85 Bannerek véletlenszerűsítése az array_rand()-dal .............86 Fájl tömbbe olvasása a file() segítségével ..........................88 Tömb rendezése érték szerint a sort() segítségével ..............89 Asszociatív tömb rendezése érték szerint az asort() segítségével 90 Tömb érték szerinti fordított sorrendbe rendezése az rsort() segítségével ...........................................................................90 Asszociatív tömb érték szerinti fordított sorrendbe rendezése az arsort() segítségével ...........................................................................91 Asszociatív tömb kulcs szerinti rendezése a ksort() segítségével 92 Tömb érték szerinti természetes rendezése a natsort() segítségével 92 Tömb nem természetes rendezése az usort{) segítségével . 95 Fordított ciklus a tömbelemeken ........................................... 99 Ciklus a többdimenziós tömbökön ...................................... 100

VII

4. fejezet: Bankkártyák ................................................ 103
Áttekintés ...................................................................... 104
Kereskedői bankszámla ............. , ........................................ 105

Gyerekek ............................................................................... 106
Számlázási név ................................................................. 106 Biztonság................................................................................... 106 Szerver ...................................................................................... 106 Hash-elés................................................................................... 107 Titkosítás ................................................................................ 109 Az mcrypt telepítése ........................................................... 109 mcrypt-függvények ............................................................. 109 Elektronikus fizetési szoftverek .............................................. 117 CyberCash ........................................................................... 117 Payflow ................................................................................... 119 CCVS .................................................................................... 120

Gyors megoldások ...................................................... 122
Adatok hash-elése ............................................................... 122

mhash() ............................... mhash_get_hash_name() .................... mhash_get_block_size() ..................... mhash_count() ........................... mhash_keygen_s2k() .......................

122 124 124 125 125

5. fejezet: MySQL és PostgreSQL ............................... 127
Áttekintés .......................................................................128
Történet .................................................................................... 128 MySQL ................................................................................... 129 PostgreSQL ......................................................................... 129 Néhány különbség .................................................................... 130 Dátumok ................................................................................. 130 Kis- és nagybetűk megkülönböztetése.................................. 130 Tranzakciók ............................................................................ 131 Tárolt eljárások ..................................................................... 131 Triggerek ................................................................................ 132 Nézetek ............................................................................... 132 Adattípusok ............................................................................ 133 Bitek ....................................................................................... 133 Egész számok ....................................................................... 133 Lebegőpontos számok ....................................................... 134 Sztringek ................................................................................ 135 Blobok ................................................................................. 136 Dátum és idő .......................................................................... 136 A PostgreSQL különleges típusai .......................................... 137 Azonosítók beillesztése ......................................................... 138 Platformfüggetlenség ............................................................... 140 VIII

Adatbázis nyers adatokból .................................................. 140 Adatbázisok és tömbök .......................................................... 140 Indexelni vagy nem indexelni .............................................. 140 Kapcsolatok.............................................................................. 141 ODBC ........................................................................................141

Gyors megoldások ........................,.......................... 142

Kapcsolódás az adatbázishoz .................................................142 Az adatbázisok listázása ..........................................................144 Adatbázistáblák megjelenítése ............................................................................................................................... 14 6 Táblák mezőinek megjelenítése ............................................. 148 Táblák adatainak megjelenítése ..............................................152 Adatsor beillesztése .................................................................157 Adatbázis létrehozása ............................................................160 Táblák létrehozása ....................................................................160 Adatbázisok használata session-ökhöz ..............................161 A kód megtisztítása ..................................................................169

6. fejezet: Adatbázisok ................................................ 173
Áttekintés ......................................................................174
SQL ............................................................................................174 Indexeljünk vagy ne indexeljünk ............................................174 Kapcsolatok - Relációk ...........................................................175 Állandó kapcsolatok .............................................................. 175 ODBC ....................................................................................... 176 DB2............................................................................................. 178 SAP DB ...................................................................................... 178 Más adatbázisok .................................................................... 179 Adabas .................................................................................. 179 A filePro olvasása ................................................................ 179 A FroníBase olvasása ...........................................................180 Hyperwave .......................................................................... 181 Informix .................................................................................. 182 Ingres II ............................................................................... 182 InterBase ............................................................................ 182 Microsoft Access.................................................................... 183 Microsoft SQL Server ......................................................... 184 mSQL..................................................................................... 184 Oracle .................................................................................... 185 Ovrimos SQL Server ............................................................. 186 SESAM/SQL-Server ............................................................ 186 Solid ....................................................................................... 187 Sybase ................................................................................. 187 Adatbázis-absztrakciós rétegek .......................................... 188 DBA-utasítások ..................................................................... 188 DBM-utasítások ..................................................................... 189 DBX-utasítások ..................................................................... 190 IX

Gyors megoldások ......................................................192
Adatbázis elérése ODBC-vel ................................................ 192 Eredmények ........................................................................ 195 Hibák ................................................................................. 199 Mezőkkel kapcsolatos információk ...................................... 199 További utasítások ............................................................ 200 Új utasítások ........................................................................ 204 Adatbázis elérése DBA-utasításokkal ................................... 205 Adatbázis elérése DBM-utasításokkal................................... 205 Adatbázis elérése DBX-utasítasokkal ................................. 206 Ingres II elérése ..................................................................... 206 Időzítések kinyerése: út a teljesítményhez ........................... 208

7. fejezet: Környezet .................................................... 213
Áttekintés ............................................................ ___ 214
Apache ...................................................................................... 214 A PHP konfigurálása ............................................................216 Kiterjesztések ........................................................................216 A php.ini beállításai ............................................................... 217 Időkorlát ................................................................................ 217 Környezeti változók ............................................................... 218 Biztonság .................................................................................. 218 HTTP-hitelesítés ................................................................... 218 CHMOD .............................................................................. 219 PHP kötegelt módban ........................................................... 219 A PHP ütemezése ..................................................................... 220 COM ........................................................................................ 221 Könyvtár- és fájlnevek ............................................................. 222 Linux és Unix ..................................................................... 222 Windows NT ......................................................................... 223 Macintosh.............................................................................. 223 POSIX ........................................................................................ 223 A programok kommunikációjának elősegítése .................... 224 Megosztott memória .......................................................... 225 Szemaforok........................................................................... 226 Külső programok ..................................................................... 226 Extra információ ...................................................................... 227 mnoGoSearch-függvények .................................................. 227

Gyors megoldár .......................................................... 229
A régi fájlok eltávolítása ....................................................... 229 Külső programok végrehajtása .............................................. 233 Word-dokumentumok Rtf-formátumba konvertálása COM segítségével .......................................... 236 HTTP hitelesítés példa ............................................................ 239 Hogyan igazítsuk a kódot a környezethez? ....................... 241 Hibanaplózás ..................................................................... 241

X

Menekülő látogatók ............................................................... 243 Szkript időtúllépés ................................................................. 243 Az adatbázis kiválasztása .................................................... 244 Böngésző-alapú kódok ...................................................... 245 Utasítások ellenőrzése ...................................................... 246 Ellenőrzés a fejlécek elküldése előtt ................................. 246 A PHP ellenőrzése ............................................................. 247 A memória ellenőrzése ......................................................... 247 Szokatlan formátumok megjelenítése ................................... 248 Képek biztonságos megjelenítése ......................................... 248

8. fejezet: Fájlok ............................................................251
Áttekintés ................................................................... 252
Könyvtárak ............................................................................... 252 Apache-nézet ..................................................................... 252 PHP-nézet ......................................................................... 252 Nézetek váltása ..................................................................253 Fájltípusok ...............................................................................253 Fájlok megjelenítése............................................................. 253 Fájlok létrehozása és megváltoztatása ............................. 253 Fájlok másolása ..................................................................254 Ideiglenes fájlok ................................................................. 254 Fájlok feltöltése ......................................................................254 Fájllista-cache ........................................................................255 Engedélyezés/Jogosultságok ..............................................255

Gyors megoldások ...................................................... 256
Könyvtárak listázása ..............................................................256 Közös kód ..............................................................................256 Az is_dir() megközelítés .....................................................256 A filetype() megközelítés .......................................................257 A get directory_file() megközelítés ....................................258 Formázott fájllista ...............................................................259 Egyéb könyvtárfüggvények .................................................260 Könyvtárak létrehozása és törlése ......................................262 Fájlok listázása az attribútumokkal együtt ............................263 Általános kód ......................................................................263 A get_directory_file() kiterjesztése ........................................263 Formázott fájllista ...............................................................265 További attribútumok .............................................................266 Lemezterület-kimutatás ........................................................... 267 Általános kód ...................................................................... 267 A get_directory_file() kiterjesztése ....................................267 Üres lemezterület ............................................................... 268 Fájllista és elfoglalt lemezterület ........................................ 270 A könyvtárak által elfoglalt lemezterület kiíratása ............ 272 A legnagyobb könyvtárak által elfoglalt lemezterület kiíratása 273

XI

A legnagyobb fájlok által elfoglalt lemezterület kiíratása . . . 274 Képfájlok attribútumainak kiíratása ....................................... 275 Képinformációk kigyűjtése .................................................... 276 Képinformációk megjelenítése .............................................. 277 Bármilyen típusú adat megjelenítése ................................. 278 Általános kód ..................................................................... 278 Szövegfájl megjelenítése ...................................................... 279 HTML-fájl megjelenítése ..................................................... 280 Bármilyen típusú fájl megjelenítése ................................. 281 Üres fájlok létrehozása ......................................................... 283 Fájlok feltöltése ...................................................................... 284 CRC-számolás fájlokra ............................................................ 286

9. fejezet: Űrlapok ........................................................ 289
Áttekintés .................................................................. 290
Alternatív navigáció................................................................. 290 HTML vagy tisztán PHP? ......................................................... 291 A minimális HTML ................................................................. 292 Bell és Whistle ......................................................................... 293 Űrlapkérdések....................................................................... 295 összetett műveletek ................................................................ 298 JavaScript .............................................................................. 299 A csinos gördülőmenük eltávolítása ..................................... 299 Mezők érvényesítése a szerveren ....................................... 299 Hosszú űrlapok ..................................................................... 300 A hosszú űrlapok feldarabolása ........................................... 300 Az információ oldalról oldalra való továbbítása ................. 301 Használható hosszú űrlapok tervezése ............................ 303 Fájlok feltöltése ....................................................................... 304

Gyors megoldások ...................................................... 307
Űrlap létrehozása..................................................................... 307 Űrlapok létrehozása függvényekkel ................................... 307 Hosszú lista létrehozása űrlapon belül ............................. 309 Oszlopok igazítása ................................................................... 311 Egy válasz a sok közül ........................................................ 314 Egy válasz a sok közül rádiógombokkal ............................... 317 Több válasz a sok közül .......................................................... 318 Válaszok megőrzése és hibák kiemelése ........................... 323

10. fejezet: Függvények .............................................. 327
Áttekintés . .................................................................. 328
A világ legrövidebb függvénye .............................................329 Értékek visszaadása .............................................................329 Értékek bevitele ........................................................................332 Tetszőleges értékek .................................................................333 XII

Változó számú beviteli mezők ................................................ 334 Hatáskör .................................................................................... 336 Statikus változók .................................................................... 339 Rekurzió .................................................................................... 341 Változóban elnevezett függvények ..................................... 341 Sorrend...................................................................................... 342

Gyors megoldások .......................................................343
Függvény létrehozása ........................................................... 343 Globális változó deklarálása ................................................... 344 Statikus változó deklarálása ................................................ 345 Függvény tárolása változóban ............................................ 346 Alapértelmezett függvényparaméterek használata .............. 347 A függvény létezésének ellenőrzése ..................................... 348 A call_user_func() használata ................................................. 349 A create_function{) használata ............................................ 350 A func_get_arg() és a func_num_args() használata ............ 351 Afunc_get_args() használata .............................................. 352 Shutdown-függvény beiktatása .............................................. 353

11. fejezet: Képek ......................................................... 355
Áttekintés ...................................................................356
GIF ............................................................................................356 PNG.............................................................................................356 JPEG .......................................................................................... 357 PDF .............................................................................................358 ClibPDF ...............................................................................358 FDF ......................................................................................363 PDFIib ....................................................................................366 Flash és Shockwave .............................................................. 366 A fájl ....................................................................................... 367 Képkocka ............................................................................ 367 Szín .....................................................................................368 Objektumok ............................................................................368 Szöveg ................................................................................. 371 Bittérképek és szimbólumok ..............................................371 Műveletek .............................................................................. 372 Gombok .............................................................................. 373 Képadatbázisok ....................................................................... 374 MySQL ................................................................................... 374 Egyéb SQL-adatbázisok ..................................................... 375 Hyperwave .......................................................................... 375 A képi modul telepítése ........................................................... 375 Képek megjelenítése .............................................................. 375 Mindig használd az Alt-ot az image tag-ben ......................... 376 Használd a méretinformációt az image tag-ben ................... 377 Vázlatképek létrehozása........................................................ 377 ____ ^ XIII

Képek létrehozása ................................................................... 377 Képek változtatása .................................................................. 381 Színek változtatása .............................................................. 381 Átméretezés és újbóli mintavételezés ............................... 382 Külső programok ...................................................................... 383 A megfelelő formátum kiválasztása ....................................... 383

Gyors megoldások ......................... , ........................ 384
Képek listázása ........................................................................... 384 Képinformációk gyűjtése ......................................................... 384 Képinformáció kiíratása ............................................................. 385 Szöveg létrehozása PDF-dokumentumban ClibPDF-fel . . . 391 Szöveg létrehozása PDF-dokumentumban PDFIib-bel . . . . 392 Szöveg létrehozása GIF-, JPEG- vagy PNG-képekben . . . . 394 Diagram létrehozása GIF-, JPEG- vagy PNG-képekben . . . 395

12. fejezet: Nemzetközi beállítások ............................ 399
Áttekintés ...................................................................... 400
Nyelv vagy ország észlelése ................................................... 401 Nyelv vagy ország észlelése a böngészőből ..................... 401 Nyelv vagy ország észlelése az Apache-csal ....................... 402 A legjobb megoldás a PHP ................................................ 402 Nyelvi követelmények ........................................................... 404 Alkalmazásspecifikus vagy honlapspecifikus beállítás . . . 404 GNU-recode ........................................................................... 405 GNU-gettext ............................................................................ 406 Helyesírás.................................................................................. 406 Szóegyeztetés .................................................................... 407 Aspell ................................................................................... 409 Pspell .................................................................................. 409 Több-bájtos karakterek ......................................................... 412

Gyors megoldások ................................................... 414
Országinformáció létrehozása ................................................ 414 Országinformáció tárolása ................................................... 416 Országinformáció visszakeresése ......................................... 419 Session-ök használata az országinformációkra ................... 422 Üzenet keresése más nyelvben a GNU-gettext-tel ............. 423 Szöveg keresése más nyelvekben SQL-lel ........................... 425 A karaktertípusok ellenőrzése ................................................ 428 Kifejezések és helynevek egyeztetése levenshtein()-nel . . 431

13. fejezet: Internet ....................................................... 433
Áttekintés...................................................................... 434
URL ............................................................................................ 434 Séma vagy protokoll ............................................................. 435 Hőst .................................................................................... 435 XIV

V
Elérési út ............................................................................... 435 Oldal ...................................................................................... 436 Töredék.................................................................................. 436 Lekérdezés ............................................................................ 436 Különleges karakterek........................................................... 437 Base64 kódolású szöveges sztringek ............................... 437 Más szerverek böngészése ..................................................... 438 Csatolófüggvények .................................................................. 439 SNMP ...................................................................................... 442 Curl............................................................................................. 445 FTP ............................................................................................. 445

Gyors megoldások ....................................................... 447
Base64 kódolás ........................................................................ 447 A web böngészése PHP-val .....................................................448 Linkek ellenőrzése ....................................................................451 FTP-függvények használata ....................................................453 Curl használata .......................................................................460 Curl-opciók ...........................................................................461

14. fejezet: LDAP .......................................................... 467
Áttekintés ................................................................... 468
Telepítés .....................................................................................469 Terminológia ..............................................................................469 DN - megkülönböztetett nevek ...........................................469 RDN - relatív megkülönböztetett nevek ...............................470 Szintek .................................................................................471 Elemek ...................................................................................471 Attribútumok ...........................................................................471 Objektum .............................................................................472 DIT ......................................................................................... 472 Séma ................................................................................... 472 LDIF ....................................................................................... 473 Szerverjellemzők ..................................................................... 473 Küldés ................................................................................. 473 Másolás ............................................................................... 473 Biztonság ............................................................................ 474 LDAP-függvények ..................................................................... 474

Gyors megoldások ....................................................... 478
LDAP Windows NT alatti telepítése ........................................ 478 PHP-kiterjesztés .................................................................. 478 OpenLDAP-szerver ............................................................... 478 A szerver tesztelése ............................................................ 480 Csatlakozás az LDAP-hez ..................................................... 481 Országkódok hozzáadása ...................................................... 484 Csatlakozás ........................................................................ 485 Országkódok megszerzése ................................................... 485 XV \

Országkódok formázása ....................................................... 485 Az első országkód hozzáadása ............................................ 486 További országkódok hozzáadása ........................................ 487 Felhasználó hozzáadása ....................................................... 488 Közbülső szintek hozzáadása ............................................... 489 A végső szint hozzáadása ..................................................... 489 Hibakezelés ............................................................................ 490 Az összes elem listázása ......................................................... 492 Az egy szinten levő összes elem listázása .......................... 493 Az összes szint összes elemének listázása ......................... 496 Az elemek értelmezése a listázáson belül ............................ 498

15. fejezet: Posta .......................................................... 501
Áttekintés ...................................................................... 502
IMAP ........................................................................................... 502 Postaládafüggvények ......................................................... 503 Levelezési függvények ...................................................... 504 Kiemelőfüggvények ............................................................... 506 Sztringkonvertáló függvények ............................................. 506 Egyéb függvények ................................................................. 512 Levélfejrészek ........................................................................ 514 Minimális fejrészek ............................................................. 514 További fejrészek ................................................................ 515 MIMÉ .......................................................................................... 515 „ MIME-Version ........................................................................ 516 Content-Type ...................................................................... 516 Content-Transfer-Encoding ................................................ 516 Content-ID .......................................................................... 516 Content-Description .............................................................. 517 Content-Disposition ............................................................... 517 Működési üzemmódok ............................................................. 517 Offline .................................................................................... 517 Online .................................................................................... 518 Kapcsolat nélkül ................................................................. 519 Átmeneti ................................................................................ 519

Gyors megoldások . . ................................................ 520
A PHP levelező függvényeinek telepítése ............................. 520 Windows NT .......................................................................... 520 Unix ..................................................................................... 520 Levél küldése ............................................................................ 521 Egy levél küldése ............................................................... 521 A From fejrész elküldése .................................................. 523 Több fejrész küldése ............................................................. 524 Egy üzenet küldése több címzettnek .................................... 525 Levél küldése csatolt állománnyal ...................................... 527 Tesztadatok kiválasztása ...................................................... 528

XVI

Fájlinformációk gyűjtése ..................................................... 528 MIME-f ej részek létrehozása ............................................... 530 MIME-üzenetrészek létrehozása ......................................... 531 Nem MIME-fejrészek létrehozása ...................................... 532 A levél elküldése .................................................................... 533 Levelezési címek ellenőrzése ............................................... 533

16. fejezet: Hálózatok ................................................... 537
Áttekintés ___ .......................................................... . 538
A hibakereső ........................ , ................................................. 538 DNS- és MX-rekordok ............................................................... 538 Host-nevek ................................................................................. 539 IP-címek ................................................................................... 539 ip2long() ............................................................................... 540 Iong2ip{) ............................................................................... 541 Protokollnevek és -számok ..................................................... 541 Szolgáltatás nevek és port-számok ....................................... 541 getservbyname() .................................................................... 541 getservbyport() .................................................................... 542 Csatolók ..................................................................................... 542 pfsockopen() .......................................................................... 542 socket_get_status() ............................................................... 543 socket_set_blocking() ......................................................... 543 socket_set_timeout() ............................................................. 544 Rendszernapló ...................................................................... 544 define_syslog_variables() ................................................... 544 openlog() ............................................................................. 544 syslog() .................................................................................. 545 closelog() ............................................................................ 545 NFS ............................................................................................. 546 NIS ........................................................................................... 546 Térkép .................................................................................... 546 yp_get_default_domain() ....................................................... 547 yp_master() ............................................................................ 547 yp_order() .............................................................................. 547 yp_match() .......................................................................... 548 yp_first() .............................................................................. 548 yp_next() ................................................................................ 548 WDDX ......................................................................................... 548 WDDX csomag ...................................................................... 549 CORBA....................................................................................... 550 orbitobject() ............................................................................ 550 orbitenum() ............................................................................ 551 orbitstruct{) .......................................................................... 551 satellite_caught_exception() ............................................... 551 satellite_exception_id() ....................................................... 551

XVII

sateHite_exception_value() ................................................. 551 Tömörítés ................................................................................... 552 bzip2 ..................................................................................... 552 gzip ........................................................................................ 554

Gyors megoldások...................................................... 555
DNS-rekordok vizsgálata ......................................................... 555 MX-rekordok megszerzése ................................................ 556 A host-név megszerzése ....................................................... 557 A host-név megszerzése cím alapján ................................... 558 A host-cím megszerzése név alapján ................................... 558 Host-címek listázása név alapján ......................................... 560 Protokoll szám ok felsorolása ............................................... 561 Adatok besorolása WDDX-szel ............................................ 562 wddx_serialize_value() ....................................................... 562 wddx_deserialize() ............................................................. 563 serialize() ............................................................................ 563 wddx_serialize_vars{) ......................................................... 564 wddx_deserialize() változókkal .......................................... 564 wddx_packet start() ........................................................... 565 wddx_add_vars() ................................................................... 565 wddx_packet_end() ............................................................... 565 Adatok tömörítése zlib használatával .................................... 566 Saját napló írása ................................................................... 568

17. fejezet: Objektumok ............................................... 569
Áttekintés ...................................................................... 570
Osztályok .................................................................................. 570 new........................................................................................ 571 Mint egy változó ................................................................. 571 stdCIass .............................................................................. 572 Tulajdonságok ........................................................................ 574 var ...................................................................................... 574 Konstruktőr............................................................................ 575 $this ..................................................................................... 575 Módszerek .............................................................................. 576 Megsemmisítő ....................................................................... 577 Osztályok kiterjesztése ........................................................ 579 Függvények hozzáadása ...................................................... 579 Konstruktőrök a kiterjesztett osztályokban ........................... 579 Függvények cseréje ........................................................... 580 Függvények törlése ............................................................... 581 Többszörös kiterjesztések..................................................... 582 :: ............................................................................................ 582 parent .................................................................................... 583 Szoftverterjesztés és dokumentáció ...................................... 583 Többszörös adatelemek és állapot ....................................... 583 XVIII

Többszörös kimenet ........................................................... 584

Gyors megoldások

. . .

............................. 5 8 5
585

Objektumok mentése sessiönökben és a __ sleepQ használata Objektumfüggvények használata ........................................ 589 call_userjmethod() ............................................................. 589 call_user_method_array() .................................................. 590 c!ass_exists() ..................................................................... 591 get_class{) ......................................................................... 591 get_class_methods()............................................................. 591 get_ciass_vars() ................................................................ 592 get_declared_classes{) ....................................................... 592 get_object_vars() ............................................................... 593 get_parent_class() ................................................................ 593 is_subclass_of() ................................................................. 594 method_exists() .................................................................... 594 Honlap testreszabása objektumokkal ................................... 594 Hírcsoportok olvasása ............................................................ 598

18. fejezet: Keresés ..................................................... 605
Áttekintés ..................................................................... 606
Keresőprogramok felkutatása ................................................ 606 LDAP .................................................................................. 607

Z39.50 ........................................................................................... 607
YAZ ............................................................................................ 607 A YAZ telepítése ................................................................... 608 Adatforrások ......................................................................... 608 Tesztelés............................................................................... 609 RPN .................................................................................... 610 Keresés YAZ-val....................................................................... 610 Nem támogatott keresés ...................................................... 610 YAZ-függvények .................................................................610 Adatbázis alapú keresések ..................................................615 Adatok megőrzése eredeti formájukban ............................... 615 Rugalmas adatok .............................................................. 616 Rugalmas keresések ............................................................ 617 Az adatok oztályozása .......................................................617 Csökkenteni, de meghagyni ...............................................617 Szabad szövegasszociációk használata ............................618 Készíts nagy tárgymutatót .....................................................618

Gyors mecsnldások

...................................................620

Keresés egy szerveren .......................................................... 620 search() ..............................................................................620 array_display() .................................................................... 622 Dél-Ausztráliai Állami Könyvtár .......................................... 623 Bell Labs ................................................................................624 Keresés több szerveren ....................................................... 626 XIX

............. .. .... 641 Sessionazonosító ............................................................................................................681 XX ...................................................................... 633 Eredmények szerkesztése ............................................................... 631 A nyers eredmények............................................................. 677 AZ XML nem helyettesíti a HTML-t ..........com-on ............. ........................................................ ................................................ 641 Cookie-k................ 655 Session indítása cookie-kkal és fájlokkal ........................................................ 680 Nem értelmezett elemek . 626 Keresési paraméterek ............... ................................................................................................ 644 php............................... 676 Mit csinál az XML? ......................................... 630 Az eredmények..................................... 675 Áttekintés ..... .......................................................ini ........... 626 array_display() .................................. ............................................ ................................... 641 HTTPS ..........639 Áttekintés ................................................... 670 20.................................................. 676 Mi az XML? ................................................................................. .............. 643 Adatok vagy adatbázisok..... .................................................................................................... ................................... 633 Eredmények megjelenítése ............................................................................................................................................................. ............................................... 677 Mit nem csinál az XML? .. ......... 646 Vásárlói szolgáltatások ................... ................ 676 Miért csodálatos az XML? ... 670 Adatbázisok ................................. .............. ...... ............................. ............................................640 A honlap tulajdonosának haszna .................................................. 634 Adatok indexelése ............................................. 680 Komplex DTD-k írása .......................... 630 Keresés a google......................................................... 643 PHP-szolgáltatások ............................ 678 Külső elemek ............ .............. ................................... 642 Cookie-k vagy URL-ek ............................ 635 19...................................................... fejezet: XML ................................................................ 670 Fájlok ................. .................... 653 Gyors megoldások .......................... ............................................. 644 PHP session-függvények ........... 631 Az űrlap ................. 655 Session indítása MySQL használatával .................................................. .............. .... 668 A session_end() használata .......................................................................... 626 search() ........................ ..........................Adatforrás .. ......... 630 A keresés tesztelése ....................................................................... 678 Adatok ......... fejezet: Session-ök ................. 659 Az aktuális felhasználók megjelenítése .................. 641 A látogató előnyei ......................................................................

........................................ 684 Telepítés ...................................................................................................................... 703 Az XML-fájlok megjelenítése ...................................................................................................... 691 HTML...................................... 681 Nevek .......................................................................................................................................................... 707 XML nyitó......... 682 DTD .. 684 Függvények ................................... 684 XML-függvények ............................. 704 XML-adatok értelmezése .................................... 684 XSLT ................................................................ DHTML vagy XSLT? ............................ 703 Az XML-adatok megjelenítése .................................................és zárótag-ek összeillesztése .................................................................................. 681 Attribútumok ....... 683 Xlink és XPointer ................... 696 A DOM XML telepítése ................. 697 Gyors megoldások ......................................................................................................................................................................................................................................Szerkezet ..................... 695 DOM ...... 711 A CD-ROM tartalma ........................... 681 CDATA ........................................................................... 682 Névmezők .............. 696 DOM XML-függvények .............................................. 691 Az XSLT telepítése ................................. 692 XSLT-függvények ............................................................................................. 692 WDDX ................................................................................................................................................................................................................................................. 717 XXI ...

1. fejezet PHP-bevezető Gyors megoldások Apache-konfiguráció Egyedi Apache-függvények apache_lookup_uri() apache_note() ascii2ebcdic() és ebcdic2ascii() getallheaders() PHP-konfiguráció oldal: 15 15 16 16 17 17 17 17 18 18 18 19 19 20 20 20 21 21 21 22 22 23 23 23 dl() extensionjoaded() Hibakeresés assert() assert_options() die() Hibák Naplózás Kimenet-ellenőrzés Biztonság Reguláris kifejezések ereg() ereg_replace() eregi() eregi_replace() split() spliti() .

akár a fogorvosok is írhattak vele fogászati alkalmazásokat. A PHP4 világszerte gyors ütemben váltja fel a PHP3-at. század végén a Visual Basic volt a világ legnépszerűbb programnyelve. hogy mentségül szolgáljon a Perihez értő programozóknak . Akkoriban a számítógépek annyival lassabbak és drágábbak voltak. A gyors programvégrehajtás így nem téma többé. sokrétűbbé teheti a PHP-t különféle kódok. hogy élvezd a világ legjobb webes szkript nyelvének előnyeit. A Visual Basic a Basic nyelvhez kötődik. Ha értesz a PHP meg írásához használt ANSI C-hez. miért nem váltottak. mint a PHP. munkád úgy felgyorsul majd. mert Periben írni néha rettentően unalmas volt. amikor bringájáról átszállt az Enterprise űrhajóra. Számtalan honlapon előre megírt alkalmazások és komponensek gyűjteményeit találjuk. Ha mondjuk PHP-alapú e-mail-klienst vagy -szolgáltatást szeretnél létrehozni. mint a Perire való visszatérést. . a Cobol hívők pedig a gyors programozás miatt szerettek volna mindent Cobolban megcsinálni. aki nem ismeri a C-t. A Freshmeat (freashmeat. A PHP-nek csak két változata terjedt el: a PHP3 és a PHP4. Az Assemb ler-hívők a gyors végrehajtás érdekében mindent Assemblerben akartak megírni. A PHP3 elég lassú volt ahhoz. egyszerűbbnek fogod találni a PHP kiterjesztését. jólle het lehetőség van a PHP kibővítésére és ezen segédprogramok nagy részének helyettesíté sére. Most viszont a processzor sebességének nagymértékű növelése annyiba kerül. Mé g ha a szkript nyelvektől oly távol eső programnyelvet használsz is. keress rá a Freshmeaten a „php email" kifejezésre.7. vagy fej lesztheted a jelenlegit. és még a Visual Basicnek is számos inkompatíbi lis változata létezik. A 20. Jómagam azért kezdtem PHP-t használni. mint az Assembler vagy a C. amelyek saját célra felhasználhatók. mint Kirk kapitány. és a C is csupán a PHP -hez való operációs rendszerek és fordítóprogramok megírásához kell. A PHP mindkét problémán segít.75% .net) jó kiindulási pont lehet mindehhez. akkor a PHP forráskódjával új változatokat hozhatsz létre. de a Basic család összes tagja különbözik valamiben. objektumok és fejlesztés alatt álló kódok béta-verziói is. függvények és objektumok összegyűjtésével. mintha egy hétre bérelnénk egy programozót. A webszervereken kívül futó segédprogramok írására a Perl alkalmasabb. re/ezer Hi-tr-Devezeto Áttekintés Üdvözlünk a PHP világában! Ha jelenleg valamely más szkript nyelven programozol. a Visual Basic pedig csak egy platformon elérhető. amelyek között szerepeltek alkalmazások. Korábban Assemblerben és Cobolban programoztam nagygépes szervereken. A nagy teljesítmény eléréséhez azonban már nincs szükség a Perire. akkor itt az ideje. hogy a műveletek végrehajtásának sebessége még kényes témának számított: egy jelentős processzorfejlesztés húsz programozó éves fizetésébe került. A hozzám hasonló 99. A C az egyetlen a programozáshoz szükséges másik nyelv. A könyv írása idején ez a keresés 56 talá latot eredményezett. Ha egy ideig használod a PHP-t.net) és a Sourceforge (sourceforge.

Az IBM-nél 1969-ben dr. A nyílt forráskódú szoftverfejlesztés lényegében megszüntette ezeket a korlátozó tényezőket. Ha egyetlen ember fejleszt egy nyelvet. Elmondhatjuk. Ez akkoriban. és írtam is egypárat. ami a nyílt forráskódú fejlesztéseknek köszönhetően PHP4-gyé fejlődött. A PHP4 egy olyan nyílt forráskódú nyelv az új webfejlesztők számára. hogy nem voltak kompatíbilisek az IBM összes termékével. Végeredményben a kevésbé hasznos termék beolvad más termékekbe. Egy kis történelem Charles Babbage 1833-ban réz. amelyek az ember által . de jó néhányszor belefutottam az egyes cégek által kifejlesztett saját tulajdonú programnyelvek. Mintegy 30 programnyelvben dolgoztam. Emberek ezrei töltik szabadidejüket a Linux fejlesztésével. akkor mind a GML-ről. amikor Assemblerben kezdtem programozni. mostanában viszont a modern programnyelvek és az Assembler közti különbség tűnik akkorának. Goldfarb új irányba terelte a számítástechnikát. vagy háttérbe szorul.ehetőség az egyéni érdekek előtérbe helyezésére. majd később a Standard Generalized Markup Language-t (SGML) kifejlesztette. A nyílt forráskód megjelenése 1992-ben Linus Torvalds a Linux megírásával előtérbe helyezte a nyílt forráskódú szoftvereket. szorosan ellenőrzése alatt tarthatja azt. Fordítás és fejlesztés A kezdeti programnyelveket papíron fordították le. illetve az egyetlen programozó által írt nyelvek okozta megszorításokba. hiszen ez a fejlesztési módszer lehetővé :sszi. amely a Generalized Markup Language-t (GML). Az IBM két olyan termékével is dolgoztam. és bináris formában gépelték be. amely folyamatosan váltja fel a Perihez hasonló régebbi nyelveket. hogy emberek milliói ingyenesen használhassák. Nyílt forráskódú fejlesztés esetén nincsen . mint a réz és a modern számítógépek szilikonchipje közti különbség. hogy Dr. A Linux egy olcsó PC-n is futtatható ingyenes operációs rendszer. nogy nekik melyik változat felel meg. Ha esetleg programoztál már más nyelveken. 1994-ben Rasmus Lerdorf kifejlesztette a PHP/FI-t.Áttekintés Programozási 1x1 Ha egyenesen a HTML-szerkesztésből csöppensz bele a PHP-programozás világába. és képes a számítástechnikának új irányokat adni. hogy a programozók versenyeztessék saját ötleteiket. ami aztán mindkét termék végét jelentette. mind a nyílt forráskódról szóló információ segíthet a PHP működésének megértésében. de mind a kettőt korlátozta. a felhasználók pedig eldöntik. hasznos lehet megismerned a szkript nyelveket és fejlődésük történetét. Az IBM szakemberei saját érdekeiknek megfelelően használták a fejlesztési projekteket. hiszen helyette a fejlesztők a népszerűbb termékek :ovábbfejlesztésével vagy teljesen új ötletek kidolgozásával foglalkoznak. A nagy vállalatoknál kifejlesztett saját tulajdonú programnyelvek ezzel ellentétes irányba haladnak. egy kicsit primitívnek tűnt számomra.és ónkerekekből kezdett számítógépet építeni. Az SGML a Hypertext Markup Language (HTML) őse. Később megjelentek az automatikus fordítóprogramok. amelyek ugyanazt a piacot célozták meg. Charles Goldfarb vezette azt a kutatócsoportot.

A programozás ezáltal felgyorsult. a legújabb PC-re van szükséged."-ig terjednek. amennyi csak belefér. A Perit és az első PHP-t . A megszokott normál licenc a GNU General Public License (GPL). de hosszadalmas késlekedést okozott a programozóknak. amelyek 10 000 000 dollárba vagy annál is többe kerültek.mivel HTML-oldalak voltak . A felhasználási feltételek a „Ezt a valamit a főiskolán csináltam. mind a PHP számára léteznek már különböző cache-mechanizmusok. amikor a számítógép a szkriptet beolvassa. Attól függően. és sokkal gyorsabban futottak. használt 486-os is működhet szerverként. Amikor az első IBM nagygépes szerver klónját az IBM-mel versenyeztettem. mindenféle licencekkel.gnu. hogy meg kell őrizned az eredeti kódot az eredeti csomagban. volt szerencsém 60 százalékot lealkudni a szörnyeteg árából. A 1990-es évek végén a webszerver nyelvek hasonló fejlődésen mentek keresztül. memóriával jól megpakolt. postcardware-ek (egy képeslapot kell a szerzőnek küldened). Tessék. amely a www. A fordítás csökkentette a feldolgozási időt. fejezet PHP-bevezető értelmezhető nyelvet a számítógép számára megfelelő bináris nyelvre fordítják. így a szkript gyakran használt részeit csak egyszer kellett fordítani. de a szkriptek lassabbak lettek. Csak akkor használhatod. A nyílt forráskód használatáról Ha nyílt forráskódú szoftvert használsz. Néhány szkriptfejlesztő továbbment. mindig olvasd el a licencfeltételeket. ha . teljes dokumentációval és szerzői jogi figyelmeztetésekkel.html oldalon található. Bizonyos szkriptértelmezők voltaképpen a memóriába fordították a szkriptet. A fejlesztők később olyan rendszereket választottak.. Ha a honlapod igazán beindul. .. de le is lassulhat. hogy a szknpted hogyan működik. akár 10 000 PC-re is szükséged lehet. kiadod. Ma viszont egy 400 dolláros. A PHP3 és a PHP4 közötti óriási teljesítménykülönbség az értelmezésről a fordításra való áttérésnek köszönhető. Több száz PHP-alapú nyílt forráskódú alkalmazást tartalmazó oldal létezik. charityware-ek (meg kell becsülnöd a szoftver értékét és jótékony célra kell azt felajánlanod) és mégkikelltalálniware-ek. a webszervered jócskán felgyorsulhat a cacheszoftver használatától. így a következő futtatások gyorsabbak lettek. Költségek A nagy hálózatokat kiszolgáló első szerverek nagygépes IBM-szerverek voltak. amelyek elmentik a lefordított memóriatérképeket a következő futtatások számára. ha nagyra törő terveid vannak. Vannak memorialware-ek (meg kell említened. Mind az Apache. Az 1980-as évek elején a szkript nyelveket fejlesztők fordítóprogramokkal kísérleteztek. és kitalálod a saját licencfeltételeidet. amikor is te írsz egy kódot. mert a pótlólagos szoftverráfordítás révén elillan a megtakarítás. Természetesen. amelyek a memóriába fordítottak. utóbbi esetén lehet.org/copyleft/gpl.soronként értelmezték. amibe annyi memóriát préselsz. használd ingyenesen"től a „Szerzői jog fenntartva. A szkript nyelvek az egyszeri fordítást olyan értelmezési folyamattal helyettesítik. hogy a kódot a fejlesztő halott barátjának vagy rokonának ajánlod). a lefordított memóriatérképeket lemezre mentette.1. amely minden egyes alkalommal lezajlik.

Az értelmezett szkripteket ne -~éz tesztelni. hiszen mindkettő szükséges hozzávaló. hogy az utasításokat begépelő ember né hány. Egész iparág telepedett a szoftverfejlesztők köré. A PHP3 is szenvedett ettől a problémától. hogy az egyes utasítások ott kezdődnek-e. A PHP4 használat előtt a teljes szkript szin takukáját ellenőrzi. a számítógép megnézi a helyesírást. a számítógép által észlelhető hibákat addig -em vesszük észre. mint az olyan keverék nyelveket. akiket csak a tények győznek meg. a tények pedig azt mutatják. Képzeld el. akik szisztematikusan tesztelik az értelmezett nyelveket. A lefordított progra -— ok általában tiszták. az egé sz szöveg egyszerre történő szintaktikai ellenőrzése felé. Értelmezés kontra fordítás Gondolj a számítógépes nyelvekre úgy. hogy ellenőrizné a töb bi megvan-e. hogy a PHP-t könnyebb tanítani. amíg el nem kezded használni azokat. és ellenőrzi. és alaposan átnézi a szkript fő részeit. lefordítja az összes függvényt. Vonatkoztasd a számítógépes értelmezést a hibásan írt névre. hogy a szkriptben nincsenek szintaktikai hibák és az összes függvény megfelelően került lefordításra. Aztán vegyél egy általad rendszeresen használt utasítást. hogy borsra vagy borsóra gondoltál. a számítógép semmit nem tesz. mint a Visual Basic vagy az US. Mivel több iskolában tanítanak Visual Basicet. hogy nem tudod az utasításokat követni. mert az értelmező anélkül foglalkozik az adott sorral. s ez ? okkal jobb ellenőrzést jelent.) A fordított nyelveknek vannak hátrányai: az egész programot meg kell írnod fordítás előtt. hogy a PHP az egyetlen igazi nyelv. számára magától értetődő utasítást kihagy. hogy hogyan találod meg a barátod új házát. Vonatkoztasd ezt a problémát a fordítóprogramokra. Tapasztalataim alapján állítom. Az értelmezett szkriptekre . hiszen minden hiányzó rész fordítási hibát okoz.Hibakeresés ?:rdítás során a fordítóprogram számtalan egyszerű hibát észrevesz. Az értelmezett szkriptekkel lehet soronként haladni. mint PHP-t. A számítógép addig nem foglalkozik az adott . ami akár hóna -r-: skA a szkript forgalomba kerülése után is megtörténhet. Ha a PHP4-ednek sikerül működő HTML-t produkálni. mint utasítások listájára. de vannak. mint ami PHP3-ban lehetséges volt. Amikor a programozó befeje zi az írást. ahol az előző befejeződött. és könnyű bennük a hibákat megtalálni._ó átállás azt eredményezte. A „memóriába fordító" szkriptértelmezőkre való átállás egy lépés hátrafelé. ennek ellenére a szisztematikusan tesztelt szkriptek is megbukhatnak. A PHP előnyei Egyértelmű. rövid távon az informatikai menedzserek számára vonzóbb a Visual Basic. Ahogy a programozó befejezi a gépe lést. vagy néhány szót hibásan gépel be. hogy bizonyos. hogy napjaink weboldalaihoz a PHP a megfelelő szkript nyelv. Az eredmény az lesz. az azt jelenti. legyen az ételrecept vagy feljegyzés arra vonatkozóan. A számítógép addig nem ellenőrzi az utasításo kat. (Azonban a számítógép nem tudja ellenőrizni. amíg a szkript adott részét nem értelmezi a program.

?>. amelyek egyáltalán nem használják a PHP4 fontos funkcióit. Ezek azonban akár olyan veszedelmes kódolási csapdákat is rejthetnek. Mindazonáltal jellemzően sok apró változ tatást igényelnek ahhoz. ez MySQL-ben alapértelmezésben NULL értéket ad a mezőknek. amíg a nevet tartalmazó sor utasításához nem ér. és az adatbázisokhoz csak minimális hasznukat veheted. A saját kódok írásakor eleget tanulhatsz ahhoz. példá ul a = = = operátort. Az egész folyamatban lévő munkát kidobhatod. Rengeteg ingyenes PHP-objektumot és -alkalmazást Ietölthetsz. Y " ) ) . hogy mindent kézben tarts. hogy honlapodhoz illeszkedjenek. az SQL output oldalain a nulla értékek különös eredményeket okoznak. Annyit ellenőriz. és programod üzleti célokra alkalmatlanná vál hat. amelyek nehézkessé tehetik a működtetést. dateC'l F j. A PHP a fordítás és értelmezés majdnem tökéletes keverékét nyújtja. adatbázis alapú alkalmazásokra is: <?php print ("<p>Today's date is " . és a következő 25 000 letöltő mind jobban járjon. Például vegyük a MySQL-t: MySQL-ben sokan használják táblázatok létrehozására a phpMyAdmint és soha sem veszik észre.</p> Ez a módszer működik.név helyesírásával. és jobban használható a nagy. hogy az egyes mezőkhöz a megfelelő adattípuso kat alkalmaznák. Y") . nem fogsz tudni egy másvalaki ál tal írt PostgreSQL alapú kódot ellenőrizni. függvényekből. Kimenet-ellenőrzés HTML-oldalakat kétféleképpen is programozhatsz PHP-vel. íme az egyik módja annak. hogy teszteld. és másnap kezdheted elölről. Ha egy ilyen csapdába beleesel. és emellett az értelmezés előnyeit is biztosítja. amiket mások hagyományos SQL-táblázatok létrehozására használnak fel. Részkódok kontra programozás Fájlokból. hiszen csak egy kis PHP-t szúrsz egy létező HTML-oldalba. objektumokból és minden egyéb töredékkódokból is összerak hatsz alkalmazásokat. mintha a saját kódodat írnád meg. tudasd változtatásaidat a szerzőkkel (vagy ajánld nekik ezt a könyvet). Léteznek olyan kódok. amennyit egy jó fordítóprogram ellenőrizne. hogy nincs „őrült bors". hogy a phpMyAdmin alapbeállítás ként NOT NULL értékre állítja a mezőket. . ". és feltételezhetően gyorsan megvalósítható. A következő példa viszont . Az ilyen megközelítésben működő PHP alapú alkalmazások szerte az egész webről letölthetők.lehetővé teszi.a PHP-kódba beszúrt kis szöveggel . hogy kijavíthassák a kódjukat. más kódok nem ellenőrzik a bevitt adatok érvényességét.</p>"). megint má sok pedig anélkül használnak adatbázist. Egy félig kész leves receptjének a közepére érve a gép közli veled. Ha sosem írtál kódot PostgreSQL adatbázishoz való hozzáféréshez. hogy PHP-vel hogyan szúrhatod be a dátumot a szöveg egyik sorába: <p>Today's date is <?php print(date("1 F j. ellenőrizd és kijavítsd a le töltött kódokat. Ha továbbra is használod a letöltött kódot. de ez azért nem olyan. Ezek az emberek közreadják kódjaikat a weben.

hogy az a . a könyv írásához használni fogom a példákat.ini konfigurációs állományhoz való hozzáférésedet. Általában gyorsabbnak találom a kis website-okat egyenesen PHP3-ról PHP4-re konvertálni.php kiterjesztést használja. úgy tartják. A nyílt forráskód egyik előnye éppen a hiányzó rész hozzáadásának lehetősége. A PHP4-ben annyira egyszerű és népszerű a függvényfejlesztés. hogy sokkal könnyebb bármit is hozzáadni a PHP4-hez. így a könyvben található kódokat naponta frissítem a gépemen. a PHP4 viszont a dinamikusan generált függvények kezeléséhez szükséges függvények széles választékát nyújtja. Egyszerűen nincsen elég példa arra. amelyek minden böngészővel működnek. . A PHP4 fejlesztők úgy állították be a PHP4-et. A két fájltípus. amikor PHPt használok. ezért én ritkán használom a kettős elnevezéses rendszert. Azt gondoltam. amelyek azonnali előnyökhöz juttatják kedves olvasóimat. amellyel olyan hatékony alkalmazásokat fejleszthetsz ki. hogy a valós életben mire használhatók a PHP-függvények. mint a gyereket ruházni. A PHP-vel lépést tartani olyan.com (a "PHP and Web site architecture" rövidítése) címen gondozok a programozóknak egy kicsiny listát. Napról napra szembetalálom magam az adott függvények jobb felhasználásával és az érdekességek növekvő listájával. a PHP4 számos olyan függvényt tartalmaz. PHP4 A PHP4 divatba hozza a sebességet: a hosszú szkriptek végrehajtásának és a PHP4 függvények fejlesztésének sebességét. Itt vannak a PHP4 újdonságai. hogy naprakész maradjon. Sok közülük a PHP és a nagy alkalmazások kezelését kívánja megkönnyíteni. a PHP3-at tartalmazó oldalaknak pedig a . a kódok aránya növekedni fog. mint a PHP3-hoz. Új név Korábban az emberek a HTML-oldalaknak a . PHPtect. Mivel néhány internetszolgáltató korlátozza a php.Áttekintés Ahogy egyre kifinomultabb alkalmazásokat fejlesztesz. és azon programozók. hogy egyes oldalakat PHP3-mal. így akár minden új honlapot ettől a végponttól kezdhetsz. és a szknptekből a szövegek az adatbázisokba vándorolnak. A második típusú programozás az evolúció végpontja.html. hogy a PHP-függvények egyetlen naprakész listája csak a php. a PHP3 és PHP4 lehetővé teszi. Ebben a könyvben minden kód a második példa alapján működik. Mire a gyerekszobából elsétálsz a fogasig és vissza. nőnek egy méretnyit.net oldalon található meg — bár ez a dokumentáció is küzd azzal. új függvényekkel vagy már létező függvények új paramétereivel találkozom. A PHP3 engedi a dinamikusan generált függvényekkel való kontárkodást. másikakat pedig PHP4-gyel dolgozz fel. Új függvények A PHP4 új függvények berobbanását váltotta ki.php3 kiterjesztést adták. mint a kettőt párhuzamosan használni. akik szoktak függvényeket hozzáadni. amellyel tesztelheted és beállíthatod a PHP-konfigurációs értékeket. A kettős elnevezéses rendszer inkább a külső szervezetek által írt összetett honlapokat és alkalmazásokat kiszolgáló szerverek számára hasznos. de minden alkalommal.

000 elemű tömböt használsz. Némelyik szintaktikailag ellenőrzi a HTML-t vagy a PHP-t. Például van aki a sztringek körül a egyszeres idézőjelek használatát javasolja. akkor né mi gyorsulást érhetsz el. PHP-hibakereső A PHP-hibakereső terén izgalmas fejlesztések történnek. hogy nem kell a kétszeres idézőjelben megengedett helyettesítést elvégezned. Számos hasonló termék létezik mind Windowsra. ha egy 100. A következetesség érdekében PHP4-ben használj kétszeres idézőjelet! Az egyetlen észrevehető lassulást csak a többszörösen egymásba ágyazott függvények nagy ciklusokkal egyszerre történő alkalmazásakor tapasztaltam. Egy tényleg jó szintaktika ellenőrző szerkesztő és egy az alkalmazáshoz készített fejlesztő terv használatát javaslom. csak a PHP nem.html kiterjesztést adsz és PHP-n keresztül futtatod őket? Kis többletráfordítással a webszervered beállítható úgy. amely érvényes volt a PHP3-ra. Windows NT-n a Homesite-ot használom szerkesztésre. rejezei rnr-oevezeto Ahogy növekszik a honlapod. A PHP4 annyira gyors. az Apache. A ciklusokban a második és az utána következő alkalmakkor a kódod időt takarít meg. és csak a megfelelő adatbázist töltöm fel a szerverre. a PHP3-hoz viszonyítva annál több időt takarítasz meg. Ha a szintaktikát ellenőrzöm. hogy a honlapod gyorsaságát korlátozó tényező bármi lehet. de soha nem egyszerre. azonban a különbség elhanyagolható. hogy pontosan milyen nyelveket használsz. Sebesség A PHP4 sokkal gyorsabb. Kipróbáltam PHP4-ben az egyszeres és kétszeres idézőjelek használatát. Ha olyan programod van. ha a függvényből közvetlenül a ciklusba helyezed át a feldolgozó kódot. amit azzal érhetsz el. úgy fogsz egyre több HTML-oldalt PHP-re konvertálni. de az írás idején egyik jelentős al kalmazás sincsen fejlesztésre kész állapotban. mind Unixra. Rengeteg olyan kódgyorsító ötlet. feltéve. 8 . mint a PHP3.i.000 elemű tömbön fut keresztül. hogy az egyszeres idézőjelek kismértékben lassabbak a kétszeresnél. és nem kell magad újra és újra átrágni különféle leme zen tárolt fájlokon vagy adatbázisokon. hogy minden oldal PHP-n keresztül fusson. Ha egyszer a célszerveren fut. amely 100. hogy minden oldaladnak . és ezt követően az összes fejrészt és navigációt elkezdheted PHP-kóddal egységesíteni. ott folytatom. mert az adatbázisokkal túl sok egyedi eset történik ahhoz. PostgreSQL és más adatbázisok esetén a kódot először lokálisan próbálom ki. hogy oda-vissza ugrálgassak. Az időmegtakarítás még így is jelentéktelen ahhoz képest. mint a PHP -kód gyorsítási lehetőségeinek mélyreható elemzéséből. nem érvényes a PHP4re. a választás attól függ. Miért ne kezdenéd tehát azzal. mert a kódot egyszer fordítja. és azt találtam. a PHP és a MySQL lokális másolatait használom. és ciklusból hív meg egy függvényt. Minél nagyobb a programod. Több előnyöd származik az adatbázisod indexeléséből.

Az Apache 2 architektúrája lehetővé teszi az Apache fejlesztőinek. az Apache 2 akkor is könnyedén illeszthető. hogy először az Apache-t ajánlom. com_propset() és com_set(). com_Ioad(). amikor az nem működik megfelelően. preg_replace(). annak bármilyen használata azonnal leszűkíti az alkalmazásod használhatóságát.Áttekintés AWindowsos COM A függvények egy nagyobb részének a használatát. tökéletesítsék.vagy RTF-formátumban elmentve azt bárki.2 Regular Expressions" kifejezésre pontosan rákeresel. preg_replace_callback(). majd HTML.és a Peri-kompatíbiliseket. és a „POSIX 1003. I . Annyira könnyű telepíteni. az Apache 1 nem volt tökéletes . Még ha egy olyan ritka operációs rendszert is használsz. de a PHP-hoz és az első honlapodhoz az Apache a megfelelő választás. Egészen addig nem tudtam jó indokot arra. A PHP COM-támogatás jó néhány függvényt biztosít. és spliti(). bármilyen operációs rendszerben elolvashatja. mint az AIX. com_propget(). preg_match_all(). és sok internetszolgáltató a Windows NT-t. A FreeBSD is népszerű lett. amíg eszembe nem jutott. amelyekkel hozzáférhetsz a COMobjektumokhoz: com_get().ezért fejlesztették ki az Apache 2-t -. de mivel a COM csak Windowsos környezetben használható. ha felkeresed a www. fejezetben bemutatom a COM egy példáját. amelyik megbirkózik a FrontPage-dzsel. amelyek közé a preg_match{). hogy a COM-ot használhatod arra. preg_quote() és preg_grep() tartoznak. A COM-mal számtalan egyéb dolgot megtehetsz. A platformfüggetlen Apache Néhány évvel ezelőtt a Sun Solarist ajánlották legtöbben gyors. split(). és utána vitassuk meg a hozzávaló operációs rendszer kérdését. hogy megnyiss egy Worddokumentumot. A Periben programozók sokkal jobban járnak a Peri-kompatíbilis reguláris kifejezésekkel. ereg_replace(). annyira könnyű használni és annyira megbízható. a POSIX. Aztán jöttek a FrontPage-dzsel kísérletező százezrek.com oldalt. Tény. A reguláris kifejezésekre jelen fejezet „Gyors Megoldások" részében a „Reguláris kifejezések" pontban találsz néhány példát. az egyetlen olyan egyszerű megoldást választotta. így a PHP-szkriptek Microsoft Word-beli megnyitását is a COM (Component Object Model) teszi lehetővé. megbízható webszervernek. A 7. com_invoke(). eregi(). hogy azon ritka esetekben. A POSIX kibővített függvényei közé tartozik többek között a ereg(). PHP és Apache Melyik webszervert szeressem? Az Apache-t vagy az Apache-t? Őszintén be kell vallanom az Apache iránt érzett vonzalmamat. hogy miért használjak egy csak Windows alatt futó állományt. Végül a Red Hat Linux is elterjedt. Reguláris kifejezések függvényei A PHP a reguláris kifejezések két fajtáját támogatja. eregi_replace(). A POSIX reguláris kifejezésekről több információt és tájékoztatót kaphatsz. com_propput(). preg_split(). míg az árra érzékenyek a Debian Linuxot választották.alltheweb.

akár a PHP újabb verzióját.3. a httpd. csak válaszd a webszerver menüt. amikor szkriptet futta tsz. A Windows (a Windows 2000-től) tartalmazza az MSI-t. Rá adásul mindkettő helyett használható az Internet Server Application Programming Interface-nek (ISAPI) nevezett valami is. és utána telepítheted az Apache-t. hiszen az Apache-nak és a PHP-nek minden egyes alkalommal meg kell ismételnie a beállítást. akkor válaszd az Apache-t. majd a telepítéshez kattints az apache_1.20 szám változatonként eltérő lehet.linuxmandrake. és a PHP-t választható lehetőségként hagyja.20-win32-no_src-r2. Ha nem tudod.conf-ban megváltoztatnod. amikor az Apache elindul. oda PHP is. amíg az Apache át nem adja a szkriptedet a PHP-nek.3. amíg le nem futtatod a szkriptet. A pontos részletekkel az Apache és a PHP mellé adott telepítési útmutató foglalkozik. és utána gond nélkül válthatsz az operációs rendszerek között. töltsd le az előbbi helyről a InstMsi. A legtöbb Linux-disztribúció alapértelmezettként olyan nyelvekkel telepíti az Apache-t.corn). akkor töltsd le a másik program legfrissebb verzióját is. Ha a PHP-t az Apache moduljaként futtatod. Ha új számítógépre vagy operációs rend szerre váltasz. frissítsd az Apache-ot és röviddel utána a PHP-t.org-ról vagy egy helyi tüköroldalról.ini fájlt.exe-t. Az Apache és a PHP nem tesz semmit. bizonyos feladatokat az Apache és a PHP egyszer végez el. mint a Perl. ő is az Apache-t válassza (és legyél bizalmatlan mindenkivel.) Ha nincs a gépeden telepítve az MSI. de az Apache-ban a PHP-re vonatkozó részek ugyanazok. és az Apache már működik is. vagy be kell ásnod magad a választható összetevők menüibe a PHP telepítéséhez. A CGI egyetlen hátránya a sebesség. CGI esetén a PHP nem olvassa be a php. ami tartalmazza a „Web server" kifejezést. Ha a webszerveredet más állítja fel. Modul vagy CGI Az Apache a PHP-t Common Gateway Interface-ként (CGI) vagy modulként futtatja. hogy ha frissítéshez letöltőd akár az Apache. így azon ritka esetekben. A Linux minden disztribúciójának más menülistája van. így minden szkript futtatása egy kicsit gyorsab - 10 . de az NT 4-ben. ennyi idő alatt megjelenik a kijavított változat is. de a legtöbb telepíteni fogja az Apache-ot. A kereskedelmi oldalakra az újabb változatokat csak körülbelül 30 nappal a php. fejezet PHP-bevezető ■ $ = - Az Apache gyakorlatilag minden szerveren fut. hogy ha hiba van is az új PHP-változatban. (Az 1. illetve a korábbi Win-dowsverziókban nincsen benne. Általános szabályként fogadd el. Legegyszerűbb a dolog a Mandrake disztribúcióval (www. Ahova Apache telepíthető. A CGI ideális a PHP és az Apache tesztelésére. Emiatt vagy mindent telepítened kell.net-en való megjelenésük után teszem fel. A PHP telepítése platformonként változik. aki nem azt választaná). utána pedig minden az ideiglenes tárterületen törté nik. vagy e könyv CD-ROM mellékletéről töltsd le az Apache Win32 bináris változatát.1. ha olyasvalamire kattintasz. telepítsd. Ha a Linux Mandrake disztribúcióját telepíted. melyik operációs rendszert fogod használni.msi fájlra. Az Apache a Windows NT-re való telepítése gyors és megbízható: az apache. csak a könyvtárak nevét kell a konfigurációs fájlban.

amely nyomtatási utasítást tartalmaz. és készen állsz arra. A HTML-oldal bármely részén elkezdheted.ell a php. A legtöbb prob!éma onnan ered. hogy egyenesen PHP-ba jusson.. hogy minden kereskedelmi " rbszervereden a PHP modulként fut. de fontos biztonsági tényező az 1000 soros szkripteket író profik számára. a harmadiktól a hatodik sorig pedig egy többsoros PHP-szkriptet mutatunk: <?php ?> <?php print("Hello"). mint mások . mint itt: i f ( " a " == "a") { print("true"). Használhatsz <?-vel kezdődő dolgokat is. Ha a PHP-t az Apache moduljaként futtatod. hogy a PHP nem rendelkezik szigorú adattipizálással. kapsz ugyan néhány újabb függvényt. hogy a PHP-t CGI-ként _ttató teszt Apache-szervereden a PHP-t modulként futtasd. Minden utasítás pontosvesszővel végződik.Áttekintés :m történik. amelyek jobban működnek. A hatékonyság érdekében győződj meg róla. A PHP kód mindig ?>-vel végződik. és az utasításblokkot kapcsos zárójelek foglalják keretbe { }. tökéletes php.ini változtatásával kísérletezgetned. Ha PHP-fájlon belül PHP-fájlt ágyazol be. A PHP4-ben megjelenő fontos változások közül jó néhány az adattípusok használatát és az típusellenőrzést érinti. 11 .ebben a részben ezeket próbálom meg felfedni. így mindig a <?php szintaktikai használd.ini beállításod lesz. Szintaktika Az itt látható kód első sorának begépelésével PHP-t szúrhatsz be a HTM L-f áj lókba. Mire gyakorlatot szerzel a PHP-vel. A második sor egy egysoros PHP-szkript. de ezeket valószínűleg nem fogod az első szkriptjeidben használni. ezért ne felejtsd el a beágyazott fájlt <?php-vel kezdeni. de vannak dolgok.. vagy befejezed ezt a könyvet. a PHP a beágyazott fájlt HTML-ként kezdi olvasni. print($message). de XML-lel az nem fog működni. A PHP-kód <?php-vel kezdődik. ?> <?php Smessage = "Hello". A szigorú adattipi:ilás hátráltatja a 100 soros szkripteket író kezdőket. Tovább már nem •. A PHP Zenje A PHP-ben bármilyen stílusban programozhatsz. és a kód XML kompatíbilis.

A függvényeket a 10. igaz vagy ha mis.1. /* és */ közé megjegyzésblokkot tehetsz. . } {. a változó sztringként tárolódik. nem pedig a $A értéke: $a = "the contents of a variable". Amikor magasabb szintű nyel vekkel kezdtem foglalkozni. $c = falsé.és nagybetűk különbséget jelentenek. Gondold végig nyelvtől függetlenül a következő kódrészletet: if( S a if( $ a = = 0 ) = = 1 ) {. hogy $ jelet teszel egy név elé. de ha számként van rá szükség. hiszen a kód és az adat teljes mértékben ellenőrzésem alatt állt. különben Bizonyára tudod. majd a következő programozó megváltoztatta a mező típusát. hogy több mint két értéke van. Ekkor kezdtem mindenhez else-t adni. ez megnehezítheti a kód megértését. A sor végére // jellel megjegyzést szúrhatsz be. } 12 . fejezetben mutatjuk be. és utána azt vettem észre. . Ha. de ha később mó dosítod a kódot. Nevekkel logikai értékeket is definiálhatsz. Ha definiálod a hero()-t. és azután megpróbálod a Hero()-t is definiálni. */ Változókat úgy hozhatsz létre. és a PHP automatikusan konvertál a típusok között. mint itt: /* This is a comment that goes all over this line and another line and in fact uses up a whole three lines. igen vagy nem. Numerikus változók esetén nem kell idézőjelet használni. $A = "contents of a different variable". Régebben. változás esetén pedig a fordítóprogram figyelmeztetett. akkor a $a -t kinyomtatva a $a-hoz rendelt érték jelenik meg. a fordító vagy az értelmező pedig nem reklamált. Egy mezőt binárisan definiáltam. akkor. Ha a következő két sort szúrod a kódodba.vagy nagybetűs írásmód. A függvények neveiben nem okoz különbsé get a kis. szintaktikai hibát követsz el. $b = true. fejezet PHP-bevezető ^ f Bizonyos esetekben kihagyhatod a pontosvesszőt és a kapcsos zárójelet. PHP-ben kevesebb adattípus van. akkor számmá ko nvertálódik. mint a következő példában: $a = null. az Assembler-programokban a bináris mezőket igaz vagy hamis értékként dolgoztam fel. mint itt: print("true") . // This is a comment. és hibákhoz vezet. $a = 33. Bináris mezőt használtam. A változók nevében a kis. Ha mégis használsz. furcsa dolgokat tapasztaltam. . hogy a bináris mezőknek csak két értékük lehet: 0 vagy 1. . ezért az adattesztelés fontosabbá vált.

hogy numerikus vagy sztring mezőket igazra vagy hamisra konvertáljon. A PHP liberálisabb az adattípusok terén. . . ha jön egy másik programozó. . de ezzel sem lehet az adattípusokat rögzíteni. mint a + 1-et. és egészként definiálja a változót? Az if else-t használó próba valószínűleg úgy működik. vagy másként? Ha nincsen logikai else. az az. ha a következő programozó negatív számot használ? A -1-et ugyanúgy értékelje. . } { . . } else print("Warning message. amely nem létező mező beolvasására irányuló próbálkozás. s o m é s or t falsé) {} true) {} { .. .. hogy a mező létezik-e. . mert a PHP a hiányzó mezőket ugyanolyan nevű változóval helyettesíti. . mintha 1 lenne. . . hogy a mező igaz vagy hamis. ezért az adatok értelmezésénél nagyon figyelned kell. " ) .} Először is ellenőrizned kell. A következő kód szintén működik egy ilyen nyelv esetén: i f {$ a == 0) } else { . és a PHP4 bevezette a = = = összehasonlítást. . ellenőrizned kell a negatív számokat. minden mást igaznak tekint. } of warning.Áttekintés Szigorú tipizálás és bináris mező mellett a kód tökéletesen működik. A két if utasítást tartalmazó kód nem fog működni. viszont a = = = először ellenőrzi. Amikor más rendszerből vagy a PHP-tól különböző más programmal létrehozott fájlból kapsz adatot. míg más nyelvek a negatív számokat hamisnak tekintik. ahogyan tervezték. hogy megfelelő típusú-e a mező. mert a = = engedi a PHP-nek. Mi történik. } . amellyel típusonként ellenőrizheted az értékeket. illetve azt. . hogy minden figyelmeztetést állíts be. A PHP a 0-t hamisnak. Mi történik. mint itt: if( $ a = = 0 ) { . 13 . Amit a „PHP konfiguráció" rész „Gyors megoldások" pontjában javaslok. így minden olyan kísérletről értesülsz. . A == jelet = = = jelre kell cserélned. . . hiszen minden I-nél nagyobb érték esetén ugyanaz lesz az eredmény. íme egy kísérlet egy egyszerű binárisnak feltételezett mező összes lehetséges kimenetelének definiálására: if (!isset( $ a ) { elseif ( $ a === elseif( $ a === elseif( $ a = = 0 ) elseif ( S a < 0) else { . A következő annak ellenőrzése. hogy az azokat létrehozó szoftver miként kezelte a negatív számokat.} elseif( $ a = = 1 ) { . hiszen minden I-nél nagyobb értéket figyelmen kívül hagy. használj figyelmeztető üzenetet. . és a kód mindkét esettel foglalkozik. mert $a csak 0-t vagy 1-et tartalmazhat.

bizonyos más nyelvek viszont hamisnak. Ne felejtsd el. Csak így lehetsz a nyelvekre való tekintet nélkül biztonságban. Az üres értéket tartalmazó TINYINT megzavarhatja az SQL. ha pedig ezzel megvagy. hogy azután az adatbázisszoftver az SQL-ábrázolásból a legkisebb helyet elfoglaló bináris formátumúra fordítsa azokat. a zéró hosszúságú sztringeket konvertáld &nbsp-vé. még azokra is. függetlenül attól. mert néhány böngésző törli a táblázatok üres celláit. majd a PHP-nek legjobban megfelelő formátumban juttassa őket vissza. Az adatbázisok olyan alkalmazások. tágítsd a kijáratot Minden nyelvben a legbiztonságosabb programozási stratégia a hibás adatok bevitelének korlátozása. hogy ők nem olyan aprólékosak vagy precízek. mint az igaz vagy hamis. A dokumentációdnak pontosan definiálni kell. és lehet. hamisnak. így lehet. hogy a kódod túlélje a hibáikat! . Jelen rész írásakor a MySQL-adatbázis nem rendelkezett igazi bináris típusú mezővel (a közeljövőre ígértek egyet). amelyek nem akadályozzák az output oldal működését. ami az SQL-nek és az adatbázisnak megfelel. Az ismeretlen értékeket olyan értékké konvertáld. mint te. az űrlap és az adatbázis közötti kódnak pedig biztosítania kell. hogy az pontosan meghatározhassa. hogy „Nem tudom" vagy azt. amely ellenőrzi és megjeleníti az első rekord összes mezejének értékeit. fejezet HHH-oevezető A megfelelő adattípus Amikor először kapsz adatot valamilyen forrásból. az üresen hagyott mező azt jelenti. 0-nak vagy ""-nek fordítsuk? Az ellenőrző rutinnak segíteni kell a látogatót. így NOT NULL-ra állítva tudod őket kikapcsolni. hogy milyen érték kerüljön tárolásra.7. hogy az adatbázismezőbe mi illeszthető be. amelyek megbolygatják az adataidat. amelyeket könnyen lehet más értékre konvertálni. Ha egy látogatód kitölt egy űrlapot. a szkriptedet olyan kóddal akarod kezdeni. Sokan közülük gyakorlat és tapasztalat nélkül dolgoznak website-okkal. Ha az adat már az adatbázisban van. amelyeket a beviteli rutin nem engedélyez. hogy mások is dolgozhatnak a kódoddal.vagy PHP-kódodat. A mező negatív értéket is tartalmazhat. Ha az output adatok HTML-táblázatban jelennek majd meg. az üres és hamis értékeket konvertáld zéró hosszúságú sztringekké. Szűkítsd a bejáratot. hogy minden átjusson. és utána megjeleníti az első rekordtól eltérő rekordokat. hogy „Nem érdekel"? A választ semminek. ezért állítsd a mezőt UNSIGNED-ra (előjel nélkülire). hogy kitörlik a NOT NULL-t a mezőkből. és az eltárolt formátumukat jelenítik meg. akkor úgy programozz. A negatív értékeket a PHP igaznak tekinti. Leggyakrabban az olyan értékekkel fordulnak elő hibák. és szúrj be figyelmeztetést vagy hibaüzenetet. így a bináris értékek tárolásához a MySQL TINYINT-jéhez hasonló valamit kell használnod. Törekedj arra. hiszen átkonvertálják őket belső tároló formátumukra. hogy mire gondolt. rninden lehetséges értékre definiálnod kell a feldolgozási folyamatot. Adataidat olyan formátumúvá kell konvertálnod. Ha a programodnak postai irányítószámokat kell megjelenítenie. hogy az adatbázis csak a dokumentált értéket kapja meg.

$k . each($list)) $text . ami megjegyzést jelöl. a httpd. ": $v) = " .) című könyveket. .dll" AddType application/x-httpd-php . Inc. hogy index. és a könyvtár nevét arra a könyvtárnévre kell változtatnod. hogy megjeleníthesd az e függvények által adott listákat: function list_list($list) { Stext = "". Ahol a Directorylndex-et látod. a következő kódot szúrd be az Apache konfigurációs fájljába.exe" Egyedi Apache-függvények Az itt példaként bemutatott függvények információt adnak az Apache-ról.confba. } 15 . Inc.lib AddType application/x-httpd-php . szúrd be.html index. amivel a PHP-oldalak működnek.= "<br>" return ($text). php4 #Action application/x-httpd-php "/cgi-bin/php. $v. Az ezen függvények által adott elemek leírását egy az Apache-ról vagy a HTTP-ről szóló jó könyvben találod meg.php AddType application/x-httpd-php . ahova a PHP-t telepítetted.php vagy index és bármilyen kiterjesztés. Ugyanezt tedd meg az AddType-pal: minden olyan oldal kiterjesztéshez. Megjegyzéssé alakítottam azt a sort. A LoadModule sor az Apache-ot a PHP4 ISAPI változatához irányítja. amelyet PHP-vel akarsz feldolgozni.php3 AddType application/x-httpd-php .php LoadModule php4_module "c:/Program files/php/sapi/php4apache. a HTTP-ről vagy az Apche-ot körülvevő környezetről.Gyors megoldások Gyors megoldások Apache-konfiguráció Ha PHP-hez konfigurálsz Apache-t. Az utolsó sorban # jel van. és lecserélné a LoadModule sort: Directorylndex index. adj hozzá egyet.html AddType application/x-httpd-php . Tartsd az alábbi kódot mindig a kezed ügyében. Ajánlom a Greg Holden-Nick Wells: Apache Server Commentary (The Coriolis Group.) és Greg Holdén: Apache Server for Windows Little Black Book (The Coriolis Group. ami modul helyett CGI-ként futtatná a PHP-t. whilejlist($k.

Ha a saját Apache-modulodat úgy írod meg.html filename: i:/petermoulding/web/root/phpblackbook/apache_lookup uri. A PHP-n belül üzeneteket tartalmazó megjegyzéseket állíthatsz be a moduloknak. Ha olyan preprocesszort írnék. mi értelme lehet az oldalakat a PHP után feldolgozni. egyszerű PHP változó-hozzárendeléssel. Egy Apache megjegyzést az alábbi kóddal állítasz be: apache note("visitor". Ez az eredmény: Status: 200 the_request: GET /phpblackbook/apache_lookup_uri. ha a PHP modulként van telepítve. ezért a függvény kipróbálására használd ezt a kódot. akkor üzeneteket küldetnék a preprocesszorral a PHP-szknptnek.(ASP-) fordító. mint például az Active Server Pages. CGI-n keresztül futtatva viszont nem. hogy az . hogy a PHP-bóí megjegyzéseket küldj a többi modulnak.mielőtt a PHP látná az oldalakat — dolgozza fel azokat. Az apache_lookup_uri() eredményként egy objektumot ad. /e/ezer rnr-oevezeio apache_lookup_uri() Az apache_lookup_uri() függvénnyel az Internet-erőforrásokról kaphatsz információt. hogy megjegyzéseket továbbíts az Apache modulok között. hiszen PHP-vel mindent elvégezhetsz. . így soha nem lesz szükséged arra.. akkor egy adatokat tartalmazó megjegyzést állíthatsz be a PHP részére. amelyek a PHP után dolgozzák fel az oldalt. A függvény csak akkor működik.html request_time: 987732253 apache_note() Az Apache megjegyzésrendszere lehetővé teszi. "Péter Moulding") Apache megjegyzést a következővel kaphatsz: print(apache_note("visitor")). ami egy webszkripthez kell. Nem tudom.0 method: GET content type: application/x-httpd-php uri: /phpblackbook/apache_lookup_uri. és nézd meg az eredményt: print(list_list(apache_lookup_uri($PHP_SELF))).html path_info: no_cache: 0 no_local_copy: 1 allowed: 0 sent_bodyct: 0 bytes sent: 0 byterange: 0 clength: 0 unparsed uri: /phpblackbook/apache lookup uri..html HTTP/1.

A függvény akkor működik.ini konfigurációs állományt.com/phpblackbook/ User-Agent: Mozilla/4. használhatod az ascii2ebcdic() vagy ebcdic2ascii() függvényeket. amikor a PHP-t modulként telepítettük. amelyet a PHP-szkripteden keresztül akarsz betölteni. de csak OS390-en és BS2000-en működnek. amely lassan hajtja végre a változtatásokat. és nézd meg az eredményt: print(list_list(getallheaders())) . amely rengeteg memóriát használ. 17 . image/jpeg. Ezeket a problémákat a dl()-függvénnyel mind orvosolhatod. Az eredmény így néz ki: Accept: image/gif. az EBCDIC gépen csináld. A függvény eredményül egy objektumot ad.com Pragma: no-cache Referer: http://test. Ezek ASCII-ról EBCDIC-re és vissza fordítanak.*. Esetleg egy olyan monstre kiterjesztésre van szükséged. és a telepítési paraméterek a szkripten belüli paraméterekkel is beállíthatók. image/x-xbitmap. hogy frissítsd a php. magadnak kell az új kiterjesztést feltöltened. Ha egy fájlt EBCDIC-ről kell ASCII-re fordítanod. */* Accept-Charset: iso-8859-l.utf-8 Accept-Encoding: gzip Accept-Language: en Connection: Keep-Alive Hőst: test.a futás közbeni konfigurációra koncentrál. hogy hiányzik egy PHPkiterjesztés. viszont csak egy szkript erejéig van rá szükséged. getallheaders() A getallheaders() függvény az összes olyan HTTP-fejlécet megjeleníti.petermoulding.petermoulding. Ha olyan internetszolgáltatót veszel igénybe. Ez a rész ahol csak lehet .76 [en] (WinNT. U) PHP-konfiguráció A PHP-konfigurációs kérdések eltűnőben vannak: az alapértelmezett telepítés jól használható. ezért a függvény kipróbálására használd ezt a kódot. amelyek a szkripteddel előállított oldalak kérésére érkezett. image/png.ini-t használva konfiguráltad a PHP-t. image/pjpeg. Miután a php. észreveszed. ha a rendszergazda vagy az internetszolgáltató megakadályozza. és utána küldd a fájl az ASCII gépre. mert azt kell használnod.Gyors megoldások ascii2ebcdic() és ebcdic2ascii() Ha történetesen OS390-t használó IBM vagy BS2000-t használó Fujitsu Siemens nagygépen futó Apache-ra írsz szkriptet.

mert kevés lehetőséged van az eredmény ellnőrzésére.50"). Hibakeresés A szkripteken belüli hibakeresés legjobb módszere. Az assert() bármilyen sztringet elfogad az értékeléshez. vagy pedig kevert neveket és számo kat is engedélyezel? Mit írsz be az érdeklődő potenciális vásárlókra? Ha egyszer már túl vagy a tervezési fázison és igazán fogós problémákkal találod magad szembe.dll vagy . - A dl() függvény fájlnevet fogad el. Ne használd az assert()-et. Windowsban a dl()-t használva a gnu_gettext betöltéséhez. így használhatod hibakeresésre. Az extension_loaded() függvény eredményként igazat ad. Valójában a teszteket akkor kellene megírnod. ha még nincs: extension loaded("gnu_gettext"). Alapbeállításként a dl() függvény a php.html 5.ini-ben meghatározott extension_dir-ből tölt be. semmire nem használtam az assert()-et. általában a . fejezet PHP-bevezető »?■ :■! . Az assert() szigorúan hibakeresési célokra szolgál. és 50 elkészített honlap után mellesleg megjegyezhetem. Ne használd viszont felhasználói input érvényesítésére. építs be egy üzenetet is. az extension_loaded() a PHP belső modulnevét használja. Mint az itt is látszik. ha a szkripteket tesztekkel és üzenetekkel mindjárt az elején elárasztod. Unixban a dl()-t használva a gnu_gettext betöltéséhez. hogy soha. mikor a szkript kódolása előtt dokumentálod az adatokat. assert() Az assertQ egyenértékű az if(eval()) függvénnyel. a következőket írd be: dl("gnu^gettext. line 5 sorában) Warning: Assertion failed in /petermoulding/assert. ahol az egyetlen művelet a hamis ered mény esetén megjelenő üzenet. Az assert()-tel kapcsolatban a következő három szabályt tartsd be: 1. és hamisat. így rögtön az utasítás után az alábbi üzenet jelenik meg: / assert( 2 5 == 92).1. 18 . ha a kiterjesz tés be van töltve. extension_loaded() Mielőtt a kiterjesztés betöltéséhez a dl()-t használnád. az extension_loaded() függvénnyel ellenőrizheted. hogy az adott kiterjesztés be van-e már töltve.dll"). A következő utasítás hamis. Ha egy tesztet raksz be. A vevőazonosító mindig egész szám. :. az alábbi hibakeresőket veheted igénybe. amely megmutatja.so kiterjesztés nélküli fájlnevet. és a fájlnévhez pontos elérési információ szükséges. a következőket írd be: dl("gnu_gettext. hogy melyik adatot ellenőrizted és mi lett az eredmény.html on (Figyelem: Az állitás hamis a /petermoulding/assert.

Gyors megoldások 2. íme egy gyilkos kód. amelyik rejtélyes üzenetet küld és megáll. amely megöli a szkripted. 3. 1. és hasznos üzeneteket küldj. Az itt látható első kódsor egy az assert()-hez kapcsolódó opció aktuális értékét eredményezi. Az 1. $setting = assert_options(ASSERT_ACTIVE. olvasd el a dokumentációt a php. Kövesd az 1. Kereskedelmi honlapokon mindent gondosan próbálj ki. hogyan kell az opciónak új érté ket. Ha van egy clean_up_files() nevű hibamentesítő függvényed. Sokan szeretnek olyan szkriptet írni. This script is suffering acute bad programming (Ez a szkrip rossz programozástól szenved) A fájlok hibamentesítésére a die() függvényt is tartalmazhat. szabályt. ha a kiértékelés nem sikerül ASSERT_ _QUIET_EVAL Kikapcsolja az error_reporting-ot kiértékelés alatt ASSERT_ . ha a kiértékelés nem sikerül Függvényt hív be.WARNING Figyelmeztet a sikertelen kiértékelésről assert_warning 1 die() A die() a szkripted utolsó leheleteként egy üzenetet ad ki. a második sor azt mutatja meg. akkor a következő kód lefuttatja.ini-ben és az assert_options()-on keresztül beállított assert()-opciókat mutatja. amit produkál: die("This script is suffering acute bad programming") . assert_options() Az assert_options() függvény némi ellenőrzési lehetőséget ad az assert() használata után kapott eredmény felett. Sose tedd ezt egy ügyféllel.net oldalon. és az üzenet. jelen esetben 1-et adni: $setting = assert_options(ASSERT_ACTIVE).1 táblázat a php. Ha mégis használod az assert()-et.1 táblázat assert() opciók assert_options() Php. 1 ) .ini opciói Alapértelmezett érték assert_active assert_bail assert_callback assert_quiet_eval 1 0 üres 0 ASSERT_ _ACTIVE ASSERT_ _BAII_ ASSERT_ _CALLBACK Használat Bekapcsolja az assert()-et Befejezés. majd megöli a függ vényt: _ clie(clean up 19 . naplózd a problémákat.

míg a második ilyen eset ben figyelmeztet. Az egyéb függvényekből származó hibákat a globális PHP-hibamezőben.ini-ben alapértelmezett beállítás: error_reporting = E_ALL & ~E_NOTICE Ezt azonnal állítsd át erre: error__reporting = E_ALL A két beállítás közötti legfőbb különbség az. hogy a felhasz nálók lássák ezeket. így feltétlenül nézd át azt a fejezetet. Ha ezt sem teszi meg. ahova az error_log beállítás mutat. a MySQL-függvények hibaüzenetet eredményeznek! Te viszont nem akarod. hogy az alapértelmezett beállítás megengedi. (A php. Ha az internetszolgáltatód nem engedi. és utána a MySQL által előállított hibamezó'kön végezz hibaellenőrzést. hogy minden figyelmeztetés nélkül hiányzó változókat használj. A 0 azt jelenti.htaccess fájlokat. majd úgy döntesz. Kimenet-ellenőrzés Előfordulhat. hogy az üzenet oda kerüljön. a $php_errormsg-ben találod. amellyel leállítha tod a hibát előállító függvényeket. majd kiiktathatod a hibákat. és a naplót a PHP saját naplójába. Naplózás A PHP hibanaplót vezet. de erre soha nem lesz szükséged. hogy állítson be .ini-ben hatályon kívül helyezheted a hibajelentő beállításokat. Ezért @-val szüntesd meg a hibákat. keress másik szolgáltatót. Az üzenetet e-mailen keresztül is elküldheted. így elkerülheted a hiányzó változó — egyszerű gépelési hibák miatt történő .ini-t. hogy törlőd a kimenetet. fejezet FHH-bevezetö Hibák A php.ini a beállítást leíró megjegyzéseket tartalmazza. Ha az SQL-ben hiba van. A mail() függvénnyel a 15. ha a 0-t l-re változtatod és a mail() függvényben használt fejlécekhez további fejléceket adsz hozzá. hogy a kimenet ténylegesen mikor kerüljön a böngészőbe. fejezetben foglalkozunk. 0 ) .) Az error_reporting() használatával a php.használatát. hogy a HTML kimeneti adatokat anélkül akarod megírni. Ha meg akarod szüntetni a hibákat. írd ezt: ob start () . 20 . a függvénynevek elé tegyél @ jelet. mielőtt a hibaüzeneteket e -mailben próbálnád továbbítani. A következő utasítással saját üzenetedet is hozzáadhatod a hibanaplóhoz: error logC'this is a message". hogy megváltoztasd a php. kérd meg. hogy a kimenetet elküldenéd a böngészőnek. a rendszernaplóba vagy a php.ini error_log konfigurációs sor használatával egy fájlba irányíthatod. Ha a kimenetet még nem akarod a böngészőbe küldeni. A PHP kimeneti pufferrel kontrollálhatod.7.

hogy igaz. . . } : • . Ha úgy döntesz. hogy nem küldöd a kimenetet a pufferba. mert a felhasználó bármilyen neki tetsző PHP-kódot alkalmazhat. Néhány böngésző puffereli a bemeneti adatokat. hogy a pufferbe küldd. és ezzel tönkreteheti a rendsze red. A Netscape legtöbb változata addig nem jeleníti meg a táblázatokat. sztringekkel helyettesítheted őket. így akármit is csinálsz. ha egy látogató által bevitt adatot az evalQ függvénnyel dolgozunk fel. Felhasználói adattal soha ne futtasd az eval()-t. írd ezt: ob_end_clean(). $x = "apples and pears are fruit". . és csak azokat a tag-eket dolgozd fel. ereg() A következő kód azt írja ki. if (ereg("pear". állítsd a bemenetet XML-folyamra. Ha el akarod olvasni vagy lemezre akarod menteni a puffereit kimenetet. hogy a felhasználók pofás formátumellenőrzőt használva vihessenek be adatokat. Néhány webszerver a PHP-ból puffereli a kimenetet. Ha azt akarod. amíg nem kapja meg a </table> végtag-et. írd ezt: $x = ob_get_contents(). $x) { print ("true").Gyors megoldások Ha már készen áll a kimenet arra. így azt PHP-ból nem tudod kontrollálni.■ 2 1 . és azokat sem tudod PHP-ból kontrollálni. Biztonság A PHP legfőbb biztonsági problémája akkor jelentkezik. amelye ket elfogadsz. mert az ereg() megtalálja xftear-sztr'mget a $x-en belül. A PHP számos függvénye sokféleképpen teszi lehetővé a reguláris kifejezések használatát. írd ezt: ob_end_flush{). a hosszú táblázatok megjelenítése örökkévalóságnak tűnhet.• ? Sztringfügg vények 57 Reguláris kifejezések A reguláris kifejezésekkel sztringen belül kereshetsz sztnngekre.

ereg_replace() Az ereg_repkce() függvénnyel az ereg()-et helyettesítheted. "orange". A következő kód a pear-t orange-dzszí helyettesíti: $x = "apples and pears are fruit".és nagybetűket.4} Sok más szimbólumot is használhatsz a reguláris kifejezések eredményeinek ellenőrzéséhez (a www. Az 1.com/columns/dariol9990616. hogy az ereg() a Pear-t nem találná a $x-ben. $x). amelyekkel az eregQ-keresés kiegészíthető. melyben a keresési sztring után bármilyen karakter lehet Asztringben a kapcsos zárójelben meghatározott számú karaktert keres A sztringben a kapcsos zárójelben meghatározott számú karaktereket ^pear pear$ an* Eredmény pear pear ann vagy annn vagy annnnnnnnn annn annn vagy annnn an{3} an{3.phpbuilder. amely nem különbözteti meg a kis.php3 nagyon jó cikket tartalmaz a reguláris kifejezésekről). én most mégis továbblépek más PHP reguláris kifejezésekre. 1. rejezet HHH-bevezetö Felhívom a figyelmed.és nagybetűk közötti különbséget. akkor a pear-t találja meg. eregi() Az eregí() függvény az ereg() olyan változata.2 táblázat olyan speciális karaktereket tartalmaz. hogy a keresési sztringnek a keresett sztring elején kell lennie $ * Jelzi.2 táblázat eregQ speciális karakterek Szintaktika Jelzi. Ha az eregí() keresi a Pear-t a $x-sztringben. hi szen az eregi() figyelmen kívül hagyja a kis. hiszen az ereg() megkülönbözteti a kis.7. ereg_replace ("pear". hogy a keresési sztringnek a keresett sztring végén kell lennie Olyan sztringet keres. strtolower($x)). 22 . Az eregi{)-t a következőképpen tartsd fejben: \ ereg (strtolower("pear").és nagybetűket.

amely nem különbözteti meg a kis. amely a sztring határolójel menté n felosztott részeit tartalmazza. majd kinyomtatja a tömböt. $x). " ) . spliti() A spliti()-függvény a split() olyan változata.apples. 23 .oranges: $x = "pears and apples and oranges". és akkor is működne.és nagybetűket. split() A split()-függvény egy sztringtömböt eredményez. while (üst ($k. ha az előző példában az egyik and helyett And-et írtunk volna. A következő kód a $x-et a $a tömbbe töri le. Az eredmény pears.és nagybetűket. amely nem különbözteti meg a kis. " . $v) = each($a)) { print($v .Gyors megoldások eregi_replace() Az eregi_replace() függvény az ereg_replace() olyan változata. $a = split(" and ".

fejezet Adatok Gyors megoldások Adatok létrehozása Sztring-adatok Egész és lebegőpontos adatok Adatok ellenőrzése Adatkonvertálás Sztringfüggvények rand(). srand() és microtime{) Dátum és idő kiszámítása Húsvét oldal: 51 51 52 52 55 57 62 63 65 UJJil .2.

egészként. lebegőpontos számként. íme egy egyszerű sztring: $a = "any alphanumeric characters". A tömböket részletesen a 3. Ha az adatokat hibásan adod meg. Változók A $a egy változó. Ha a PHP-adatokkal szokatlan eredményre jutsz. és 6. ha 0 helyett 1-gyel kezdted a számolást. a tömbökben és a függvényekben nullától kezd számolni. amit a PHP automatikusan végez. Az egyes adatbázisokkal részletesen az 5. hogyan tudod az adatokat összehasonlítani és megváltoztatni. így ha feltételezéssel élsz egy változó típusát illetően. Valójában az előző kódban példáként bemutatott $a sztring is tömb. ami rendkívül zavaró lehet. például MySQL-adatbázisra hivatkozunk. A „Műveletek az adatokkal" című részben bemutatom. A $a ötödik eleméhez a következő utasítással jutsz: $fifth = $a[4]. hamissá vagy nullává konvertálható. Mindezekről a fejezet későbbi részében beszélek. A konstansok értékét és a változók értelmezési tartományát nem lehet megváltoztatni. 26 . a PHP a sztringekben. Azonban a PHP szükség esetén automatikusan megváltoztatja a változók típusát. például egész. -teszteléssel és -konvertálással foglalkozik. de üressé. Egy zéró karaktert tartalmazó sztring (mint a következő példa első sora) sztring ugyan. Adattípusok PHP-ben az adatokat definiálhatjuk sztnngként. hogyan tudod az adattípusokat kontrollálni. Szeren csére a PHP4-ben számos további eszköz áll rendelkezésre az adatok egyszerű ellenőrzéséhez. és adatokat írj saját adatbázisba. meglepő eredményeket kaphatsz. hiszen értékét bármikor megváltoztathatod. így a $a ötödik elemére [4]-ként hivatkozunk. így például a kezdő karakter számot a substrQ-függvényben. A példák segítenek abban. -létrehozással.vagy sztringtípusú változók lehetnek. A változók meghatározott. de néhány egyszerű tömböt ebbe a fejezetbe is becsempésztem. ami fokozza a hibakeresés nehézségeit. de hibás eredményeket kapsz. A fejezetben egyedi adatforrásokra és rendeltetési helyekre. hiszen tömbökkel könnyebb az adatgyűjtés. Ez a fejezet az adatdefiniálással. A PHP automatikus típuskonverzióval rendelkezik.Áttekintés Az adat a program alapvető alkotóeleme. A „Változók" című részben meglátod. arra az esetre. Mint látni fogod. ellenőrizz minden indexet és hivatkozást. hogy adatokat olvass be saját forrásokból. Ezenkívül az összetett matematikai műveletekhez a PHP speciális matematikai függvények két halmazát biztosítja. logi kai értékként és a típusok összetett keverékeként. fejezet ben tárgyalom. a program ugyan működni fog. fejezetben foglalkozunk.

. mert lehet.ini beállításokat az 1. azaz a Speter nem azonos a $Peter-rel. A $Peter_The_Great változó nem azonos a $PeterTheGreat-tel. de belefáradsz a gépelésbe. Automatikus létrehozás A hiányzó változókat a PHP automatikusan létrehozza. A változók hosszúsága maximált. Takarékoskodj az alulvonás (_) karakter használatával . a sztring megjelenítés hosszúságával gazdálkodhatsz. 27 . A PHP alapértelmezetten létrehoz a print-utasításban egy üres változót $meter névvel. print{$meter) . Ha a php. Jómagam minden ellenőrzést a figyelmeztetéseket bekapcsolva végzek el. bizonyos operációs rendszerekben nem. hogy a szám a lemezen mennyi területet foglal majd el az adatbázisban. amikor létrehozza a változót. mint az is_integer{). fejezet tárgyalja. A szükséges php. hogy a változó létezik-e. Körültekintően használd az unset()függvényt a különleges értékek jelölésére. így észlelhetem és kijavíthatom az ilyen jellegű hibát: $metre = 3 5. és mindkettő különbözik a $PeTeR-től. hogy a változó létezik-e. de nem az összes adatbázisban. hogy hol használhatom és hol nem. Ha számokkal dolgozol és az adatbázisban tárolod őket. Az alulvonás karakter működik MySQL-ben. de a sztringek majdnem korlátlanul hosszúak lehetnek (csak a memória korlátoz).. amikor a kód az Ísset()-et használja annak ellenőrzésére. és mivel bármi sztnnggé konvertálható. észre fogod venni. ahogy bizonyos operációs rendszerekben a fájlnevek tartalmazhatnak alulvo-nást. előfordulhat.Áttekintés A sztring. . Konstansok A konstanst begépeléskor kell meghatározni: def ine ( "a".bár hosszú változóneveket kreálhatsz. a == műveleti jelet a ===== jellel helyettesítsd. mint te. A változók neve különbséget tesz a kis. amely O-át tartalmaz ( a péda második sorában) automatikusan átkonvertálható üressé vagy hamissá: $s = . "any alphanumeric charapfceí^s") . hogy más nem annyira következetesen használja az isset()-et. Éppen úgy. Mivel nehéz megjegyezni. az unset()-függvény pedig teljesen eltávolítja a változót.'■■»-. A következő példában a definíciós sorban $metre-ként begépelt változóra a print()-utasításban $meter-ként hivatkozom. Ha az adattípus nagy jelentőséggel bír.és nagybetűk között. hogy a PHP-függvény által jelzett hosszúság nem segít annak kiszámításában. külső nevek esetén inkább nem használom az alulvonást. Az unset() olyan esetekben használható. hogy a hiányzó változók miatti figyelmeztető üzenetek elmaradnak. Ha a figyelmeztető üzeneteket bekapcsoltad. amelyek máskülönben figyelmeztetnék a programozókat az isset() használatára. vagy használj olyan típustesztelő függvényt. $t = " 0 " .ini értékei nem megfelelően állítottad be. ráadásul az előbbit sokkal könnyebb elolvasni. Az isset()-függvény ellenőrzi. amelyet a következő részekben mutatok be. akkor a PHP figyelmeztet.

azaz mindenhol. Először is nyugtasd meg magad egy csésze forró kamillateával. és ahogy ezt a következő részben bemutatom. Ettől összezavarodhatsz. A define parancs bárhol alkalmazható. majd pedig a definiált névvel közvetetten utalhatsz az objektumra. a $whisky üres lesz.2. így függvények belsejében is használhatóak. míg a hatókörök objektumokkal kapcsolatos részleteit a 17. a definiált konstansoknak globális a hatókörük. és miközben megpróbálod kijavítani alkalmazásodat. mint az objektumok. Mivel a PHP automatikusan létrehozza a hiányzó változókat. operátort. Egy így létrehozott alkalmazástól azonban biztosan felforr a következő programozó agyvize. A hatókörről és a függvényekről további részleteket a 10. ahova a változók hatóköre egyébként nem ér el. így a függvényt majdnem teljesen az azt körülvevő kódtóí függetlenül írhatod meg. A define parancs szimpla adatdefiníciókat fogad el. ellenőrzést és szerkezetet. továbbá sokféle lehetőséget nyújt az adatok kezelésére mind az adatbázisok. így akár szükséged is lehet erre az italra. Műveletek az adatokkal A PHP számtalan kifejezést. hogy az adat hol használható. a függvényeken belül definiáltak pedig a függvényeken kívül nem láthatóak. pánikba esel. mind pedig a HTML felé. osztályt és objektumot kínál. ha a függvényben a változót globálisként definiáltuk. majd egy függvényen belül $whisky-ként hivatkozol rá. majd az alábbiról . és a hagyományos változók is benyúlhatnak egy függvénybe. A fenti példában az a konstansnak az any alphanumeric characters az értéke. fejezet Adatok A define parancs az első paraméterként megadott névvel létrehozza a konstanst. a nevet alkalmazhatod egy objektum létrehozásakor. A függvényeken kívül definiált változók a függvényen belül nem láthatóak.ini-t a következőre: error_reporting = E_ALL Az -~E_NOTICE eltávolításával a PHP figyelmeztet a hiányzó változódefiniálásra és más ördögi csapdákra. 28 . A define-t használhatod név tárolására. és a második paraméterként adott értéket rendeli hozzá. fejezetben olvashatsz. Hatókör A hatókör határozza meg. de valójában üres változók miatt. így olyan összetett adatstruktúrákra. Az egyes adatok hatóköre eltérő és változtatható: a definiált konstansok átnyúlnak a függvények határain. függvényt. error_reporting = E_ALL & ~E_N0TICE változtasd a php. nem használható. fejezetben találod. Ha a kódodban $whiskey néven hozol létre változót. könnyen megzavarodhatsz az adatot tartalmazónak vélt.

fejezetben találod. A következő sor a 29-et fogja kinyomtatni. A while()-ciklus addig lép vissza a kifejezésre. melyeket az jobbról balra értékel. majd a válasz hamis lesz. amíg a sorok el nem fogynak. amíg az hamissá nem válik.) A mysql_fetch_row() addig ad adatot. mint a következő példában bemutatott if(). Ez a példa triviális ugyan. a $age. ám ez a tulajdonság jól használ ható ellenőrzéskor. hanem a $row feldolgozására szolgáló kód is: while($row { = mysql_fetch_row($query_result)) print("Another row from the SQL query"). amit 29-re állítottál be. Amíg az eachQ ellátja adattal a list()-et. Amikor a $row hamissá válik. rálép a következő elemre.Áttekintés Kifejezések A PHP-ban minden kifejezés. hogy a kifejezéseket használható módon érté kelje. Bővítsd ki a sort "$age = 29. mint a kifejezés bal oldalához hozzárendelt érték: print($age = 29) . illetve majdnem bármilyen függvényt körbecsomagolva a kapott adatok alapján könnyen ellenőrizhető az adatfeldolgozás folyamata: if($age = 2 9 ) { print("Age is true"). (Az adatbázisfüggvények részletes magyarázatát az 5. A Hst() az elemet kulcsra és értékre bontja. fejezetben látni fogod. a grafikus függvényeket. és a while() leállítja a ciklust: while (Üst ($key. és igaz választ eredményez. így utána a $number is 29. és maga az egész utasítás. a 29-et egy önmagában álló sorba. a listQ hamis értéket továbbít a while()-nak. az egész kifejezés ($row = mysql_fetch_row($query_result)) értéke hamis lesz. Az each() a tömb egy elemét adja vissza."-re. Az if() és while() ellenőrző függvényekkel a fájl. PHP-ban lehetséges több egyenlőségjel használata is. $value) = each { $array) ) 29 . és a kifejezés értéke nem más.és adatbázisfüggvényeket. hogy a következő while()-szerkezet hogyan lépked a tömbökön keresztül. hiszen a printQ-függvény a kifejezés értékét jeleníti meg. majd a print()-utasítás eredményeként megjelenik a 29: print($number = $age = 2 9 ) . A 3. ha ez bekövetkezik. a while() igaznak értékeli a kifejezést. Gépeld be a koromat. ha elén a tömb végét. és hamis eredményt ad. átugorja a program további részeit. Amikor az each() hamis értéket továbbít a list() -nek. A következő példa a mysql_fetch_row()-függvénnyel olvas be egy MySQL-adatbázisból SQL-lekérdezéssel generált adatsort. és folytatja a ciklust. Most már három 29 értékű kifejezésed van: az eredeti 29. A kifejezések értékét olyan ellenőrző függvényekben is használhatod. így a while()-ba is hamis kerül. és egy 29 értékű kifejezést kapsz. A PHP mindent megtesz annak érdekében. például a példában szereplő print-utasítás lenne a ciklusban. A következő példában a $age 29. A programodban nem csak egy.

Ahelyett. + . Ha ismered a Perit vagy a C-t. // 25 A következő sor az egyenlőségjel egy gyakori csapdáját mutatja. amelyben mindent megtudsz a feldolgozási folyamat ellenőrzéséről. akkor eleget tudsz ahhoz. A következő kód eredménye mindig igaz. 10 évben használtam: $age_2004 = <$age_2003 = < $ a ge _ 2 0 0 2 = ( $ a ge = 2 5 ) ) ) . hogy az esetek többségében jól tippelj.$. // true 30 . Ezek a PHP-operátorok. ha egy folyamat véget ért. ==. a // jel után látható (a // jellel egy egysoros megjegyzés kezdődik. hiszen az egyenlőségjel a $width értékét a $height értékével teszi egyenlővé. ! = . Ebben a példában minden születésnapomba az az érték kerül. hogy az egyes utasítások eredményét külön sorban mutatnám meg. de a PHP fügvények most már csaknem teljesen egységesen hamis eredményt adnak. döntő fontosságú a kifejezések és függvények kezelésében. Utána továbbmegyünk a „Ellenőrzés és szerkezet" résszel.. hogy a kedvenc trükkjeid nem működnek majd. Ez a baloldali változóhoz a jobb oldal értékét rendeli. melyet a következő részben mutatok be. // 25 Ahogy a következő szövegben is látható. Ebben a részben olyan sorrendben mutatom be ezeket. & jelekkel. = = = . a fennmaradó kisebb rész esetén pedig dühöngjél. vagy hogy a függvény nem működik.elsősorban azok. értékek és operátorok keveréke.2. A Sheight általában pozitív szám. Ebbe a csapdába leggyakrabban azok esnek be le. hiszen a PHP a két nyelv legjobb részeit ötvözi az elavult trükkök és csapdák mellőzésével. operátorokról szóló részben mindenről szó esik. Lehet. az egyenlőségjel = segítségével. így a kód működni fog a szkriptedben): $age = 25 . vagy ha hibát találnak. és az if() a pozitív számokat igaznak értelmezi. . így a kifejezések különbséget tesznek a között. hogy a függvény működik és nem eredményez adatot. illetve a billentyűzet minden szokatlan karakterével. amikor ezt a jelet a két ér ték egyenlőségének vizsgálatára használják. de többségük . Az eredmény. ha az adat végéhez érnek. + = .továbbra is használhatók. amelyeket az egyszerű halandók is megértenek . 25. ahogyan egymásra épülnek. *. egy utasításban több hozzárendelési operátort is használhatsz. megjegyzésként a sor végére szúrom őket. amit az ellenőrző utasítások használata nélkül meg lehet csinálni. amelyet az el múlt kb. A új PHP4 = = = operátor. = ./ . Ennek a problémának az egyik tünete a $width szokatlan értéke: if ($width = $height). A következő. A kifejezés változók. fejezet Adatok A PHP korai változatának függvényei érdekes dolgokat tettek. akik más nyelveken nőttek fel. ! = =. A példánkban a $age változót 25-re állítjuk. Operátorok Kezdj el ismerkedni a =. így az operátorok ismerete nélkül nem mehetünk tovább. Hozzárendelési operátor: = Kezdésként rendeljük az életkoromat egy változóhoz a hozzárendelési operátor..

Áttekintés Összehasonlítási operátorok: == === /= /== A $height és a Swidth változókat helyesen így kell összehasonlítani. Ezek az operátorok mind lebegőpontos számot adnak eredményül. amely összehasonlítja az értéket. de a PHP-ban nem.1 táblázat az összehasonlító operátorok rövid összefoglalását tartalmazza. A 2. Ha egy függvény eredménye rekordszám.kivonáshoz. de szerencsétlen programozó napokig próbálja megfejteni. ahol az SQL select utasítás működik és zéró rekordot választ ki. falsé if row count A = = = fordítottja a ! = = . A leggyakoribb példák erre az adatbázisfüggvények. 2. de hamis eredményt ad. A + összeadáshoz. . nem csak a fenti példában. amikor nincs is hiba. Az én esetemben a $width nem egyenlő' a $height-tel: if(Swidth — $height). a == fordítottja pedig a ! = . A ! használatáról a következő részben további példákat találsz.1 táblázat Összehasonlító operátorok Operátor Jelen != === !== < > <= >= Egyenlő ertek Nem egyenlő érték Egyenlő érték és egyező típus Nem egyenlő érték vagy nem egyező típus Kisebb Nagyobb Kisebb vagy egyenlő Nagyobb vagy egyenlő 8 ==8 8 !=4 0===0 0 !== falsé 4<8 7 >6 4 <=4 7>=6 Hamis 8 ==4 8 !=8 0 === falsé 0!==0 8<4 7>8 8<=4 7>=8 Néhány nyelvben a => ugyanúgy működik. és megkülönbözteti a hamist a zérótól. Helyettesítsd a = = jelet = = = jellel. mint a > = . a / pedig osztáshoz használható. és lebegőpontossá konvertálják az egészeket. és a PHP automatikus adattípus-konvertálása miatt hibához vezethetnek. ha az input lebegőpontos. if($rows zero --falsé) // true if MySQL error. és a függvény hibát jelez. miért van hiba az SQLutasításban. ha az eredmény nem egész. A mysql_num_rows()-függvény a sorokat számolja meg. Nincs sem > = =. a % pedig az osztás maradékát adja. ha a $result változónak rossz az értéke vagy rossz változó: Jrows = mysql_num_rows($result) . // falsé Az összehasonlítási operátorok == két értéket hasonlítanak össze. de a !-t máshol is használhatod. és a hiba jelzésekor hamis eredményt ad. a = = kód használatával a zéró rekordszám hamissá konvertálódik. pedig csupán az if()-utasítás értelmezi a zérót hamisnak. a * szorzáshoz. a . Aritmetikai operátoroké -* / % Tudnak a PHP-operátorok összeadni? Hogyne tudnának. sem < = = operátor.

fejezet Adatok A matematikai műveleteket az operációs rendszer végzi. egy szóköz és egy "source" sztring összefűzésével. Ha nagyobb szöveget. A következő kétsoros kód első sora a $x változónak az "open source" értéket adja az "open" sztring. Annak érdekében.) használatával fűzhetsz össze. a print()-tel jelenítsd meg a $x-et egy oldalon. például e-mail szövegét akarod sortörésekkel együtt beszúrni. éppúgy. \n. végül megjelenítjük a $c-t. az összes $-t cseréld Vra (a $x-en belül ezek $-ként lesznek eltárolva). így ezen műveletek pontossága a hardvertől és attól függ. hogy kapjanak. Akik a kód eredményét igazolni akarják. .2. Az operátort akkor is használhatod. majd értékeljük a kódot. ha a GMP telepítve van. mint a kétszeres idézőjelben levő sztnngben. a szöveg pedig a $ karakteren kívül bármilyen karaktert tartalmazhat (a $ jelet itt. megjelenítjük. a < < < operátort kell a következő példa szerint használnod. Dokumentumbejegyzés: <« Nem ismerem a < < < hivatalos PHP-beli nevét. majd jelenítsd meg a kód által beállított változókat. Töltsd be a kódot a $x-be pontosan úgy. a ceil() pedig felfelé kerekítve ad egészt eredményül. $x . = " software". és le is futtatod. A kód minden sora egy láthatatlan újsorkarakterreí végződik. A beolvasandó szöveg határolására a < < <anytest és az anytext szolgál. hogy lásd az eredményt.= Két sztringet a pont (. A következő részekben leírt GMP (egy nyílt forráskódú matematikai csomag) matematikai függvényekkel korlátlan pontosságú egész-matematikai műveletek végezhetőek. így a $x végső értéke az "open source software": $x = "open" . ha egy kódot úgy akarsz ellenőrizni. a pont és az egyenlőségjel kombinálásával pedig egy sztring végéhez csatolhatsz egy másikat: . amelyet a HTML figyelmen kívül hagy. ahogy a példában az e-mailt töltöttük. Gates I I I anytext. = . Az anytext. hiszen a <br> sortörést hajt végre a HTML-oldalon: 32 . hogy az operációs rendszered hogyan kezeli a hardver eredményeit. B. A következő egyszerű példában $c-nek értéket adunk. hogy egy oldalon megjeleníted a kódot. a $c-re a végén 4-et kell. hajtasd végre a kódot az eval()-lel. amely ehhez a számítógéped hardver részét használja. Ha egy lebegőpontos számból egész számot szeretnél. The PHP Black Book is proving truly magnificent and worth every cent. A példában a $x változó az első és utolsó sor közötti szöveggel töltődik fel. A második sor azután a "software"-t ennek a végére teszi. egy \ jellel kell kiemelni): $x = <<<anytext Dear Coriolis Editors. így a \n <br>\n-re cserélésére használd a str_replace()-t. " " . hogy a $x biztosan megjelenjen egy HTML-oldalon. Sztringoperátorok:. Mivel a kód S karaktereket tartalmaz. It lives permanently next to my copy of Coriolis's Linux Core Kernel Commentary. a floorQ a lebegőpontos szám egész részét adja. "source". pedig magát az operátort állandóan használom.-nek új sorban kell kezdődnie. a print()-en belül tedd a $x-et htmlspecialchars()-be.

és azt írod be. ha elrejted. Ellenőrizd az egyes függvények leírásában. és ha a hibákat te magad veszed észre. mysql_error() ) . ellenőrizd az eredményt.operátor csökkenti a változót. \$b = 2.A + + és -. amely kereskedelmi weboldalakon hasznos lehet. majd megjelenítheted a még bent lévő papírok számát. $c). míg a $b~ az aktuális értéket adja vissza. hacsak nem a mágikus = = = összehasonlító operátort használod az ellenőrző kódban. A $sql-t a mysql_query() MySQL-függvénybe helyezve egy lekérdezés beszúrásának az eredményét ellenőrzi." fordított sorrendben működik. és üzenettel jelzi.". Ezeket az üzeneteket jobb. Hibaellenőrző: @ A (§. hasonlóan a C nyelv egyenlőségjeléhez. "<br>Error ". number: ".) Ha egy függvénynek nincsen olyan egyedi hibajelentési mechanizmusa. codedelimiter. print{"<br>c: " . A következő példát egyenesen egy MySQL-alapú oldalról vettem. $x)■ print(htmlspecialchars($x)). mert azok a hamist és a nullát egyaránt jelentő zérót adhatják eredményül. a $b 7-ként megjelenik. error text: " . Ha a $b a nyomtatóban lévő papírok számát tartalmazza. Ha a $b-t egy számlázó programban az aktuális számla sorszámaként használod. Ha a $b-t 7-re állítod. majd csökkenti a változó értékét. hasznos. fejezetben foglalkozom. és utána jelenik meg. tegyél a függvény neve elé @ jelet. hiszen az alapértelmezett hibaüzenetek a felhasználók számára rejtélyesek és általában haszontalanok. hogy miket adhatnak eredményül: if(J$query_resulc = @mysql_query($sql)) { print("Error in query:" . Növelő/csökkentő operátorok: ++ . majd a MySQL-hibamezők használatával fejtsd meg a hibákat. Ha MySQL-függvényeket használsz. mint a MySQL-nek. így a —$b csökkenti a $b-t. operátor elrejti a függvények és különböző kifejezések hibáit. (A MySQL-lel az 5. mysql_errno{) 33 . $x = str_replace("\n". tartalmas hibaüzeneteket hozhatsz létre helyettük. Néhány függvény bonyolultabb ellenőrzést igényel. A -. akkor minden oldal nyomtatása után az — $b használatával csökkentheted. a $b 7-ről 8-ra nő. amelyet a PHP hamisnak is értelmezhet.operátorok változó előtti vagy utáni használatával növelni vagy csökkenteni lehet azt. eval($x).Áttekintés $x = <<<codedelimiter \$a = 2. \$c = \$a + \$b. a ++$b használatával kapod a következő sorszámot. és utána a csökkentett értéket adja vissza. hogy "print(+ +$b). a PHP $php_errormsg-ben keresheted meg a hiba PHP-s változatát. $sql . utána majd 8-ra nő. ha hamis az eredmény. "\n<br>". A "print($b+ +).

Hogyan alakíthatod a PHP -ban a biteket? Persze. hogy a bináris operátorokkal! Az első példa az 1 és 2 számokat használja. A következő jobbra tolás eredménye 1. és utána már végig nulla. és a balra tolás < <. így 1&2 eredménye 0 és "1"&"2" eredménye 0. végül negatív számot kapsz. Ha a biteket a logikai ÉS (AND) művelettel vonod össze. ami nem más. hogy a levágott bitek a bináris mező másik végére kerülnek. A logikai VAGY (OR) művelet.. a $b -ben a bitek ott 1 értékűek.) eredménye pedig 16. A bináris operátorok is használhatók a $a = $b > > 1. akár szóköz. 34 . mert az 1 bitet az előieljelző pozícióba juttattad. mindenhol máshol 0. A 01 (azaz az 1) és a 10 (azaz a 2) AND művelettel a 00 eredményt ad ják. mint a $a = 126 > > 1. és egyáltalán. A 01 (azaz az 1) és a 10 (azaz a 2) OR művelettel a 11 eredményt adják. a jobbra tolás >>. akár egy kis doboz. és a 10 előtti sok 0 mind les lesz. a következőé 0. akkor a $b 2 lesz. így a -—2-ből -3 lesz. Ha a $b-t 4-re állítom. formában és számokkal is. Az egész alak és a karakteralak bináris megjelenítése is a bináris 01 gyel végződik az 1 esetében és bináris 10-zel a 2 esetében. Hoppá.. $b = 4. Mindkettő eltávolítja a végéről a biteket. ha a 2-ben a megfelelő bitek 0-k és fordítva. mint egy meg nem jeleníthető karakter. így a $b tartalma 00000011. a számítógépedben minden különböző hosszúságú bináris sztringként van tárolva. ahol az 1 vagy 2 megfelelői bitjei közül az egyik és csakis az egyik 1. az 1 karakter pedig 00110001. A 10 (azaz a 2) invertált alakja 01. azaz 1 | 2 eredménye 3 és "1" | "2" eredménye 3. ahol a megfelelő bitek az l-esben és a 2-esben is 1 értékűek. Ha elég sokáig balra tolod a biteket. az egészek bináris sztringként vannak tárolva. tehát $b = 1 & 2. A logikai NO a $b = ~ 2.. aho l az 1 vagy a 2 megfelelő bitjei közül legalább az egyik l-es. eredménye ott 1. és utána a biteket egy helyi értékkel jobbra tolom. fejezet Adatok Bináris operátorok: & | A ~«» Feltételezem.. azaz l-re állítja a $b-ben. az összes bitet invertálja. mi történt a "1" ~ "2"-vel? Az 1 karakter alakja 00110001. és nullát tesz a másik vé gére. $b >>= 1. azzal tisztában vagy. Néhányan azt mondják. amely a böngészőben bár mi lehet. Napjaink 32 bites PC-in az 1 nem más. Izgalmas idáig? Már csak két bináris operátor van hátra..) eredménye 8.-val kezdve. az /. ez nem igaz. eredménye a $b-ben ott 1. de azokon a rendszereken. amit én használok. A 01 (azaz az 1) és a 10 (azaz a 2) XOR-művelettel a 11 eredményt adják. Mindkettő egy és az aktuális mezőhossz között az általad meghatározott helyi érték kel teszi odébb a biteket. azaz 1 ~ 2 eredménye 3 és "1" ~ "2" eredménye "D' (a meg nem jeleníthető karaktert jelző karakter).. Ismét a $b = 4. mint 31 db 0 után egy l-es. egyrészt egész számként másrészt egyszerű tá rolt karakterekként. hogy a karakterek bináris sztringként vannak tárolva. a többi esetben 0 értékűek. két helyi értékű tolás ($b <<= 2. egy helyi értékű balra tolás ($b <<= 1. ami az ékezetes nagy i. A logikai XOR (kizáró) vagy $b = 1 "" 2. ami a megjelenítési hibát jelzi. a 2-é pedig 00110010. példánkban a $b = 1 | 2. egyébként 0. Ezután nullát kapsz. mert az utolsó l-es bit is kikerült a mezőből. A ~"2" eredménye 11001101.2.

de a PHP-ban nem. Ugyanez vonatkozik a hivatkozások feloldására is: ha feloldod $f-et. mint ha a külső 35 . használatával $f ugyanarra a mezőre mutat. Az 5-öt tartalmazó egészmező változatlan marad. amely az 5. mint a system()-függvényt. egészmezőben tárolt értékre mutat. Csak annyi történt. Ha a $x-et 5-re állítod. Hivatkozások: &=& A hivatkozások a változók neveinek aliasai. ami az outputot számodra teljesen megfelelően adja vissza. a $b mezőhöz hozta létre. a $f-et új mezőre irányítva a $x nem fog arra az új mezőre mutatni. A $x továbbra is ugyanarra a mezőre mutat. Ha a $f-hez 3-at hozzáadsz. expecting 'T_NEW' or 'T_STRING' Vannak nyelvek. hogy a PHP szimbólumtáblá zatában egy újabb név mutat ugyanarra az egészmezőre. ha a példában bemutatott egyszerű fájlnévlistát az egyik PHP-fájlfüggvény használatával kapnád meg. a $x egy olyan név. és a PHP lehetővé teszi. eltávolítod $f-et. A példa a Unix/Linusos Is parancsot használja a fájlnevek és helyük későbbi megjelenítés vagy esetleg elemzés céljából történő $list-be való listázására. csak a Sf-et változtatod. és a $f =& $b. és a $x használatakor a $x is 8-at ad eredményül. Ha van egy Sb-nek nevezett mező. a visszaposztróf az egyetlen. mint a Sb. Nem használhatsz hivatkozást egy másik hivatkozás megváltoztatására. és amikor a $a =& $b . illetve együtteséhez is rendelhetsz hivat kozást. Mikor kipróbáltam a $b =& $a[15]. a PHP szintaktikai hibát jelzett. A $f =& $x. az operációs rendszernek küld végrehajtásra. hogy más nevek kel is ugyanerre az egészmezőre mutassunk. Bármit is küld vissza az operációs rendszer. de a $x-et és az 5-öt tartalmazó mezőt érintetlenül hagyod. de a PHP nem tudja. hogy olyan paranccsal találkozol. A második sor nem más. unset($f).és az exec()-függvényekhez. A PHP viszont úgy kezeli.-vel beállíthatod. az egészmező 8-ra változik. Jóllehet a visszaposztróf hasonlatos a system(). Parse error: parse error. amelynek nincsen a PHP -ban pontos vagy egyszerűen használható megfelelője: $1i S t = ' 1S ' . és mindent. amelyeket rendes hozzárendelő paranccsal hoztunk létre: $a =& 5.. a \ A visszaposztróf fontos akar lenni. de a PHP-t leszámítva mindenki összekeveri szegényt az idézőjellel. az egy sztringbe kerül.Áttekintés Végrehajtás-operátor: A billentyűzet bal felső sarkában magányosan álldogál a ritkán használt visszaposztróf. A PHP csak olyan mezőkhöz tud hivatkozást adni. az &-et adva a paraméterrel hivatkozhatsz egy. így az eddigi pél dánknál maradva. A függvényekben a paraméternevekhez az egyszerű and karaktert. amit feldolgozhatsz vagy megjelenít hetsz. Jobban járnál. Ez sokkal jobb. a függvényen kívüli mezőre. azt a PHP csak az első.. hogy a $f ugyanerre az egészmezőre mutasson. amelyekben a mezők részeihez. de előfordulhat. ami visszaposztrófok között van. A következő példa első sora nem működik. A kód megpróbál hivatkozást adni egy értéknek. és a $x ugyanúgy erre az egészmezőre mutat. $c. ha mégis kipróbálod a kódot. hogyan tegye ezt.-vel kipróbáltam az együttes hivatkozást. mint a hibaüzenet ele je.

Azonban a második print utasítás a 11-et. mint amire a $x mutat: $x = 11 function plus_one(&$value) return(+ + $value) . akkor tetszőleges feldolgozással választhatod ki az eredményül adódó hivatkozást. Ha már egyszer vannak bemenő hivatkozásaid. fejezetben tárgyalom. print($x). majd megjeleníti a változót. Egyéb hivatkozások a függvényekben a global utasítással. hogy eredményül hivatkozásokat adjon. így a find_variable() külső mezőket igényel. és az első print utasítás a 12-t jeleníti meg. Hogy tesztmezőt hozzunk létre. a mező eltűnne. hanem objektumokra is vonatkozhatnak. így már a második printutasítás is a 12-t jeleníti meg a 11 helyett. A —&C használatával a függvények eredményeként kapott hivatkozásokra is létrehozhatsz aliasokat. változatlan $x-et jeleníti meg. print(plus_one($x)). Ezeket a külső mezőket vagy a paraméternevek elé írt &-el vagy a global utasítással biztosíthatod. amely érték helyett hivatkozást ad eredményül. A =&-el a $a-t a find_variable() eredményére hivatkoztatjuk. a $b ugyanarra a megnövelt mezőre mutat és az utolsó sor a "a: 6. A függvényeket a 10. a függvény 12-t eredményez. Ha az előző kód $a = &plus_one($x). Ha a find_variable() egy belső mezőre vonatkozó hivatkozást eredményezne. és a függvényt úgy definiáltad.2. majd beadjuk a find_variable() függvénybe. Mivel a példa elején a $x 11-re van beállítva. hiszen a függvény definiálásakor & karakter van a függvény neve előtt. hiszen a $x által mutatott mező másolata helyett az &$value most már ugyanarra a mezőre való hivatkozás. A hivatkozások nem csak változókra. az objektumokat a 17. a $a egy a függvény eredményeként kapott értékre vonatkozó alias. az St-et a $value elé. print($x). Most szúrj csak egyetlen karaktert a példába. print(plus_one($x)). Ha ezután $a-t megváltoztatjuk (a példában eggyel növeljük). mint a $b. és mivel az eredmény a $b-re vonatkozó hivatkozás. Ebben a rövid példában a find_variable() egyszerűen az inputot adja vissza. $x = 11 function plus_one($value) return(++$value). b:6"-ot jeleníti meg: function &find_variable(&$parameter) return($parameter).. lenne. a $a most ugyanarra a mezőre hivatkozik. az objektummódban pedig $thisszel hozhatók létre. amely eredményül egy a $b-re vonatkozó hivatkozást ad. 36 . a $b-t 5-re állítjuk. az eredeti. amikor a függvény véget ér. A következő példában a plus_one() függvény fogad egy változót. A következő példa a find_variable()-függvényt mutatja be. fejezet Adatok mezőt bemásolnád. hozzáad egyet. ezáltal a $x változóra vonatkozó hivatkozás lenne.

Az include(). Van pár csapda. mint a C-beli megfelelője. amely hasonló a más nyelvek select utasításához. $a . $b) .és for()-parancsaihoz. és mind a kettő ugyanúgy működik. így megmutatom az if(). majd egy alternatív szintaktika is szóba kerül. megváltoztathatod a műveletek végrehajtási sorrendjét: new ! —h -\— (int) (double) (string) (array) (object) / /o • • • < <= > > = == i= = = = ! = = & I • ) : • =+= • • • • print AND XOR OR .= ~= <<= >> = Ellenőrzés és szerkezet Ebben a részben azokról az utasításokról lesz szó. else és elseif() döntési utasításokat.= %= & = i = . . hasonlóan a más nyelvek while(). Az ugyanolyan prioritású operátorok jobbról balra haladva hajtódnak végre. nagyszerűen ki lehet váltani az if()-utasítások hosszú sorát. b: " bcilins . Műveleti sorrend A következő lista az operátorokat a műveletek prioritása alapján állítja sorba. $a -Se f ind_variable ( $b) .Áttekintés $b = 5.= *= /= . print("a: " . A switch()-utasítással. a legmagasabb prioritásúval kezdve. A whileQ-és for()utasításokkal adott feltételek mellett működő ciklusokat építhetsz a kódba. Zárójelekkel (). $a + +. ". amelyekkel ellenőrizheted a szkripted végrehajtódását.és requireQ-utasításokkal más fájlokból származó kódokat ágyazhatsz a szkriptedbe.

mind a 0. hogy if($a == falsé). Az if több feltételt is vizsgálhat. ha a feltételeket az and-del kapcsolod össze. mielőtt az értéket vizsgálod. rejezei AaatoK amire figyelned kell. Az if () után használható. így könnyen csapdába kerülsz.többször ágyazódik be. A PHP a mezőket egyenesen logikai értékekké konvertálja.. Ezzel a rövid kóddal opcionális változók meglétét ellenőrizheted (például egy űrlapmezőt): if(isset($a) and $a > 0) { print ("ok") .- else Az else-utasítást nagyszerűen lehet bármilyen érték esetén használni. és a $a-t a PHP fogja az if() számára igazra vagy hamisra konvertálni. mint 0. Vannak nyelvek. Mivel ezek a változatok mind nem szándékolt eredményhez vezethetnek. azaz az if($a = = = true) és if($a = = = falsé) formákat. 38 . Mivel a PHP a karakteradatatokat automatikusan egészre konvertálja. ha a $a nincs meghatározva. ha PHP-ban használod ezeket. javaslom az értékek és típusok összehasonlításának formális használatát. A következő rövidke példa a $a értékét teszteli. minden 0-nál nagyobbat vagy 0-nál kisebbet pedig igaznak. így nem fog a hiányzó $a-ra vonatkozó hibaüzenet megjelenni. amely akkor ad eredményt. ha egy fájl . így az if($a = = = false)-t kell használnod. } A PHP a 0-t hamisnak értékeli. Az if utasításokat az if(I$a) formában is megadhatod. így az if($a != 0) helyett elegendő az if($a). hogy az adott változó létezik-e. mind a "" hamisat adna eredményül.akaratod ellenére . A következő példa az isset()-nél megáll. ha a $a hamis. és ha az nagyobb. miként azt az „Operátorok" részben megbeszéltük. és pontosan úgy működik. hogy "ok": if($a { > 0) print( " o k " ) . ellenőrizheted. Ez a rész bemutatja a if() használatának trükkjeit. ahogy a következő példa is mutatja: i f ( $ a == $b) ( print("equal"). és ismertetek néhány elkerülendő csapdát is. amely a negatív számokat hamisnak értékelik. if() Az if() PHP-beli használata hasonló annak más nyelvekbeni használatához. akkor kiírja. mint bármely másik nyelvben. Mivel a feltételek balról jobbra kerülnek kiértékelésre. a 0-t is hamisnak tekinti. ha más rendszerekből származó adatokat dolgozol fel. hiszen az a 0 hosszúságú sztring. Ha azt írod. ezért az új require_once() és include_once() utasítások segítenek azon a gyakori problémán.

break. miként az else sem kötelező az if () után. először az első case utasítás után álló kifejezéssel. else print("Turn on heater"). és egyezőség esetén a case utasítás utáni kód végrehajtása történik meg. hacsak nincsen break-utasítás. akkor ennek végrehajtása valósul meg. switch () Az elseif()-utasítás példájában a több választási lehetőséget a switch()-utasítással is meg lehet jeleníteni.ha az összes case-uta-sítás sikertelen. A default:-utasítás nem kötelező. case "warm": print{"Enjoy the weather").és else if()-parancsokhoz: if( $ a -" h ot " ) print("Turn on air-conditioner"). a switch() a következő case-re ugrik és ismét összehasonlít. "hot". amelynek hatására kiugrik a switchQ futtatásából. break. Miután a switch() befejezi a case-utasításban talált kódot. Ha nincs egyezőség. és hasonló a más nyelvekben használt elseif(). jelen esetben a $a-t. (Bizonyos . elseifQ Az elseif()-utasítással az if()-utasítás különböző feltételeire lehet ugrani. elseif($a = = "warm") print("Enjoy the weather"). A switch() használatával könnyebb a több lehetséges érték és művelet kezelése. A default:-utasítás egyenértékű az if()-fel használt else-utasítással . default: print("Turn on heater"). A switch()-utasítással változót vagy kifejezést hasonlíthatsz össze.Áttekintés else print("not equal"). íme az előző példa switch()-utasítással megvalósítva: switch($a) case "hot": print("Turn on air-conditioner"). folytatja a teljes rész lefuttatását.

A PHP-ban minden egyes értékhez külön case-utasítás szükséges. mint az if(). Előfordul. A példa második része a do whíle()-változatot mutatja. A következő példában a programozó kedveli a hőséget. default: print("Turn on heater"). hogy "hot" esetén a légkondicionáló is bekapcsoljon. amely egyszer sem fog lefutni. while($a != $b) print("This will never print"). A PHP -ban ez a do while()-utasítással érhető el. és sok nyelvben elegendő az értékek egyetlen case utasításban való megjelenítése. amely legalább egyszer lefut a $a==$b egyenlőség tesztelé se előtt. míg a második pontosan egyet: $a = $b = 5. break. A while() egyetlen PHP-beli vetélytársa a for().) Az előző példánál maradva előfordulhat. hogy azt akarod. 40 . break. hiszen a $a már egyenlő a $b-vel. hogy a "hot" case után kihagyod a break-et: switch($a) { case "hot": print{"Turn on air-conditioner"). jó hasznát veszed a while()-nak a program futásának szabályozására. de fault: print("Turn on heater"). de jómagam inkább a while()-t használom. hogy különböző értékek eseté n is ugyanaz a művelet történjék meg. case "warm": print{"Enjoy the weather") . mert az a legtöbb függvény és szerkezet esetén jobban megfelel. Az első rész egyetlen sort sem nyomtat. így a ciklussal legalább egyszer lefuttathatod a kódot. hogy amikor azt szeretnéd elérni.. így kikapcsolva hagyja a légkondicionálót: switch{$a) { case "hot": case "warm": print("Enjoy the weather"). whileQ Ha egy tömböt vagy egy fájlt. Csak annyi változtatást kell tenned. vagy egy adatbázis egy sorát olvasod be. és az idő járásnak örvendő üzenet is megjelenjen. A nyelvek a while() különböző változataival lehetővé teszik a feltételek ciklus előtti vagy utáni tesztelését. re/ezer Adatok nyelvek a break megfelelője nélkül is kiugranak a switch()-ből. így a következő példa egyenértékű megfelelője nem mindenhol használható. A következő példa egy általános while()-ciklust mutat be. amellyel jobban nyomon követhető az egyes értékek dokumentálása (akár minden sorba megjegyzés beszúrásával).

41 . akárcsak Cben. A példa létrehoz egy rövid tömböt.és each()-utasításokkal kombinálva kiválóan használható a tömbökön belüli lépkedéshez. majd a whileQ használatával keresztüllépked a tömbön. akkor áll meg: Warning.H20". $v) = each($white_crystalline_substance)) { print $v) . a tömbmutatót a tömb elejére állítja. és egy megfelelő kezdőértékű indexet hoz létre. the most abused and addictive substances are:"). the most abused and addictive substances are: C12H22O11 C8H10N4O2. hogy a következő kifejezés mire vonatkozik. a tömb végén pedig hamis értéket eredményez. $i <= 3. de ne felejtsd el a pontos vesszőt kitenni. { print( $ i ) . } Megjegyzendő. amely egytől háromig jeleníti meg a számokat: f o r ( $ i = 1. akkor a for() jobb. a $v-be helyezi: $white_crystalline_substance[] = "C12H22O11". while(list($k. a tömbelem számát az első' mezőbe. fejezetben találod. A for()-utasítás.H20 NaCl for() Bizonyos alkalmakkor. hogy nem szükséges a tömbelemek létrehozásakor indexértéket megadni. A list()-utasítás átveszi az each()-tól az adatokat. } $i++) Az első kifejezés a for()-ciklus kezdetekor fut le.Áttekintés do { print("This will print at least once"). Az each()-utasítás egyszerre egy tömbelemet. Az adott példában a while() háromszor fut át a kódon. reset($white_crystalline_substance). a Iist(). $white„crystalline_substance[] = "C8H10N4O2. három. például amikor a lista elemeit meg kell számolni vagy az elemek sorszámát kell megjeleníteni. mint a while(). print("Warning. A while()-ciklus. ahogy azt a következő példában láthatjuk. Ha a megfelelő értéket tartalmazó indexmező már létezik. íme egy gyors példa. pontosvesszővel elválasztott kifejezést tartalmaz. és amikor az each() hamis eredményt ad. és pontosan úgy értelmezi a kifejezéseket. mert a for() csak így fogja tudni. akkor az első kifejezés elhagyható. a tömbelem értékét pedig a második mezőbe. $white_crystalline_substance[] = "NaCl". a PHP az üres szögletes zárójelet látva automatikusan a következő üres indexszámot használja fel. A tömbök további részleteit a 3. minden egyes elemnél egyszer. mint a C. a $k-ba. } while($a ! = $b).

Példa lehet erre az each(). és felaprítanod a szkriptet. Ezt a kifejezést is ki lehet hagyni. { addictiveness) :") . ha a tömbből kitöröltek elemeket. egyszerűen és megbízhatóan kivághatod a PHP -kódból. " " . hogy ehhez melyik PHP include(). Ezt a kódot könnyebb megváltoztatni. $white_crystalline_substance[ $ i ] ). és tartsd készenlétben a break-utasításokat a ciklusból való korábbi kilépéshez. amiből egy break-utasítás használatával törhetsz ki. A requireQ. Ha tudod. Általában ezt a harmadik kifejezést az indexmező eggyel való növeléséhez használják. } $n . akkor a ciklus végrehajtása elmarad. hogy a legpraktikusabb. de mivel a listát egytől kezdve kell sorszámozni. A kód nem használja a tömbelemek kulcsát sem. és lehet helyette mondjuk egy print-utasítás. úgy. amelyek mind a következő sorra vagy elemre ugranak. $i++) $n = $i + 1. hogy a $n számtalan módon használható a print-utasításban. A következő példa az előző whíleQ-példát használja. print("<br>" . hogy pontosan hányszor fut le a ciklus. Amennyiben egy rész nem tartalmaz általam függő hivatkozásnak neve zett kapcsolattípusokat. eggyel növekedve. ha a ciklusban a kód egy másik része ugyanezt teszi az indexszel. akkor legfőbb ideje elővenned a láncfűrészed. Ez azonban veszélyes. require_once(). és a tömböt az elemek számával egytől növekvő sorrendben jeleníti meg. ezért elmondom az előnyeit és a lehetséges alternatíváit is. Mi az a 42 . hogy az indexmező végül elérje a második kifejezésben beállított határértéket. hiszen a kód későbbi megváltoztatása miatt lehet.és include()-utasításokról szóló részt kivághatnám a dokumentum többi részéből és külön szerkeszthetném. illetve azt. A második kifejezés kihagyásával a ciklus végtelenné válik. de ez nem szükséges. és a végrehajtása elmarad. így akkor is működik. Lehet. akkor írd be ezt az értéket a for()-utasításba. mint ez a fejezet. így a kód elején azt nem kell újraállítanod. requireQ. így a for()-utasítás az index nullára állításával ($i = 0) kezdődik. A kód nem használ tömbmutatót. a ciklus végén értékelődik ki. és az elemek számánál eggyel kisebb értékig fut. ha a megjelenítés formátumán változtatnod kell.2. például évenként felhasznált kilogramm. A harmadik kifejezés ciklusonként egyszer. Ez azt jelenti. includeQ és include_once() Ha akkora szkriptet írsz. vagy ha a tömbelemeket az elemek kulcsától eltérően rendezték sorba. A tömbök nu llától számolnak.vagy require{)-utasítás a megfelelő. ahogy egy TOP 10-es listát számoznál: print("The most addictive substances are ( i n order of for($i = 0. A tömb nullától van számozva. amit a $i++ parancs visz véghez. fejezet Adatok A második kifejezés ciklusonként egyszer értékelődik ki a ciklusok elején. hogy a break-utasításhoz soha nem jut el a ciklus. a next() vagy a mysql_fetch_row() használata. jóllehet a példában csak a sor elejére van helyezve. hiszen e között és a többi rész között nincsenek ke reszthivatkozások. Tulajdonképpen a kulcs egy mennyiség is lehet. a kód $i + 1 diszkrét mezőként létrehozza a $n-t. viszont biztos. Ha az indexme ző már elérte a második kifejezés által meghatározott értéket. hogy ez nem a legelegánsabb megoldás. $i < count($white_crystalline_substance). Ebben a részben segítségképpen bemutatom a szóba jöhető mód szereket.

PHP3-ban ez még nem működött). majd használd a következő if(). vágd ki jelenlegi helyéről. amely a vásárlókat a szerszámgépek szabadidős használatáról kérdezi. de kevésbé rugalmas. de még a szkript végrehajtása előtt beágyazza a fájlt. és tedd az include()-utasítást egy if()-utasításba.html és c. Kezdhetsz vagdosni. Az állandóan beágyazott fájlokhoz ezért a require() jobban használható.és require_once()-utasítások segítenek ezen a problémán.html-be. Az include_once(). Állítsd a Sask-ot igazra.html kétszeresen lesz beágyazva. akkor független kódrészt találtál.html"). az adatbázis-hozzáférési függvények pedig. az oldalad kezdődjön így: require("powertoolpagefunctions. vajon hol használhatnád fel újra a függvényeket. Ezt az öt függvényt a powertoolpagefunctions. és rögtön a PHP-feldolgozás kezdetén. Mivel bármely függvényt bárhova beágyazhatsz. Vajon a szkripted még mindig működik? Amennyiben igen. hiszen a szknptbe bárhová beágyazhatóak (PHP4ben. ha szükség van a kérdőívre. Ha a honlapodon mezőgazdasági gépeket értékesítesz. amely eldönti. így a require() -t nem lehet az if () vagy a hozzá hasonló logikai ellenőrző utasításokkal kontrollálni.html oldal tartalmazza a b.Áttekintés függő hivatkozás. és illeszd be bárhová máshová. Utána használj egy include()-utasítást a fő dokumentumban. ahol terméklista jelenik meg. később beágyazandó állományba tedd.html-be. a c. hogy az a.html-be teheted. menjenek a productdbfunctions. hogy ilyen állományba tegyük Őket. html oldalakat. amelyeket csak a powertoolpage. A beágyazott fájlok tartalmazhatnak include(). require("productdbfunctions.html-nek nevezed. és az a leghasznosabb.és include()utasításokat a kérdőív beágyazására: if(5ask) { include("questionnaire. hogy a szerszámgépes oldalaid egy részének van egy visszacsatoló oldala. de addig nem ágyazza be a fájlt.html"). és a b. és a szkripted szerszámgépeket jele nít meg. emiatt a require() gyorsabb. elgondolkodhatsz azon.html"). Tegyük fel.html-t. amelyeket csak olyan oldalakon használsz. amely alkalmas arra. és a szkripted a kód duplikáció miatt nem működik. hogy különálló. mint a csupán alkalmanként használt fájlokhoz.html"). hogy a szerszámgépes oldaladat powertoolpage. így lehetséges. I Az include()-utasítás veszi ugyanazt a fájlnevet. tedd ezt egy különálló beágyazott fájlba. amíg a program végrehajtása el nem éri az include()-utasítást. A require()-utasítás veszi a fájl nevét. Ha egy adott kódszakaszt csak néhány oldalon használsz. és hogyan tesztelheted a függőségek meglétét? Válaszd ki a kód bármely részét. ha rögtön az elején beágyazod őket.html tartalmazza a c. A más oldalakon is használt formázó függvények mehetnek a formattingfunctions.és require()-utasításokat. A függvények és objektumok kiválóan alkalmasak arra.html-be. és van öt olyan függvényed. require("formattingfunctions.html-ben használsz. Tegyük fel. hiszen a fájl beágyazása előtt ellenőrzik. Ha ez megtörténik. hogy az adott fájl nincs -e 43 . hogy a külön kódrészre szükség van-e. a kérdőívet mentsd el a questionnaire. a szintaktikai ellenőrzés alatt.

Azt. Csak tedd a htmlspecialchars(). Az addcslashesQ-utasítás C-szerű konverziót végez a nem megjeleníthető karakterek nyolcas alapú megjelenítésére konvertálásával. v. Az addcslashes()~t még soha semmire nem kellett használnom.html-t. ha az adatot visszakeresed.html beágyazódni. A htmlspecialchars()-utasítás a <. az is_object()-függvénnyel ellenőrizheted. amelynek van HTML-beli í : 44 . ahol sztringeket és számokat használsz (például egy tömb elemeiben). hogy a HTML használatáról írsz segédletet. Ugyanúgy kezelhetőek. míg a htmlentities() minden olyan karaktert. fejezetben magyarázom.-ra és a >-t &gt. >. és azt akarod.htmr) még beágyazhatja a c. A stripslashes(). require_once(). a . I Kategóriák és objektumok Az objektumokat részletesen a 17. amely a <-t &lt.html-be nem fog a c. hogy szükséged lesz rájuk. Az addslashesQ-utasítás pontosan ezt teszi. nem pedig sortörésként. bármely karakter lecserélhető. és előfordulhat. Az addcslashesQ-utasítás további ellenőrzési lehetőséget biztosít.és stripcslashes()-utasítások ennek pontosan az ellenkezőjét csinálják. mielőtt az adatbázisban elmentené. hogy a <br> karaktérként jelenjen meg. ahogy az eló'ző részben leírt függvények. hiszen az adatokhoz nincsen különösebben szükség a függvényekre. A stripslashes() használata előtt ellenőrizd az adatbázisodat. hogy ez így működjön. Ezután. az összes c. Az objektum az adatok egy olyan típusa. hogy melyik karakterek változnak. amely gyakran használható ott. Példánkban a b.html-re vonatkozó include()-utasítást include_once{)-ra kell cserélni.htlm már tartalmazza a c.-ra konvertálja.require(). Ha a MySQL-nek címzett adatokhoz per jelet teszel. és & karaktereket vál toztatja meg.html-t. fejezetben magyarázom el. hogy egy adatelem objektum-e. Függvények A függvényeket teljes részletességgel a 10. a MySQL visszakonvertálja a helyes formátumba az adatokat. ^K ™ Adatok a HTML-nek Képzeld el. így ha az SQL-lel sztringet akarsz elfogadtatni. így nincsen a stripslashes()-re szükséged.. ha az a. amely meghatározza.2. és az SQL idézőjelekkel határolja a sztringeket. Ahhoz. A MySQL-hez addslashes()-re van szükség.vagy htmlentities()-függvényeket a <br>-t tartalmazó sztring köré. Ezen fejezet „Hivatkozások: & =&" című részében szó esett a függvényeknek a hivatkozásokhoz való használatáról. hiszen az adatokhoz nincsen különösebben szükség a objektumokra. mert egy kósza include("c. így egy karakterlistával. a sztringen belüli idézőjelet valami mással kell helyettesítened. "". includeQ és include_once()" részben pedig a gyakran használt függvények különálló fájlba ágyazásának egyszerű módjairól volt szó. i S ' * Adatok az adatbázisoknak A legtöbb relációs adatbázisban az SQL használatával viszel adatokat az adatbázisba. fejezet Adatok már beágyazva. a MySQL a megfelelő formátumban jeleníti meg azt.

és időfüggvényt tartalmaz. A részletes példákat a „Gyors megoldások" részben találod. így 10 órával a GMT előtt van. hogy az este 7. Dátum és idő A PHP több dátum. Idő Ismered a reggel 8. Mindkét függvényben lehetőség van egy második paraméter megadására. illetve hogyan állíthatod be a pontos időt. a greenwichi idő (GMT) volt a nemzetközi időszámítás alapja. és csak ezután a kívánt naptárformátumba. hagyj üzenetet a honlapomon petermoulding. a Julianus-napszámlálót pedig a jdtounixQ váltja Unix-időre.00. hogy a webszerver miért jelezhet mókás időt. Két olyan Julianus-dátum van.e. május 2-a Julianus-dátumban 2001122. Ausztrália az egész világ előtt jár.00 és az este 7. amellyel meghatározhatjuk miként kezeljék az idézőjeleket. Ha az időről vagy a londoni és greenwichi városnézésről szeretnél hasznos linkeket.com!) A Windows alapú számítógépeken megjelenő idő a GMT-hez viszonyított helyi idő. az eredeti naptárból a Julianus-napszámlálóba váltja át. mint a legújabb csúcstechnológiájú karóra.Áttekintés megfelelője. az idő megjelenítését és történelmét bemutató pazar kiállítással. getdate(). tudod azt is. Amikor a PHP egy dátumot az egyik naptárból a másikba vált át.és localtimeQ-függvények használatával kapod vissza. (Greenwich. 4000-rel kezdődik. Az évet és az év napját a date()-. amikor ezeket a függvényeket használtam. A/«/zím«s-napszámlálót. A unixtojd()-függvény a Unix-időt Julianus-napszámlálóba váltja át. PHP-ben a dátumok kiszámolására használod. A Julianus-dátum olyan formátum. Az alapbeállítás azonban megfelelően működött minden alkalommal. és velük hozhatod létre a Julianus-dátumot. melynek egy különlegessége van: nincsen benne hónap. Greenwichi idő (GMT) Amikor a brit haditengerészet uralta a világot. míg New York 5 órával utána. íme egy gyors magyarázat. A 2001. így a Juhanus-nap a dátumformátumtól függetlenül változatlan marad. Az IBM Julianus-dátum az év és az év napja (három számjegyben) formátumban jeleníti meg a dátumot. a Londonhoz közeli városka ideális tavaszi kirándulóhely. Tekintsd ezt egy gyors tájékoztatónak arra. Azt viszont talán nem tudod. Juíianus-dátum A Julianus-áitum különbözik a következő részben bemutatott Julianus-naptártól. amit valaha is használni fogsz. 46 .00 órát.00 24 órás üzemmódban 19. amely Kr. hogy mikor használd a függvényeket.

amely váratlan dátumot és ídőt eredményezhet. Július Caesar ezt teljesen megváltoztatta. Ha az eltérés néhány percnyi. Az szerverek össze nem hangolt UTC-dátumait és az időt a PHP time()-függvénnyel hasonlíthatod össze. Mivel a PHP dátumkonvertáló rendszere Kr. amelyek rossz időzónára vannak állítva. Gergely pápa egy Július Caesarnál is pontosabb naptárral rukkolt ki. és a másodperc töredékével egyenlő eltérés van. 46 . Naptár A Római Birodalomban a Hold járását alapul vevő naptárt használtak.e. Ahhoz. 4000-ig működik. olyan valami. az a hálózati terjedési késleltetés. amelyek a helyi időt adják eredményül. amit akkor kell beállítanod. A jdtojewish()-függvény a Julianus-napszámláiót a zsidó naptárra konvertálja. és pontosságát az egész világ több atomórájának idejét összehasonlítva ellenőrzik. Az egy órás eltérés oka az. a PHP képes a zsidó naptár kezelésére. hogy a brit haditengerészet uralja a világot és az időt. fejezet Adatok UTC Természetesen az amerikaiak nem tudták elviselni. persze előfordulhat ettől eltérő eset. Ha az adatbázisok között összehangolod a tranzakciókat. A legtöbb szervert a UTC-hez igazítják. ahol az összes szerver egy időre volt állítva annak ellenére. így kérd meg a hálózatot fenntartó embereket. és számtalan merev szabállyal tartja az évet a Nappal szinkronban. eredetileg a Holdhoz igazodott. 3761-től kezdődik. hogy az egyik gépen van nyári időszámítás. a PHP a számodra tökéletes szkript nyelv. Az általad használt operációs rendszertől és dátum/idő beállítástól függően a fájlokban használt és megjelenített dátum és idő lehet UTC vagy helyi idő. akkor az időt valakinek a karórájáról állították be. Dolgoztam már szerverek olyan hálózatával. amelyek az időzónákra és a nyári időszámítás használatára vonatkozó beállításokat is tartalmazzák. Ha egy történelemmel foglalkozó honlapot kell készítened. hogy különböző időzónákban helyezkedtek el. A PHP lehetővé teszi mind a helyi. amely a User Datagram Protocollal kommunikál (UDP.és getdate()-függvényeket. hogy a helyi időt megkapd. használd a date(). azonban vannak rossz szerverek. mind a UTC dátum és idő használatát.C-ben található obszervatóriumának atomórájához igazítsd a Network Time Protocol (NTP) segítségével. hogy a számítógépedet az USA haditengerészetének Washington D. ha a számítógéped proxy szerver mögött van). A UTC a Csendes-óceánon található nemzetközi naptárvonaltól számol. A PHP nem csak a római naptár használatát teszi lehetővé. A naptár Kr. a másikon pedig nincs.2. így az Egyesült Allamok kitalálta a Coordinated Universal Time-t (UTC). és olyan függvényeket használnak.e. Zsidó időszámítás A zsidó naptár a legrégibb a PHP által kezelt naptárak között. hogy rendesen hangolják össze a szervereket. A Coordinated Universal Time lehetó'vé teszi. és a jewishtojdQ konvertálja vissza a dátumot a Juliánusz-napszámlálóra. illetve olyanok. A munkaállomásokon általában a helyi időt állítják be a nyári és téli időszámítás figyelembevételével. de legalábbis különböző időzónában élő vásárlókat szolgáltak ki.

php címen többek között az mcal_opem()-függvényt . Az ICAP-pal csatlakozhatsz az MCAL-hoz. A jdtojulian()-függvény a Julianus-napszámlálót a Julianusnaptárra konvertálja. és négyévente szökőévvel.w3.net/manual/en/ref. ICAP-szervereken az Interneten.org/ és www. Ez a naptár 12 harminc napos hónapból állt. írd be az easter_date()-függvénybe az évet úgy. ICAP Az Internet Calendar Access Protocollal és a PHP ICAP-függvényekkel az Internet alapú naptárakhoz férhetsz hozzá és oszthatod meg őket. Az ettől eltérő évekre az easter_days()-függvény használatos. 46-ban hozta létre a Julianus-naptárt 12 hónappal. századra 11 nap késében volt.org/ helyeken sokkal többet megtudhatsz az Internet-protokollokról és a naptárakról. és a gregoriantojd() konvertálja vissza a Gergelynaptár dátumát a Juhánusz-napszámlálóra.org/. Az MCAL-függvények PHP-okumentációja a www. Gergely-naptár A Julianus-naptár a 16. október 24-én.mcal. A MCAL kód. a köztársaság megalakításának egyéves évfrodulóján kezdték alkalmazni.chek. ahogy a Gyors megoldásokban látható.php.e. www.Áttekintés Julianus-naptár Július Caesar Kr. ahogy az a Gyors megoldások „Húsvét" részében látható.25 napot korrigálja. évente 365. emlékeztetőt (ezeket triggernek nevezik) és ismétlődő eseményeket állíthatsz be. vagy másmilyen típusú szervereken.2425 napra csökkent.imc.25 nappal. hogy a századfordulós évek csak akkor szökőévek. A júliust az általa legjobban imádott emberről. A www. és számtalan reformkísérlet után 1806-ban törölték el. A jdtofrench()-függvény a Julianus-napszámlálót a köztársasági naptárra konvertálja. míg az easter_days() a Julianus-napszámlá-lóval sokkal nagyobb időintervallumot fed le. Az easter_date() a Unix időjelzést használja így a Unix időjelzés által lefedett szűkebb időintervallumra használható.000411 nap a különbség. A Francia Köztársaság naptára A Francia Köztársaság naptárát 1793. különböző naptárakhoz férhetünk hozzá. MCAL Az MCAL. eseményeket kereshetsz. A naptárakat lekérdezheted. Gergely pápa a szökőévekre vonatkozó szabályt úgy változtatta meg. a LAN-en. XIII. Húsvét Ha tudni szeretnéd. azaz a Modular Calendar Access Library egy olyan rendszer. Ennek a változásnak köszönhetően egy év átlagosan 365.com/ címen érhetők el. amelyet most mutatok be. hogy 1970 és 2037 között milyen napra esik a húsvét. és a juliantojd() konvertálja vissza a Julianus-naptár dátumát a Julianusnapszámlálóra. amellyel modulokhoz csatlakozva. így már csak 0. és a frenchtojd() konvertálja vissza a Julianus-napszámlálóra. dokumentáció és modulok a http://mcal. amelyeken van mcal plug-in modul. ha 400-zal is oszthatóak.ietf. önmagáról nevezte el. amellyel a 0. A naptárak lehetnek a gépeden. A jdtogregorian()-függvény a Julianusnapszámlálót a Gergely-naptárra konvertálja.

amellyel előjeles egész. Egész matematika ™ A PC-n a sztenderd egészek 32 bites számokra vannak korlátozva. amit a GMP nem tartalmaz. Matematika A számítógéped sztenderd matematikai függvényeinek korlátjáig könnyen használhatod a PHP egész. így ha van tapasztalatod az IMAP-pal. így lehet. ezért a mínusz 2 milliárdtól plusz 2 milliárdig terjedő intervallumra számíthatsz. fejezet Adatok is tartalmazza.) A GMP. a PHP-vel hozzáférsz a kibővített matematikai szoftverhez. a GMP Windowson még nem volt használható. 1 I A legtöbb esetben a PHP a PHP-egészeket és -számokat tartalmazó sztringeket automatikusan GMP-számokra konvertálja. Ugyanerre az eredményre juthatsz.a fájlok és hálózati átvitel igazolására használják. hogy mire ezt olvasod. Csak a GMP-t futtató gép memónája szab határt a műveletek pontosságának". ha a következő értéket használog a GMP-függvényekben: $gmp_number = "1234567890987654321". A GMP olyan alternatíva. (A CRC-t . Az MCAL külsőre és működésre is nagyban hasonlít az IMAP-hoz. és lebegőpontos matematikai függvényeit. amely a www. A CRC32-t a 8. Előjel nélküli 32 bites számot (például "int unsigne"-ként definiált CRC32 számokat vagy a MySQL kulcsmezőket) nem tárolhatsz egészként. erre a célra sztringek vagy lebegőpontos számot kell használnod. Ha nagyobb számokkal akarsz dolgozni. Hogyan használd a GMP-t? A számokat és a számokat tartalmazó sztringeket GMP-számokká konvertálhatod a gmp_init() alábbi használatával: $gmp_number = gmp_init(1234567890987654321 ). fejezetben mutatom meg. és kizárólag előjeles egészként kezeli őket a gép.swox. Próbálkozz a GMP-vel és olvasd a leírását a www. a BCMath-tal pedig mindennel. A következő példa két nagyon nagy szám összeadását mutatja. vagy GNU MP egy nyílt forráskódú matematikai csomag. amellyel a 15. így a gmp_init() csak vészhelyzet esetére szolgál. hogy „a GMP tetszőleges pontossá■ gú aritmetikai programeljárások ingyenes gyűjteménye.swox.2.com/gmp/ címen: / . hogy további információk után kell nézned. A GMP-vel a nagyobb egészekkel számolhatsz. a PHP alapesetként tartalmazza a GMP-t. amely korlátlan hosszúságú egészeket biztosít.com/gmp/ címről tölthető le. A GMP odalon erről az áll. és a megfelelő opciót kell a PHP-ban kiválasztanod. A GMP használatához le kell töltened és fordítanod a kódot. Mikor legutóbb megnéztem. és lehet.a Cyclical Redundency Checks . mellyel kapcsolatot hozhatsz létre az MCAL-szolgáltatáshoz. könnyű lesz az MCAL-t megértened. racionális és lebegőpontos számokon lehet műveleteket végrehajtani. és beillesztésével korlátlan hosszúságú egészekkel lehet dolgozni a PHP-ban. fejezetben foglalkozom.

48 .

$c = beadd( $ a .Áttekintés $gmp_number = "1234567890987654321". A következő példa a BCMath bcadd()-függvényét mutatja be. Tetszőleges pontosságú matematika A tetszőleges pontosságú matematika olyan matematika. hiszen a nagy számokat kisebb bitekre szedi szét.■■. Például a 7. és a lebegőpontos számokat csak akkor használni. Ha eredményként olyan számot kapsz. a ceil() pedig felkerekíti a számot . Ha lebegőpontos számokat hasonlítasz össze. print (gmp_add($gmp_number. A szoftver. mint a következő példa. "9999999999999999999") ) . A problémák inkább akkor jelentkeznek.9999999 soha nem lesz pontosan egyenlő 8-cal. Az eredmény az utolsó sorban jelenik meg: $a = "256.9999999-et kapsz eredményül). Azonban nem mindig volt ez így.9999999-et a round()-függvény 8. és hánytól nem. hi szen a matematikai szoftver próbálja az óriási műveletet milliónyi kis összeadás és kivonás elvégzésére bontani. ' l! . amikor konkrét összehasonlításokat végzel. A floor() a szám egész részét adja. legfeljebb bizonyos műveletek tovább tartanak. ami 14 szám jegyre épül. 4)). $b). majd összegez. hiszen például a 7. amire szükséged van.jóllehet egyik sem segít azon a problémán.5858957598759587500498240924820944". A lebegőpontos számok nem minden decimális számot képesek pontosan megjeleníteni (8 helyett esetleg 7. mint a normál matematikai függvények. Az ennél nagyobb számokhoz használd a Tetszőleges pontosságú matematikai függvényeket vagy a GMP-t. részenként számol. hogy vajon hány tizedesjegytől tekinthető egy szám pontosnak.0000000000000000000000000000000011". amely lehetővé teszi. valami hasonlót használj. használd a floor() és ceilQ PHP-függvényeket. amelyet nemrégiben adtak ki LGPL-licenc alatt. ahol te választod ki a számodra szükséges pontosságot. pri nt( $ c ) . a kiinduló adataid pedig 5 tizedjegy pontosságúak. ami az összehasonlítás mindkét oldalán először négy tizedesjegyre kere kíti a számokat: if(round($a.■■- 49 . $b = "111. 4) == round($b. jelen esetben a BCMath. valamilyen módon minden képpen megbirkózik a nagy számokkal. hogy a PHP normál disztribúciója tartalmazza a BCMath-ot. 3 6 7 . akkor az eredmény elég pontos lesz. és a bcadd()-ban a választható pontossági paraméter nélkül adódnak össze. ezért a régebbi PHP-k esetleg frissítésre szorulnak. A PHP a Phil Nelson-féle BCMath gyűjteményt használja.0-ra kerekíti. így célszerűbb az egészeket egészként megtartani. Bizonyos függvények hosszú ideig dolgoznak majd. amely nem pont az. Ha százalékokkal dolgozol és egy tizedesjegyig vagy kíváncsi a válaszra.- Lebegőpontos matematika A legtöbb számítógép az IEEE 64 bites lebegőpontos sztenderdet használja. amikor nincsen szükséged pontos decimális értékekre. A $a-ba és $bben két hosszú számot definiáltam.

print( $ c ) . Az eredmény most 34 tizedesjegy pontossággal: $c = bcadd($a. ezért a következő példában ugyanezt a két számot a bcadd{)-függvénybe a 34 tizedes]egyű pontossági paraméterrel együtt adjuk be.Z fejezet Adatok A BCMath alapértelmezett beállítása a 0 tizedesjegy.5858957 59 87 59 587 50049 82 409 2 48209 55 50 . 34}. $b. 3 67.

"The cat\nsat on\nthe mat. Az eredmény "catfish". $k. Mivel a visszaper különleges karakter. $c . hiszen a $h tartalma a "tuna". A $m-ben pont használatával fűztem őket össze. A kétszeres idézó'jeles sztringekben a \n-nel sortörést lehet generálni (az összes operációs rendszerben). A kétszeres idézőjeles sztringekben lehetőség van a sztringek változókkal való helyettesítésére.'. használatához is visszaper jel kell."..". "Backslash \\ in a double quoted string.". Egyszeres idézőjeles sztringekben egyszeres idézőjel csakis akkor lehet. ha a szöveged idézetet tartalmaz. Kétszeres idézőjeles sztringekben kétszeres idézőjel csakis akkor lehet. a \r-rel pedig visszatérési karaktert (amely különböző operációs rendszerekben különböző módon használható): $f $g $h $i = = = = "Double quote \" in a double quoted string. A $c a Holt költők társaságában híressé vált háromsoros verset tartalmazza.. hogyan lehet a különböző típusú adatokat létrehozni. használatához is visszaperjel kell. $b = 'The cat said "meow"." Szöveget tartalmazza. amelyet szeretnek a macskák: $j = "c a t" . A Sl-ben kétszeres idézőjelen belüli helyettesítéssel kapcsolódnak össze.'. ahogy a $g mutatja. ha visszaperjel előzi meg. A következő kódban a $a egyszeres idézőjelet tartalmazó. "The cat likes $h for dinner. de az egyszeres idézőjel esetén nem: $a = "The c a t ' s dinner smells fishy. mint a $d-ben. $k = " f i s h " . ha visszaperjel előzi meg. ahogy a $e mutatja: $d = 'Single quote \' in a = 'Backslash \\ in a single single quoted string. A \n karakter sortörést szúr be: ezt használhatod a kétszeres idézőjelben levő sztringeknél. '.'. "tuna". de kétszeres idézőjelben lévő sztrmget fogad be. egy hal. amit akkor használsz.'' "-:■ ' ' 51 I . így $i eredményül a "The cat likes tuna for dinner.". $e quoted string. hiszen a pont a PHP összefűzési operátora. $m = $j .. és a sztringek különböző módon való összefű-zésével hasznos adatokat kreálhatsz... i i uyors megoiaasoK Gyors megoldások Adatok létrehozása A következő példákban megmutatom. Mivel a visszaper különleges karakter. A Sb egyszeres idézőjelek között kétszeres idézőjelet tartalmazó sztringet fogad be.". Sztring-adatok Sztring típusú adatot könnyű létrehozni. $1 = " $ j $ k " .i: i* ■. Két sztringet (példánkban $j és $k) a következő módszerek bármelyikével összefűzhetsz. ami a szöveginputokkal gyakran előfordul. mint a $f-ben.

gettype($r) ) . amely az adatbázisban vagy egy session-mezőben tárolható. rejezet AűatoK Az összes egy tömbben lévő sztringet összefűzheted az implode() használatával. A következő példa azt mutatja. hozz létre egy olyan típusú új változót. q: " . A settype() hamisat ad eredményül. ". A következő példában a Sn tömb tartalmazza a mondat szavait. A serialize()-függvény adatok sokaságát fordítja egy olyan sztringbe. $q = 11. A következő példába a $p egész lesz. amelyet az 5." mondat: $n = Array("cats". amelyeket az ellenőrzés során használni fogunk: $a = "". miként azt a 16. gettype($q) . "everywhere"). $m = unserialíze($string). "double"). Az utolsó sor tartalmazza az eredményt: $P = 111. $n) . $r = (double) 111.1. Adatok ellenőrzése Az adatokat összehasonlító operátorokkal és függvényekkel ellenőrizheted. így azt javaslom. ne használd a settype()-ot.z. és a $o-ban állnak össze a szavak mondattá az implode() és egy pont használatával. ahol a (double) meghatározás felülírja a PHP alapértelmezett típust. "fur". hogyan lehet a $p-t lebegőpontosra változtatni: settype($p. Meg kell mondanom. Egész és lebegőpontos adatok Az egész és lebegőpontos számok automatikusan jönnek létre. r: " . $o = implodeC ". integer. Az unserialize()-függvény a sztringet egyedi elemekre bontja vissza. 52 . így az eredmény a "cats drop fur everywhere. Az alábbi lista azokat a tesztváltozókat tartalmazza. "drop". Ha meg akarod változtatni a típust. ahogy azt a $r-ben látod. Types: p: . A gettype()-pal az összes típust megkapod. ha print-utasítással megjeleníted. A tesztelés során összehasonlítást tehetsz előtte és utána is. megteheted. ha a konverzió nem lehetséges. gettype($p) ". míg a $q lebegőpontos. amely összefűzéssel adódik a szavakhoz. fejezetben bemutatom. print("Types: p: " . r: double A settype() használatával is megváltoztathatod a változók típusát. Ha azt akarod. q: double. fejezet adatbázisos példáinál SQL-sztringek építésére alkalmazok. hogy egy egész mindenképpen lebegőpontos legyen. hogy nem bízom a típusok közvetlen megváltozatásában. majd a sztringet a $m-tömbbe konvertálja vissza: $string = serialize($n). Az implode()-függvény szóközt szúr be az egyes szavak közé. A következő példa a $ntömböt sztringgé konvertálja.

} else { return(falsé). II II II II II II II 1 1 1 1 1 1 and Warning: Undefined variable: z Az empty()-függvénnyel gyorsan ellenőrizhető. hamisat ad eredményül: if($b if($b == $c) === $c) // // true falsé A következő példa függvényei változó attribútumokat jelenítenek meg. print(empty($b)). és ha nem. és nem működik. hogy egy változó üres-e. = 22. = falsé. míg a üres hamisat): print(empty($a)). = "30 May. Ha egy elemet tévesen használsz. az eredményeiket pedig megjegyzésként láthatod. 2 0 0 2 " . a következő függvényt használd az üresség ellenőrzésére. print(empty($z)). a PHP gyakran beszúrt meg53 I .55.ijyors megoiaasoK $c $d $e $f $g $h = 0. } } print(is_empty($a)) print(is_empty{$b)) print(is_empty($c)) print(is_empty($d)) print(is_empty($e)) 1 print(is_empty($f)) print(is_empty($z)) 1 1 A következőkben hasznosabb függvények vannak felsorolva. A függvény eredményei a függvény után jelennek meg: function is_empty($field) { ! strlen($field)) { if(!isset($field) or return(true). ahol a PHP a "0" sztringet az összehasonlítás előtt nullára konvertálja). ha a PHP az értékeket automatikusan egyik típusról a másikra váltja (mint a példa első sorában. de problémát jelent. A hagyományos összehasonlító operátor. Ha egy 0-t tartalmazó változó nem tekinthető üresnek. hogy a két adat ugyanolyan értékű-e. hogy a 0-t tartalmazó sztringet is üresnek tekinti. print(empty($e)). hogy a változók ugyanolyan típusúak-e. A második sorban az új PHP4 összehasonlító operátor az összehasonlítás előtt ellenőrzi. print(empty($c)). = "no new taxes". = null. print(empty($f)). Az egyes függvények eredményei // jellel kezdve megjegyzésként jelennek meg a függvény után (az 1 igazat jelöl. print(empty($d)). a == azt ellenőrzi.

és is_integer()-függvények az is_long()-függvény aliasai. A var_dump() több információt nyújt. array(3) { [ 0 ] = > string(4! strmg ( 4 ) "Jolt" } "Coke" [1]=> string(5) "Pepsi" [2]=> _ A var_dump() eredménye elég zavaros is lehet. Pepsi". az is_float() és az is_real() pedig az is_double() aliasai.és var_dump()függvények információt jelenítenek meg a változókról. mint amit a print__r()-nél használtunk. (is_numeric($b)). a print_r() print-ciklusba kerül. ha a tömbön belül tömbök is vannak. (is_long($c)). (is_string($g)). Az is_scalar()-függvény azt teszteli. (is_null($f)). (is_bool($e)). és hibakeresésre használhatók. sztring vagy Boolean-változó-e: print(is_scalar($a) print(is_scalar($b) print(is_scalar($c) print(is_scalar($d) print(is_scalar($e) $i 1 = array("Coke". amely ugyanarra a tömbre vonatkozó hivatkozást tartalmaz. (is_object($d)). és a következő példa HTML54 . de a következő szakaszban bemutatott intval() egészként értelmezi a 30-at. mint a print_r(). Ha megpróbálod a $GLOBAL-tömböt megjeleníteni.. A var_dump() newline-karaktert tartalmaz az eredményben. ciklusba kerülsz. (isset($b)). A print_r(). lebegőpontos. (is_numeric($h)). re/ezer naaiOK jegyzéssel segít kijavítanod a hibát. amelyben ugyanarra való hivatkozás található: var_dump($i). a PHP a tömböt az array szóval helyettesíti: prin prin t t prin prin t t prin t prin prin t t prin prin t t prin t prin prin t prin t t (gettype($a)). Eredményként a tömb elemeinek a számát és az egyes sztringek hosszúságát adja (amivel segít a sztring végén véletlenül ott felejtett szóközök által okozott bonyodalmak elkerülésében). / / / / / / / / / / / / / / / string 1 1 1 1 1 / / / / / / / / 1 / 1 / / (Because 12 there is no $z defined) Az isintQ. (isset($z)). (strlen($g)). A var_dump() ugyanúgy ciklusba kerülhet. "Jolt print(is_scalar($i) print(is_scalar($z) Warning: Undefined variable: z I Az is_numeric()-függvény a $h-ban levő 30-at nem veszi figyelembe. A következő példa ugyanazt a tömböt jeleníti meg. Ha egy sztring helyett tömböt raksz a print-utasításba. A következő példa a $i-tömbről jelenít meg információt: print_r Array ( [0] => Coke [1] => Pepsi [2] => Jolt ) Figyelem: Ha a print_r() olyan tömböt jelenít meg. ha olyan tömböt dolgoz fel. (is_double($d)). hogy a változó egész. (is_array($a)). hiszen a $GLOBAL egyik eleme a $GLOBAL.

hiszen a base_convert{) a kezdő nullákat elhagyja. 10. 2 0 02") 2 0 02") 2 30 2 0 A base_convert()-függvény a számokat az egyik számrendszerből egy másik számrendszerbe váltja a 2-estől a 32-es számrendszerig eső tartományban. 55 . A hexdec()-függvény 7FFFFFFF-nél kisebb hexadecimális számot konvertál decimálissá. de a "May 30"-ból nem: intval(22. base__ convert convert ( ( convert ( convert ( convert ( "30" "30" 1 1 3". Bizonyos esetekben van értelmük a csonkolt számoknak. "30" .és octdec()függvényekkel ugyanilyen típusú konvertálást végezhetsz oktális és decimális számok között. de a 0 a hexadecimális 30-ban 0000-t eredményez. ) milliárdnál nem nagyobb decimális számot konvertálhatsz egyszerűen binárissá. a decimális 30-at hexadecimálissá. >" . a 8-as az alkalmanként használt oktális. array ( 3) { [0]=> string(4) "Coke" string(5) "Pepsi" [2]=> string(4) "Jolt" Adatkonvertálás Az intval()-függvény egészértékeket keres. 2)) 11110 l e 11 0 16) 110000 2) ) . Figyeld meg. és levágja a tizedespont utáni értékeket. A bíndec()-függvénnyel egy 31 bitesnél nem nagyobb bináris számot konvertálhatsz egyszerűen decimálissá. a 10-es a sztenderd decimális. a 16-os pedig a hexadecimális számrendszer. .uyors megoiaasoK tag-eket használ arra. hogy az intval() a "30 May"-ből kiemeli a 30-at. A 2-es alapú számrendszer a közkedvelt bináris. hogy a böngésző a newline-karaktereket sortörésként értékelje. 10. intval("May 30. 16. A decoct(). a hexadecimális 0-t binárissá és a hexadecimális 30-at binárissá. de problémát jelenthet nek. " 0" . base_ >" . 16.45) intval("30 May. ha az egész a sztring elején van. hogy az intval() hogyan emel ki értékeket. Az eredmény még összetett adatok estén is egy könnyen olvasható lista: print("<pre>"). hogy a base_convert() hogyan váltja a decimális 30-at bináris számmá. base_ >" . print("</pre>"). 2)) A decbin()-függvénnyel egy 2 2) . hogy a hexadecimális 0 bináris eredménye egyszerű 0. 16. var_dump(\$ i) . ha az eredményt egy nagyobb számmal fűzöd össze: print("<b print("<b r r print("<b r print("<b r print("<b r >" . base_ base_ >" . Vedd észre. A következő példák azt mutatják meg. . Az eredmények a jobb oszlopban láthatók. Sztringekből is képes egészet létrehozni. A következő pél dában láthatjuk. A dechex()-függvénnyel 2 milliárdnál kisebb decimális számot konvertálhatsz hexadecimálissá. és mi az eredménye.

at/results/karl/server/node3. a PHP számtalan adatkonvertáló függvénnyel rendelkezik. $value2 .. a rad2deg() pedig radiánról fokokra.sbg.mat.ac.2 táblázat a matematikai átváltások gyors áttekintését tartalmazza. Svalue n) A tömben levő minimális értéket adja A paraméterlistában levő minimális értéket adja A tizedesjel és az ezreseket elválasztó karakter használatával megformáz egy számot number_format($float. látogass el a http://crypto. Az igazat megvallva. A 2. rejezet AaatoK A deg2rad() függvény fokról radiánra váltja az adatokat.. Sfloaty) sin($another_float) sqrt(Safloat) tan(Sanotherfloat) Sfioat = Sfloata = Sfioat = Sfioat = Sfioat = A pi értékét adja 13 tizedes pontosságban A $floatx-ot a $floaty-dik hatványra emeli A radiánban meghatározott szög szinuszát adja A Safloat négyzetgyökét adja A radiánban meghatározott szög tangensét adja Megjegyzés: Ha részletesen érdekelnek a lineáris kongruencia generátorok.html oldalra. A paraméterlistában levő maximámális Svalue n) értéket adja min(Sarray) min($value1.2 táblázat A PHP matematikai átváltásai $integer_or_f!oat = Sfioat = Sfioat = Sfioat = Sfioat = Sfioat = Sfioat = Sfioat = Sfioat = Sfioat = Svalue = Svalue = Svalue = Svalue = Sstring = abs($int_or_float) acos($another_float) asin($another_float) atan(Sanotherfloat) atan2($float_1. $decimal_places. 2..z. Sdecimal_point. $value2 .. . $float_2) cos($another_float) exp(Safloat) lcg_value() log(Safloat) Iog10($afloat) max(Sarray) Abszolút értékét adja A szög arkusz coszinuszát adja radiánban A szög arkusz szinuszát adja radiánban A szög arkusz tangensét adja radiánban A két változó arkusz tangensét adja A radiánban meghatározott szög koszinuszát adja Az e-t a Safloat hatványára emeli Kombinált lineáris kongruencia generátor A Safloat természetes logaritmusát adja A Safloat 10-es alapú logaritmusát adja A tömben levő maximális értéket adja max{$va!ue1. Sdecimalseparator) Pi() pow{$floatx.

Slength. hogy függvényeknek inputot biztosítson. Egy tömböt ad vissza. és az adatkezelésnek egy nagyon hasznos módja. " ) . (8. \t és chr(13) karaktereket. " . ahol tizedespont helyett tizedesvesszó't használnak. Sztringfüggvények A sztringfüggvényekkel dolgozni a PHP-ban szórakoztató dolog. a decimális hely jelölésére hasz nálandó karaktert (amennyiben nem tizedespontot akarsz használni). Emailekben csatolt állományokhoz használják base64 kódolás mellett. $string = $string = Sstring = bin2hex($string) chop($string) chr($integer) chunk_split($string. és a PHP a szá mokat azonnal sztringgé konvertálja. kétszeres idézőjelekhez. \n. így a sztringet SQL-ekkel be lehet szúrni adatbázisba. Az egyik cirill karakterkészletről a másikra konvertálja a karaktert. így a szóközöket. 2. A szám ASCII karakterkészletben megfelelőjét adja (az ord() ellentétje). ASmode opcionális és ellenőrzi. kettő vagy négy paramétert fogad el: a formázni kívánt számot. visszaper jelekhez és az üres karaktrekhez. $mode) $int = crc32($string) 57 . fejezet) Sstring = I Sstring = Sarray = convert_cyr_string (Sstring.3 táblázat PHP-sztringfüggvények Eredmény Függvény Sstring = $string = addcslashes{$string.3 táblázat a sztringfüggvények összefoglalását tartalmazza.Gyors megoldások \ A max(). mely a sztring egyes karaktereinek gyakoriságát tartalmazza. " . " .és min()-függvények tömböt is és két vagy több (korlátlan számú) paraméterbó'l álló listát is fogadhatnak. \r. $characters) $addslashes($string) C-stílusú visszaper jeleket ad a Scharactersben felsorolt karakterekhez. a tizedesjegyek számát. és az ezres csoporto sítást elválasztó karaktert (amennyiben nem vesszőt akarsz használni). Sfrom. Azokban az európai országokban. Minden Slength (alapértelmezésbe 72) karakterenként beszúrja a $end karaktert (alapértelmezésben \r\n) a sztringbe. A 2. $end) Visszaper jeleket ad az idézőjelekhez. 2. $to) count_chars($string. ezt írnák: Sstring = number_formát($float. A legtöbb sztringfüggvény bináris adatokat kezel. Eltávolítja a szóvégén álló szóközöket. A number_format()-függvény egy. Az input sztring bináris adatának hexadecimális megjelenítését adja vissza. hogy mi van számolva A sztring CRC32 értékét számolja ki.

amely a \n-t <br>\n-re változtatja a HTML részére. A htmlspecialchars() vagy a htmlentities() által használt fordítótáblát adja vissza. $chars) hebrevc($hebrew_text. \r. Az explode() ellentétje (lásd 3. (Az MD5-ről a www. A <. & és a nehezen megjeleníthető karaktereket HTML-elemekre konvertálja. és & karaktereket HTML-elemekre konvertálja. Hasonló a soundex()-hez. '. $array) levenshtein($string. fejezet). Az opcionális $quote-tal azt lehet meghatározni. $array = $string = get_meta_tags ($file_name) hebrev($hebrew_text. similar_text() és soundex(). Levágja a szóközöket. A két sztring közötti Levenshtein-távolságot számítja ki. Használd az implode()-ot. $key) echo($string) $array = Sstring = explode($separator. A tömb elemeket egyesítve sztringet hoz létre. hogyan hangzik a szó. '. hogyan kezelje az idézőjeleket. Az implodeO aliasa. Az „úgy hangzik.3 táblázat PHP-sztringfüggvények (folytatás) $string = crypt($string. ". >. A megnevezett fájl méta tag tartalmát adja tömbben vissza. $quote) Egy opcionális kulcs használatával DES eljárással rejtjelez egy sztringet. ami egy jelzés arra.2.) Egy sztring metaphone-értéket számolja ki. >. A hebrev{) egy változata. Schars) htmlentities($string) htmlspecialchars($string) implode($separator. A sztring MD5-típusú digitális kivonatát adja vissza. hasonló a print()-hez. mint" típusú kereséseknél használható. Sstring) get_html_translation_table($table. \t. Sstring) localeconv() ltrim{$string) md5() $string = $string = $string = $string = $string = $int = Sstring = Sstring = $string = $string = metaphone($string) 58 . A<. \n. Lásd még metaphone. A bementi sztringben levő héber szöveget soronként megjeleníthető szövegre konvertálja a $chars-szal. \v és \0 karaktereket a sztring elejéről. ami a egyezőség mértéke. Egy vagy több sztringet írat ki.html oldalakon találsz részleteket.org/rfcs/rfc1321 . Tömböt hoz létre a sztringböl a $separator egyes előfordulásainál szétvágva azt. fejezet).faqs. Sarray) join($separator. Egy tárhely setlocale()-!al beállított formázási információját adja vissza (lásd 12. ".

siker esetén igazat. mintha az URL lenne. ami egy jelzés arra. \t. mint" típusú kereséseknél használható. mely ahelyett. A chopQ aliasa. opcionális paraméter. hogy közvetlenül az oldalon megjelenítené a sztringet. hiba esetén hamisat ad vissza. melynek az értékei a Sformat használatával kerültek be a sztringből. \v. parse_str($string. Egy tömböt ad vissza. $string = Sstring = quoted_printable_decode(Sstring) quotemeta($string) $string = rtrim($string) Sarray = Sstring = $int = sscanf($string. Sstring) Beállítja a Sstring értékére a kategória által meghatározott lokális információt. $array) $boolean = printf($format. így a szóközöket. similar_text($string. hogyan hangzik a szó. \r. Sstring) A két sztring közötti hasonlóságot számolja ki. Ha meg van adva a második. Változóba helyezi a sztringet. visszaadja azt. Svariables) A print() egy változat. Eltávolítja a szóvégén álló szóközöket. de több feldolgozási időt igényel. Sformat) setlocale(Scategory. 59 . $integer = ord(Sstring) A karakter ASCII értékét adja vissza (a karakter karakterkészleten belüli ordinális számát adja vissza). akkor változók helyett tömbként tárolja el az értékeket. Svariables) A Sformat sztringgel formázott változókat írja ki. Sstring = Sstring = sprintf($format. A htmlspecialcharacters() jobb. Hasonló a levenshtein()-hez. ha HTML-lel használva. Az „úgy hangzik. a htmlentities() pedig akkor. soundex(Sstring) Egy sztring soundex értékét számolja ki. Hasonló a metaphone()-hoz. Egy idézőjeles megjeleníthető sztringet 8 bites sztringre konvertálva ad vissza. és \0 karaktereket.Gyors megoldások 2. A sztringben a méta karakterek \\ + * ? [ A ] ( $ és ) elé visszaper jelet rak. ha a sztring SQL-be kerül.3 táblázat PHP-sztringfüggvények (folytatás) Cél Eredmény Függvény $string = nl2br($string) A sztringben az összes newline (\n) elé HTMLsortörést (<br>) szúr be. \n. $boolean = print($string) Egy sztringet írat ki.

-1-et. $chars) $string = $string = strip_tags($string. ha $string1 < $string2. $int = strncasecmp($string1. Az strcmpO egy változata. $length) 60 . $string) strlen($string) strnatcasecmp($string1.és nagybetűket nem megkülönböztető sztring-összehasonlítás. vagy 1-et ha $string1 > $string2. mely a helyi beállításokkal módosított változatok összehasonlítását végzi. A strcasecmpO kis és nagybetűket megkülönböztető változata. $string) strcmp($string1. a kis. Astrncasecmp()kis. $string2) $int = $int = $int = $int = strcspn($string. $string2) strcoll($string1. A strstr() kis. mely a sztringeket a $length által megadott hosszúságig hasonlítja össze.2. Az addslashes()-sel hozzáadott visszaper jeleket távolítja el. a kis. fejezet Adatok 2.3 táblázat PHP-sztringfüggvények (folytatás) Eredmény Függvény $int = strcasecmp($string1. ha $string1 == $string2. Az strstr() aliasa. Természetes rendezést (lásd 3. A strcasecmpO változata. Eltávolítja a sztringből a HTML tag-eket a $tags-ben felsoroltak kivételével. tömbök rendezésénél A strnatcasecmpO kis.és nagybetűket nem megkülönböztető sztring összehasonlítást végez el. a MySQL eltávolítja a visszaper jeleket és használatra kész adatokat ad vissza. amelyben nincsenek a $chars-szal egyező karakterek.és nagybetűket megkülönböztető változata. $string2. A sztring hosszát adja vissza.és nagybetűket megkülönböztető változata. fejezet) használó. majd ezt követően MySQL-ben tárolod az adatokat. Slength) strchr($search. Ha addslashes()-t használsz. $ string2) strncmp($string1. 0-t ad vissza. $string2.és nagybetűket megkülönböztető változata. $tags) stripcslashes() stripslashesQ $string = $int = Sint = $int = stristr($search. Az addcslashes()-sel hozzáadott visszaper jeleket távolítja el. $string2) Bináris-biztos. A $string kezdő szakaszának a hosszát adja vissza. $ string2) $int = $string = strnatcmp($string1.

5 utáni verzióiban az input és output lehet tömb is. A sztring $start-tól kezdődő és a Slength hosszúságú részét adja vissza. A sztringet fordított karakter sorban adja vissza. $string2) strrchr($string. A sztringben a Sfind összes előfordulását $replace-re cseréli. $char) str_repeat($string. A$string1-el adja vissza a $string2 pozícióját. Sreplace. akkor a sztring végig adja vissza azt. $separator) Sstring = Sstring = Sstring = strtolower(Sstring) strtoupper(Sstring) str_replace($find. A Sstring első részét adja vissza. A sztringben a karaktereket $from-ról $to-ra fordítja. $pad. Kisbetűsre konvertálja a sztringet. $char) strstr($search. Ha a Slength nincs meghatározva. A $string-ből az utolsó $char utáni sztringet adja vissza Olyan sztringet ad vissza. amely csak a $char-ban levő karaktereket tartalmazza A $search-nek a $string-en belüli első előfordulásának pozícióját adja vissza. Ha az opcionális $pad sztring meg van adva. $char) strspn{$string. Az explodeQ használatával jobban jársz. Smode) A szóközökkel a Slength mértékben jobbra igazított sztringet adja vissza. $to) substr($string. $start. $from. Sstring) strtok($string. A $separator-nál elválasztja a sztringet és egyszerre egy szakaszt ad vissza. Az opcionális $mode-dal választhatsz a balra vagy középre igazítás között.Gyors megoldások 2. Schar) . amely a bemeneti sztringet Sinteger alkalommal tartalmazza. Sinteger) strrev(Sstring) strrpos{$string.0.3 táblázat PHP-sztringfüggvények (folytatás) Eredmény Függvény $string = str_pad($string. utána ciklussal végigfuthatsz az explode{) által adott tömbön. Sinput) strtr($string. A $string-ben levő Schar előfordulásának számát adja vissza. $int = $string = $stríng = $string = $int = $string = $int = Sstring = strpos($string1. A PHP 4. Slength. akkor azt használja a szóközök helyett. Slength) Sstring = Sstring = $int = substr_count($string. A $string-ben levő utolsó $char pozícióját adja vissza. Nagybetűsre konvertálja a sztringet.

0. A következő kódot használd. trim($string) Levágja a szóközöket. de ugyanazon szkripten belül ezt csak egyszer kell megtenned. \n. Sstring = I $string = ucfirst(Sstring) $string = ucwords($string) Sstring = wordwrap($string.5-öt használva a getrandmax()-ra 32767-et kaptam eredményül. Egy sztringet ad vissza. akkor az van a newline helyett. ha 1 és 99 között akarsz egy véletlen számot kapni. Az mt_rand()-függvény tökéletesebb véletlen számot biztosít. \r. Egy NT-munkaállomáson PHP 4. fejezet Adatok 2. Megegyezik a !trim(rtrim())-mel. srandQ és microtime() A rand()-függvény véletlen számot állít elő. Ha a Schar meg van határozva. bár a sebesség ritkán szempont. 62 . randQ. Az mt_rand() gyorsabb is. A legtöbb esetben adott intervallumot fogsz használni. $length) kezdődő szöveg a $length hosszúságban a $replace-re van cserélve. Minden szó első karakterét nagybetűssé változtatja. Fejezetcímek formázásánál hasznos (bár magyar nyelvben ez nem szokás).3 táblázat PHP-sztringfüggvények (folytatás) Eredmény Függvény $string = substr_replace($string.ac. Ha a Slength nincs megadva. a rand() a nullát használja. akkor alapbeállításban soronként 72 karakter. amelyben a $start-tól $replace. A rand() használatánál a szkriptedben első rand() előtt egyszer le kell futtatnod a srand()-ot. \t. Ha a használható intervallum maximumát akarod megtudni. Az mt_rand() használatakor az mt_srand()-ot ugyanazzal az inputtal egyszer kell lefuttatni: Ssrandl(double) microtime{) * 1000000). a rand() a getrandmaxQ által adott maximumot használja. Ha az első paramétert hagyod üresen. Ha üresen hagyod a második paramétert. hacsak nem oldalanként többször használod a rand()-függvény. newline-okat szúr be a sztringbe úgy. $start. így mindkét paramétert meghatározod: $integer_number = rand(1.2.jp/~matumoto/emt. a maximum értéket. A rand() és az mt_rand() is elfogad intervallum-paraméter. A sztring első karakterét nagybetűssé változtatja. ahogy ez a www. a sztring végéig cseréli. 9 9 ) .math.html oldalon le van írva. \v és \0 karaktereket a sztring elejéről és végéről. hogy a $char) szöveget a $length-nek megfelelő hosszúságú sorokra töri. Slength. Mind a rand()-hoz.keio. getrandmax()-szal vagy mt_getrandmax()-szal teheted meg. Ha a $length nincs megadva. Különösen mondatok formázásánál hasznos. mint az mt_rand()-hoz szükség van a véletlen szám generáció kezdő értékére.

a date() a Unix-időt dátum és idő formátumra alakítja. A microtime() két. a sustr() eltávolítja a kezdő nullát az idő mikrorészéről.és substrQ függvények ugyanazok. így a számoláshoz vagy a BCMath vagy a GMP függvényeit használd. $a_string)). $mstart[l]) . 1) . dateC'l F j. 0. $b_array [ 0 ] . és az eredményt oszd el 100-zal. The date and exact time is: Thursday May 3. A következő kód a $a microtime() értékének $b microtimeQ értékéből BCMath-tal elvégzett kivonását mutatja meg. 1 ) . hogy a bcsubQ részére sztring típusú inputot biztosítsunk. illetve ezen eredmények alakításával lehet elvégezni. amiket a 2. A második szám Unix-idő másodpercekben. $a_array [ 0 ] .és időfüggvények széles választéka érhető el. print("The date and exact time is:<br>" . $b_array = explode(" ".62186100 988888118. $a„string = $a_array[l] . hogy a művelet végén is elmentetted a microtimeQ értékét. date(" a " . a 100 és 200 közti intervallumot válaszd. 2001 09: 08: 38. 1 ) . az ideális szkript időzítőfüggvényt. A tömb részeit aztán összefűzzük. Az explodeQ-függvény a szóköz alapján elválasztja a két mezőt. substr(Smstart[ 0 ] . például ezt: 0. A következő kóddal tudod a microtime() eredményét használható dátum. szóközzel elválasztott számot ad eredményül. Csak azután jelenítsd meg ezt. $a_array[0] = substr($a _array [ 0 ] .00 és 2. Y h : i : s " . vagy csak azután végezz vele műveleteket. mint az előbb.00325400 Dátum és idő kiszámítása A PHP-ban a dátum. $a). $mstart[1])). $b). Vedd azt is figyelembe. $b_string = $b_array[l] . print(bcsub($b_string. $m). de ne felejts el két dolgot.4 táblázatban foglaltam össze.00 közötti számot akarsz.Gyors megoldások Ha 1. a második dateQ pedig beállítja a napszakot (am vagy pm): $mstart = explode{" ". és a végén megjelenik az eredmény: $a_array = explode(" ". az első pedig a másodperc törtrésze. $b_array[0] = substr($b_array [ 0 ] . Nézzük meg a microtime()-ot. Az idő megjelenítése időt vesz igénybe. A dátummal és idővel kapcsolatos számításokat az ezekből a függvényekből kapott eredményekkel. hogy a microtimeQ eredményeképpen kapott számok meghaladják a PHP-ban alapértelmezett egészintervallumot. Az explodeQ. ezért a művelet kezdetén mentsd a microtime() értékét egy változóba. 63 .és időformátumra konvertálni.62186100 pm A microtime()-ot egy művelet elején és végén lefuttatva lemérheted a művelet idejét.

Az eredményt. és ezt a problémát hívták a Y2K problémának. január l~je óta eltelt másodpercek száma.037K problémát. mint a gmstrftime(). bizonyos számítógépeknek olyan dátumrendszerük volt. 64 . hogy a Gergely-naptár szerinti dátum helyes-e A helyi dátumot és időt formázva adja vissza A helyi dátumot és időt tömbként adja vissza Az aktuális időt tömbként adja vissza Ugyanaz. ha 3 napot. mint az 1970. de a helyi idő helyett a GMT-t használja A dátumot Unix-időjelzésre konvertálja A GMT dátumot és időt formázza A helyi időt tömb elemeiként adja A Unix-időjelzést a másodperc törtrészével adja vissza A Unix-időjelzést adja vissza egy dátumból Ugyanaz.és idő-függvényei Függvény checkdate() date() getdate() gettimeofday() gmclateO gmmktime() gmstrftime() localtime() microtime() mktime() strftime() time() strtotime() Ellenőrzi. A strtotime()-függvénnyel is lehet számításokat végezni. így a következő egyszerű kóddal add ezt a számot a time()-függvényhez. a Unix időjelzést használó dátum/idő kalkulációhoz használhatod. hogy 20 órát akarsz a jelenlegi időhöz hozzáadni. A 20 óra 1200 perc vagy 72 000 másodperc. ez 2037-ig fog futni. amelyet hozzá lehet a time()-függvényből vagy egy adatbázisból nyert értékhez adni. (Ha elfejtetted volna.2. A kód második sorában a strtotime() 3 napot. A kód következő sora a $second változónak olyan értéket állít be. így nem nehéz megjósolni a Unix Y2. amelyet a time()-hoz hozzáadhatsz vagy kivonhatsz.4 táblázat A PHP dátum. Mi a teendő. amely nem tudta a 2000 -es évet kezelni. fejezet Adatok 2. 4 órát és 22 percet ad a "now"-hoz (a mostani időhöz). $seconds = strtotime("now +3 days 4 hours 22 minutes"}. Ezt a függvényt bármilyen. 4 órát és 22 percet akarsz hozzáadni a jelenlegi időhöz? A strtotimeQ-függvény a szöveges dátum. Tegyük fel. mint minden dátumot és időt.) A Unix időjelzéssel a másodpercek összead ásával és kivonásával végezhetsz számításokat. A Unixnál 2037 előtt hasonló változtatásokat kell majd végrehajtani. csak helyi időt használ Unix-időjeSzést ad vissza A szöveges dátumod/időt Unix-időjelzésre konvertálja A Unix időjelzés nem más. ami a strtotime()-ban a time() megfelelője: $seconds = strtotime("+3 days 4 hours 22 minutes"). mint a date(). a date()-függvénnyel alakíthatod: $new_time = time() + 72000.és időformátumokat Unix időjelzésre konvertálja.

20 02 Húsvét Ha az 1970 és 2037 közé eső évekre szeretnéd a húsvét dátumát megtudni. $seconds)). easter_date(2003) Az ettől eltérő évek esetén az easter_days() függvénnyel kapod meg a március 21. Thursday March 7. "January". $g = jdtogregorian($e + $j). miként azt következő példában látod. $j = gregoriantojd(3. melyet például a dateQ dátumformázó függvénybe illeszthetsz be. $m = $months[$m]. 2003 Y". "December"). Az ötödik sor összetevőkre bontja a Gergely-naptár dátumát. Y H:i:s". így a hónapok neve illeszkedik a hónapok tömbbeli sorszámához. és húsvét közti napok számát. " " . és a következő példa szerint képes a dátumból számításokat végezni. "June". 21. és az eredményt a jdtogregorian()ba adja be. hogy megkapjuk a húsvét Gergely-naptár szerinti dátumát. a következő sor összeadja ezeket.. Az eredményül nyert dátumformátumban nehéz megkülönböztetni a 4/1/2002-t és az 1/4/2002-t. 03/04/2002) használja az adatokat. print (11<br>11 .Gyors megoldások A strtotime-függvény jelenleg az amerikai hh/nn/éééé dátumformátumban (pl. $y) = explode( " / " . "April". 1 7 0 3 ) . "September". Az easter_date() függvény az adott dátum éjféljének idejét adja eredményül. a második pedig az európai a januárra. "May".". $g). A következő példában az easter_days() kiszámolja a március 21-től húsvétig hátralévő napok számát. az easter_date()függvény a tökéletes megoldás. Ezután a megfelelő dátumfüggvény használatával kiszámíthatod a kívánt dátumot. és csak a Unix időjelzés által lefedett évekre használhatót print(date April 2 0 . amelyek közül az első az amerikai formátum az áprilisra. $d. $months = array("". 1703-at jeleníti meg: $e = easter_days( 1 7 0 3 ) . A hatodik sor egy tömböt a hónapok neveivel tölt fel úgy. "August". $d . 65 . "March". $y) . a gregoriantojd() az ugyanezen év március 21-ének Julianusnapszámát adja meg. "November". míg az utolsó sorban az eredmény látható: íseconds = strtotime{"03/04/2002 print(date("1 F j. A második sor egy a Unix időjelzést date()-tel formázó és az eredményt print-tel megjelenítő utasítást tartalmaz. $g). "July". print("<br>" . hogy az első elemet üresen hagyja. Az utolsó sor pedig a mindenhol érthető March 28. "February". Az eredményt megjelenítheted. " . A függvény a Unix időjelzést eredményezi. $m . 04:22:00 +3 days 4 hours 22 minutes"). l i s t ( $ m . ( " F d. ami 3/28/1703. A kilencedik sorban a hónap számát a hónap nevére cseréljük a $m-tömbben. "October".

fejezet Tömbök Gyors megoldások Tömbök létrehozása listából az array()-jel Tömbök létrehozása sztringből az explode()-dal Tömbök létrehozása sztringből az implode()-dal Elemi SQL select where order by group by SQL építése Az adatok tartományának kijelölése a range() segítségével Kulcstartomány kijelölése a range() és az array_flip() segítségé vel Duplikát tömbértékek megszüntetése az array_flip() segítségével Tömb véletlenszerűsítése a shuffleQ segítségével Bannerek véletlenszerűsítése az array_rand()-dal Fájl tömbbe olvasása a file() segítségével Tömb rendezése érték szerint a sort() segítségével Asszociatív tömb rendezése érték szerint az asort() segítségével Tömb érték szerinti fordított sorrendbe rendezése az rsort() segítségével Asszociatív tömb érték szerinti fordított sorrendbe rendezése az arsortQ segítségével Asszociatív tömb kulcs szerinti rendezése a ksortQ segítségével Tömb érték szerinti természetes rendezése a natsortQ segítségével Tömb nem természetes rendezése az usortQ segítségével Fordított ciklus a tömbelemeken Ciklus a többdimenziós tömbökön oldal: 78 78 79 79 80 80 80 80 80 83 84 84 85 86 88 89 90 90 91 92 92 95 99 100 .3.

Nagyon rég. de szokatlan adatbázis-szerkezetet kívánt. az IBM-nél dolgozott egy fiatal. Szintúgy. A „Többdimenziós tömbök" rész foglalkozik a többdimenziós tömbökkel. Az adatokat sorrendbe is rendezheted. Néha nagyobb teljesítményt érhetsz el. Megmutatom az egyszerű és bonyolultabb tömbök építését. Az SQL-ben rendkívül összetett műveleteket lehet elvégezni. Ha egy oldalon az adatok ismétlődnek és csak a sorrendjük változik. Ha még nem használtál SQL-t. hiszen függvények széles skálája áll rendelkezésre a tömbök rendezéséhez és feldolgozásához. sokkal egyszerűbb SQL-t használok. és gyakran dolgozhatunk többdimenziós tömbökkel. akkor az 5. a többdimenziós tömbökre gondolhatunk úgyis. hogy az eredeti fájlba belenyúlnánk. és számításokat végezhetsz a különböző függvények segítségével. úgy mintha beágyazott egydimenziós tömbök sorozatai lennének. de néhány csapdát is rejtenek magukban. nó'tlen és bolond voltam. index segítségével az adott sorrendben mentheted azokat az adatbázisba. Most.3. Az SQL működött. és a tömbfüggvényeket könnyen lehet alkalmazni az egydimenziós tömbökre. A PHP-tömbök úgy használhatók. 68 . Ez is magyarázza. fejezetben találsz példát a MySQL és a PostgreSQL használatára. és hagyom. miért kell az adatbázisból minimális SQL-lel kinyerni az adatokat és a PHP-val átalakítani azokat. és ha még többet akarsz tudni az SQL-ről. nyomtatható fájlokban. hogy már kinőttem a fiatalságból és végeztem a nőtlenséggel. akinek küldtem egy romantikus verset. hogy más a nevük és a paraméterek is más sorrendben vannak. gyönyörű. Az SQL-ben minimális mennyiségű adatot lehet és kell felhasználni. nagy rugalmasságot kínálnak. | Áttekintés A PHP-tömböket egyszerű használni. ha két adatbázis ugyanazt a függvényt használja is. akkor ott van a Groff és Weinburg: SQL: The Complete Reference (McGraw-Hill). nőnemű adatbázis-guru. amit teljesen SQL-ben írtam. Coriolos kiadta az SQL Server 2000 Black Book-ot az SQL-szervert használók számára. a listák feldolgozásának és rendezésének minden módját. mint a bevásárlólista. ha a komplex SQL helyett egy egyszerű kiválasztást és egy kis memórián belüli feldolgozást végzel. A szöveges dokumentumokban. Ha csak egy sorrend szerint kellenek az adatok. Egyszerű tömbök Kezdjük az egydimenziós tömbökkel. hogy a PHP formázza az adatokat. A világ legegyszerűbb tömbje Kezdetnek itt van egy egyszerű tömb: $a = "abc". XMLfájlokban és adatbázisokban tárolt adatok betölthetők tömbbe. de a rendelkezésre álló függvények skálája adatbázisonként változó. fejezet Tömbök r. lehet. amit vásárláskor írsz. és aztán feldolgozhatok anélkül. Ugyanúgy működnek. mikor még fiatal. hogy csökkenjen a lemez IO. független. mintha memóriában tárolt mini adatbázisok lennének. akkor lehetőség van az adatok egy tömbbe való beolvasására és újrarendezésére a PHP tömbrendező-függvényeinek használatával. Használhatod az SQL-t az adatok átalakítására. mint tömbök tömbje.

A nem létező elemekre nem pazarol helyet. így bárhol kezdődhet. $branch[42] = "Sydney". A kapott sztring ebben az esetben így néz ki: a b c A tömb elemeit úgy lehet elérni. majd be kell zárnia üzletei nagy részét. hogy beilleszted a kezdő értéket az alábbihoz hasonlóan: $b[l] = "pear". Ez az eredménye: fruit Létrehozhatsz tömböt 1-gyel kezdődően (vagy bármely más számmal kezdve) úgy. . A következő elemet úgy is létrehozhatod.ben lesz: $b[] = "apple". " " . amelyeket így lehet elérni: print($a[O] . A PHP-ban alapértelmezésben 0-tól kezdődik a számozás.Áttekintés A PHP-ban a sztring-karakterek tömbje. hogy az elem számát szögletes zárójelbe írjuk az elem ne ve után. hogy a zárójeleket üresen hagyod. Például ha egy gyorsétteremlánc a fióküzleteit 1-től kezdve számozza és sok üzletet nyit. Persze ez azt is jelenti. akkor a üzletlánc listája így nézne ki: $branch[25] = "Boston". amelyeket te hozol létre. mint az alábbi példa is mutatja: $a[] = "fruit". $a[2]}. Létrehozhatsz új tömböt v agy új elemet egy már meglévő tömbben. más körmönfontabb megoldást kell alkalmaznod. A PHP csak azokat az adatokat menti el. Ezután a tömböt így érheted el: print( $ a [ 0 ] ). Az apple-érték a $b[2]. hogy nem tudsz egy egyszerű ciklussal végiglépegetni az elemeken 0-tól a maximális elemig. amit a „Tömbmutató" fejezetben ismertetek. lásd lent. " " . A tömböket 0-tól számozzuk Más programnyelvekben a tömb elemeit 1-gyel kezdődően számozzák. de mivel te is megválaszthatod a kezdő értéket. $branch[145] = "Wahroonga". $a[l] . vagy te választhatod meg a kezdőértéket. mint például a whileQ-ciklus. $branch[98] = "London".

Ugyanezzel az SQL-lel a mysql_fetch_array() a következő tömböt hozná létre. $branch_staff["Wahroonga"] = 72. akkor asszociatív tömböt kapsz. $array["city"] = "Sydney". Ha van egy „válaszd ki az országot. $silly_array[42] = "Sydney". ?array[l] = "Sydney". $silly_array[ 9 8 ] = "London". csak a mező legutolsó előfordulása lesz egy névvel ellátott tömbadat. és ezt az új paramétert oly sok szor használták. $silly array["Wahroonga"] = 7 2 . $array["country"] = "Australia". Valójában minden PHP-tömb asszociatív tömb. $silly_array["Sydney"] = 45. A gyorsétterem példa alapján a fióküzletek személyzetének számlálása így nézhet ki: $branch_staff["Boston"] = 22. Az asszociatív tömbök annyira népszerűek és olyan könnyű velük dolgoz ni. A számozott adatok különállóak a névvel ellátott adatoktól. $branch_staff["London"] = 18. $silly_array[1 4 5] = "Wahroonga". $silly_array["London" ] = 18. sima tömbhöz jutsz. így asszociatív tömböt hozhatsz létre. így feldolgozhatóak és megváltoztathatók a névvel ellátott adatok megváltoztatása nélkül. hogy valaki hozzáadta a mysql_fetch_assoc()-ot. ami a második paraméter begépelése nélkül hoz létre neves adatokat. mint például a mysql_fetch_row(). $branch_staff["Sydney"] = 45. hogy sok PHP-függvény egyre inkább az asszociatív tömböt tekinti a tömbök általános formájának. rejezet lombok A tömb elemeit bárminek elnevezhetjük A tömb elemeit számozás helyett el is nevezheted. várost a városokból"-t tartalmazó SQL-utasításod. amely kettőzött mezőneveket eredményez. akkor az mysql_fetch_row() létrehozza azt a tömböt. és az első elem Sydney. Például a mysql_fetch_array() kapott egy opcionális második paramétert. $silly_array["Boston"] = 22. Ha a mysql_fetch_row()-ról a mysql_fetch_array()-re váltasz át. minden más előfordulása számozott adat lesz: $array[0] = "Australia". amiben minden mező számozott adatként és a mező nevével létrehozott elemként is megjelenik. $array[l] = "Sydney". Amikor egy adatbázisfüggvénnyel. akkor minden mezőben egy számozott elem jelzi a mező táblában elfoglalt helyét vagy az SQL kiválasztó utasítását. amit az alábbiak alapján te is létrehoznál: $array[0] = "Australia". Ha éppenséggel olyan SQL-t írsz.3. A kétféle tömböt vegyítheted is: $silly_array[ 2 5 ] = "Boston". hogy neves adatokat hozzon létre számozott adatok nélkül. 70 . A számozott adatok is asszociatív adatokként működnek.

más nyelvek mindig megkülönböztetik a kis. vagy dokumentáljuk a kis-/nagybetű definiálását közvetlenül a tömb definiálása mellett. Az alábbi tömb elemei mind különböző adatok. while (üst ($k. Ezek leírása megtalálható ezen fejezet „Gyors megoldások" részében. $v) . elkerülhetők úgy. hogy a rendezőfüggvény kiválasztása előtt példákon keresztül az összes rendezőfüggvényt megismered. A PHP egy érdekes keveréket alkalmaz. $branch_staff["bosTon"] = 18. Néhány nyelv megkülönbözteti a kis-/nagybetűket. $branch_staff["boston"] = 45. a PHP engedi ezt. A tömbökben az elemkulcsok megkülönböztetik a kis. . $branch_staff["Boston"] = 22. és egy könnyű módja a tömbök felfedezésének: reset ($branch__staf f) . Ha a kis-/nagybetű megkülönböztetése nem fontos és ez valószínűleg kettőződéshez vezet. Az olyan rendezési problémák. A kis. nevek tárolására. mert máshogy vannak írva.Áttekinti Tömblétrehozó függvények A array() listából hoz létre normál vagy asszociatív tömböt. hogy az összes kulcsot alakítsuk át kisbetűssé a strtolowerQ használatával. Például ha városneveket használunk és nem kerülnek megjelenítésre. de a változók nevei igen. Ne higgy nekem. akkor dokumentálnám a nagy kezdőbetű fogalmát. : key bosTon.és nagybetűket tartalmazó szavak. A tömblétrehozó függvények leírása a „Tömbök létrehozása1 és a „Gyors megoldások" részekben található. Megnézheted a tömbök kis. azt javaslom. mint például az adatok rendezési kulcsok nélküli rendezése. hogy szükség esetén kikapcsolhasd az érzékenységet. : : value: 22 value : 45 value: 1 8 Ha szükség van kis. value: " . $v) = each($branch_staff)) print("<br>key: " . $k . ha egy kis. akkor az összest kisbetűssé átalakítanám. ". majd az each() végiglépked a tömb elemein.és nagybetűt megkülönböztető nyelvből a PHP-ra váltasz.és nagybetű-érzékenységét azáltal. key boston.és nagybetű megkülönböztetése.és nagybetűket. A gyakorlat megtanít a kisés nagybetű megkülönböztetésére. a függvények nem különböztetik meg a kis. az explodeQ határolt sztringből hoz létre tömböt. visszaadva az összes elemet. A következő lesz az eredmény: key Boston. és lehetőséget ad arra. A kód a tömb elejére viszi a tömbmutatót (magyarázat a „Tömbmutató" részben). hogy az alábbi kód használatával kinyomtatod a tömböt. próbáld ki magad.és nagybetűket. a list() pedig változókba menti az elem értékét és kulcsát a print()-utasításhoz. Lehetséges problémák Én csak két problémát találtam a PHP-tömbökkel kapcsolatban: rendezés és a kis. ha megjelenítésre kerülnek.és nagybetű megkülönböztetésének problémája akkor jelentkezik.és nagybetűt.

= Akárhány dimenziót létrehozhatsz. így aszimmetrikus szerkezetű tömböt is építhetsz. amint azt a következő példa is mutatja. utcát. és az egyes dimenziók bármennyi elemet tartalmazhatnak. éttermet és baristát. és olvasd el az eszpresszógépek működtetését hitelesítő folyamat hivatalos leírását. $city["San Francisco"] = $San_Francisco. állam.000.000. Ha össze kell adnod az összes város népessé- 72 . Változtasd meg a memory_limit-et az alapértelmezett 8 MB-ról a legnagyobb tömböd méretének néhányszorosára. állam. amit az ilyen hatalmas tömbök használatához növelned kell. így a példa az utazási információkat ország. mint elérnéd a PHP korlátjait. Létrehozok egy adatot Carmel. a feldolgozás egy kicsit trükkös.scaa. A PHP konfigurációs fájlja. minden egyes éttermében a megfelelő kávéfőzőhöz akarod az embereket elvezetni. 0 0 0 Amikor hozzányúlsz a $city-tömbhöz. város szerint strukturálja. Calinforniának: $travel_comment["OSA"]["California"]["Carmel"] "Scenic town".000.000.000.000. hogy ez segítene ugyanolyan finom kávét találniuk mint. fejezet Tombok Többdimenziós tömbök A PHP-tömbök bármennyi dimenziót elfogadnak. A $travel_comment-tömböt ország. Adj hozzá körzet szerint osztályozott adatokat San Franciscóról: $San_Francisco["Castro"] = 55. Hozzáadhatsz még kerületet.ini egy beállítást tartalmaz. a kisebb városoknak csak egy adatuk van. $San_Francisco["Chinatown "] = 50. (Ha nem tudod. hogy előbb futsz ki a memóriából. Például létrehozhatsz egy városokból álló tömböt. házszámot. ha a városban nincsenek körzetek. Hogy $Sydney és $San_Francisco bekerüljenek egy népesség város szerinti tömbbe. Ausztrália tömböt: $Sydney["Chatswood"] = 51. $Sydney["Wahroonga"] = 12. Kilistázhatod a népességi adatokat körzet szerint.) Bármi lehet tömbelem. hogy az értékek nem tömbök-e. $city["Islip"] = 200. $Sydney["Parramatta"] = 145. bár kétlem. A következő példa néhány fiktív adattal tölti meg a Sydney. a php. Valójában az a helyzet. ha Carmel összes épületében. amennyi csak kell az adatok szervezéséhez. ahol a nagyvárosok körzeteik alapján sorolódnak be. akár másik tömb is. San Franciscóban vagy Sydneyben.org/barista/ oldalra. Többdimenziós tömbök létrehozása és azokra hivatkozás történhet pusztán a szögletes zárójelek közé zárt extra referenciák hozzáadásával. $city["Sydney"] = $Sydney.J. város indexálja. $city["Ulaanbatar"] = 3 8 . menj a www. vagy város szerint. mert neked kell megnézned. mi az a barista. a következőket kell beírnod: $city["Dayuanjiadun"] = 5.

while(list( $ k . ami tartalmazza a $array részhalmazt. ha az érték tömb. Amikor tömböket adsz át függvényeknek. Ha a tömbnek többszörös dimenziója van. A tömbmutató A tömbmutató csak néhány nyelvben áll rendelkezésre. Ezt a parancsot használd. akkor $x mutatója a tömb elejére fog mutatni. hogy a függvény kap egy másolatot a tömbről. A mutató aktuális helyzetét a current()-függvénnyel tudhatod meg.Áttekintés gét. rekurzív függvényt használj. Az each()-függvény megadja az aktuális adat kulcsát és értékét. Több függvény is támogatja a tömbmutató hasz nálatát. így a tömb végére további adatokat szúrhatsz be. és a next()-. hogy segítse a tömbben való mozgásodat. Minden tömbnek megvan a saját külön mutatója. majd lépkedj végig az each()-függvénnyel. A while()-ciklus használata előtt győződj meg arról. Erről bővebben a 10. így teljesen függetle nül dolgozhatsz egyszerre több tömbben. Segít meghatározni. és azt mondod $x = $y. ami annyit tesz. Amikor egy tömböt az adatokat hozzáadásával hozol létre. akkor a tömb az eredeti mutatót tartja meg. és egy tömbről készített másolatban a mutató annak az elején van. ak kor a $v változó egy tömb lesz. Megjegyzés: Egy változó az & előtaggal megjelölve is átadható egy függvénynek. I 73 . vissza akarsz menni a tömb elejére. és meghívja magát. Például. Az each()-függvénnyel egy egyszerű while-ciklussal végig lehet a tömbön lépkedni. és a másolat tömbmutatója a tömb elején áll. hogy hol vagy. ismeretlen pozícióban. ez alapértelmezésben értékként történik. prev(). $v) = each($array)) Ebben a példában a list()-függvény minden egyes értéket külön változóban ment el. Az each()-függvény visszaadja az adat kulcsát és értékét. fejezetben olvashatsz. és az általam ismert 30 nyelv közül a PHP-ban található a legjobb megvalósítása. amikor egy tömbben mozogsz.és end()-függvényekkel mozgathatod azt. A reset() a tömb elejére állítja vissza a mutatót. Ha viszont a tömböt hivatkozással adod át a függvénynek. ha $y egy tömb. így megkönnyíti az eredmények feldolgozását. További információért nézd meg a „Ciklusok tö bbdimenziós tömbökben" az „Gyors megoldások" részt. a mutató az utolsó hozzáadott adatra mutat. A tömb rendezése után a mutató visszaáll a tömb elejé re. hogy átnézd. és a $v tömbmutatója a tömb elején lesz. mint itt : reset($array). Amikor a tömb készen van. hogy a mutató a tömb első adatán van. amikor egy ismeretlen állapotú tömbön mész végig. és aztán átviszi a mutatót a következő adatra. majd továbblépteti a mutatót a következő adatra. mely összeadja a legmagasabb szintű számokat.

A natsort(). Arra azonban ügyelni kell.érték szerint. Tegyük fel. Ez számtalan lehetőséget nyújt az adatok tárolására és rendezésére. asortQ. így megkülönböztetik a kis. hogy nem különbözteti meg a kis.és a natcasesort()-függvények másképp működnek.kulcs szerint.és nagybetűket. amikor a nevekhez illesztett számok alapján történik a rendezés. Megjegyzés: A természetes kifejezés azon rendezési elvekre utal. mert további kódot tartalmaznak. A natcase() extra kódja segít feldolgozni a néven belüli számokat. Tejezet lombök Tömbök rendezése A PHP-tömböket függvényekkel tetszésed szerint rendezheted. Ez a lista: a A b B c C rendezés után így néz ki: A B C a b c Néhány tömbrendező függvény tömbbe rendezi az értékeket (elhagyva a hozzá tartozó kulcsokat és visszaállítva a numerikus kulcsok alapértelmezését). amikor listába szeretnéd szedni azt az 500 embert. rsortQ. megtartva a tömbben a hozzátartozó kulcsokat. ahogyan az emberek rendezik az egyes dolgokat olyan esetekben. hogy szeretnél egy listát a barátaidról és rájuk vonatkozó információkról.számos „természetes" és speciális rendezés. míg más függvények az értékeket a kulcs alapján rendezik.abc-sorrendbe. majdnem úgy. Az alaprendezések minden egyes karaktert különálló bináris bájtként kezelnek.<s. akiket szüleid . amelyekk az alábbi elvek szerint rendeznek: . a natcasesort() a natsort()-hoz képest annyiban más.és nagybetűket. Hogy ezt megtegyed. Egyben magába foglalja például azt a speciális eljárást. mint egy re lációs adatbázisban. A sortQ. hogy a függvények hogyan kezelik a kis. . arsortQ. A legtöbb rendezőfüggvény a következőképpen rendez. . amikor a közvetlen abc-sorrend nem a leglogikusabb eredményt adja. ami az adatokat rendezés előtt dolgozza fel. ksortQ és natsortQ eljárásokra részletes példák találhatóak a „Gyors megoldások" részben. amik bármit tartalmazhatnak. de képzeld el azt. és mindezt szeretnéd többféleképpen online megjeleníteni. először is készítened kell egy listát a barátaidról (csak néhányat használj próbakép pen. . amelyek azt próbálják utánozni.és nagybetűket.

hívtak meg az esküvődre. akiket te szeretnél meghívni): 74 . és azt 200-at.

Áttekintés $friend[] = "Cate Blanchett". ami a születésnap. így kétdimenziós tömböt hozol létre: $friend["Cate Blanchett"] = array("number" =>"555 111 1111". { $v) = each < $ f riend) ) $birthday[$v["birth"] ] Snumber[$v["number"]] = $k. Ha egy listát sokféleképpen dolgozol fel egy oldalon. hogy a születésnapjuk alapján rendezed őket. Most következzen a legújabb függvények rövid összefoglalója. Létrehozhatsz kereszthivatkozásokat. vedd figyelembe. mely mezők lesz nek kulcsok a tömbökben. de a barátok nevén alapuló asszociatív tömb már többet mond: $friend["Cate Blanchett"] = "555 111 1111". vagy másolatokat készíthetsz az ada tokról rendezés előtt. $friend["Kate Beckinsale"] = "555 333 3333". $friend["Nicole Kidman"] = array("number" =>"555 222 2222". illetve a tömbökön. Most hozzá akarod adni a születésnapjukat. mit tegyek a név nélküli telefonszámokkal). Az array_search() megkeresi a másik tömbben ezt az értéket. "birth" => "1967-06-20"). "birth" => "1969-05-14"). Az eredeti tömb nem mond sokat. Ezután úgy döntesz. Ez a példa így fest: $b = array_search($number["555 333 3333"]. = $k. ami történetesen egy név. amit születésnap szerint rendezhetsz. hátha egyszerűbb lenne többszörös tömböt használni az egyes értékekhez. de nem tudod se a nevet. hogy ossza az adatokat többszörös tömbökbe. $friend[] = "Kate Beckinsale". Pad és Mérge Sok új PHP-függvénnyel elég furcsa dolgokat lehet művelni a tömbökkel. $friend["Nicole Kidman"] = "555 222 2222". Pop. amit telefonszám szerint. hisz tudod. A következő példában tételezzük fel. 75 . Vedd számításba. hogy tudod a telefonszámot. Miért állnál meg egy tömbnél? Betöltheted a tömböt többszörös tömbként. Push. A Snumber visszaad egy értéket. és telefonkörzet alapján listázod (így csúcsidőn kívül tudod őket hívni). és sokat gondolkodtam. A példabeli kétdimenziós listát az alábbiak szerint lehet kettéosztani: wh i l e ( ü s t ( $ k . hogy hogyan akarsz a tömbökön végigmenni. és van egy másik listád. Most van egy listád. $birthday). és azt is. hogy a megfelelő napon felhívhasd őket. beprogramoz hatod. és visszaadja a kulcsot. "birth" => "1973-07-26"). se a születésnapot (agglegény voltam egykor. Most add hozzá a telefonszámaikat. $fríend[] = "Nicole Kidman". hogy a nevek teljesen egyezni fognak. $friend["Kate Beckinsale"] = array("number" =>"555 333 3333".

Felhasználási módként preferencia alapú rendszerek juthatnak eszünkbe. $ b [ ] = "Báli". fejezetben leírt formátumkódok használatával). unset($a[key($a) ] ) . és a key() visszaadja az utolsó adatot. Nem kell először az array_push()-t majd utána az array_pop()-ot használni. 'Fiji". = "Hawaii". majd a legolcsóbbtól kezdve kitörli azokat. Hogy garantálod. fejezet Tömbök Push és Pop Az array_push() és az array_pop() parancsokat azoknak találták ki. míg a $b-tömbhöz az array_push() paranccsal adtuk hozzá az adatokat. $y végül meg fog egyezni $x értékével: $x = end ($a). aztán rendezheted. A manuális fo76 . Az array_pop() ugyanezt az eredményt eléri egy kódsorral. hogy az array_push() paranccssal berakhatsz dolgokat a verembe. mind a $b-tömbnek ugyanaz a tartalma: $a[] $a[] $a[] = "Báli". Pad Tegyük fel. "Hawaii"). az adatok számát. Mind a $a-. majd push vagy pop. vagy csak hét vagy négy. ami azt jelenti. és az array_pad() által kreálandó adatok értékét. akkor: $sexy_men = array_pad($sexy_men. A $x-et egyenlővé tesszük a $a-tömb utolsó adatával az end()-függvény segítségével. Szeretnéd berakni az öt vagy hat Oscar-jelölést a legjobb filmre. Tömböt bárhogyan építhetsz. Miért használd az array_pad()-et a 10 darab (vagy bármely más számú) adat garantálásához? Képzelj el egy top 10-es listát. array_push <$b. de csak kilenc adatod van. ahol az ember választ mondjuk egy úti célt és megadja az igényeit is. majd az unsetQ kitörli az adatot a $a-tömbből. majd push vagy pop addig. "Péter Moulding"). = "Fiji". amelyek túl sokszor állnak meg. és hagyod. majd azokat.3. A tömböt használhatod memóriaveremként. $y = array_pop($b). Ezután a kód kitörli azokat a lehetó'segeket. hogy az emberek a saját választásaikkal töltsék fel a listát. hogy kell az utolsó adatot visszaadatni. amelyek nem felelnek meg a választási kritériumoknak. ami szavazási formátumban lesz (a 9. amelyeken nem szolgálnak fel vegetáriánus menüt. és az array_pop()-pal kiveheted őket onnan. A kód például az összes Port Douglas-i repülőjáratot kiválasztja az ár alapján. 10. hogy van egy top 10-es listád valami fontos dologról. A következő példa azt mutatja meg. így ehhez kevesebb kódsor kellett. Megadod az array_pad()-függvénynek a tömb nevét. amíg pontosan azt a tömböt nem kapod. akik a verem alapú kódot kedvelik. Ha a szexi férfiak top 10-es listája néhány adattal rövidebb a kelleténél. amit szeretnél. A következő kódban a $a-tömb az adatok egyenkénti hozzáadásával jött létre. majd törölni hagyományos tömbparancsokkal és hogyan az array_pop() paranccsal. hogy 10 adatod legyen? Az array_pad()-függvény pont ezt teszi.

Áttekintés lyamat az. hogy az array_merge() hogyan egyesíti a $friends és a $more tömböket a $xtömbbe. $more["Alice"] = "Copenhagen". 77 . egymásba fűzi és újra sorba állítja. és hogyan egyesíti ezeket a hagyományos while()-ciklus a $y tömbbe. hogy a jelöléseket ciklussal beviszed a tömbbe. Mind a két módszer eredménye ugyanaz: mindkét esetben a második Tom felülírja az elsőt. majd egy második ciklussal létrehozod az üres helyeket. hány üres hely kell. míg az asszociatív tömböket adatról-adat-ra egyesíti. Mérge Az array_merge() két vagy több tömböt egyesít. } while (üst ($k. A hagyományos tömböket. while (üst ($k. $v) = each ($more) ) { $y[$k] = $v. A következő kód megmutatja. $friends["Tom"] = "London". Más-más technikát alkalmaz az asszociatív és a hagyományos tömbök esetén. majd kiszámolod. $v) = each ($f riends) ) { $y[$k] = $v. és az ugyanolyan kulcsú új adat felülírja a már meglévő adatot. $x = array_merge($friends. $more["Tom"] = "Perth". amelyek egész számokat tartalmaznak. A pad-függvénnyel mindez egy ciklussal megoldható. de az array_merge() kevesebb idő alatt írja nieg és dolgozza fel: $friends["Adam"] = "Hawaii". $more). így létrehozol a formátumban minden jelölésnek egy-egy adatot.

"feijoa"). hogyan olvashatod ki a listáidat az adatbázisból. "banana". $ p ro t e i n = a r ra y (" v e g e t a b l e " = > a r ra y (" p o t a t o " . és az utána következő „Gyors megoldások" hasznos segítséget nyújt a tömbök feldolgozásában. ahogy a következő péidában a $carbohydrate és a Sprotein mutatja: $carbohydrate = array ("fruit" => array ("apple". fejezetek megmutatják. $fruit[] = "feijoa". "banana" => 29. $fruit[] = "apple". "feijoa"). és darabonként rakja be a tömbbe adatként. "banana". amelyek tükrözik az adataid szerkezetét. "apple.banana. "protein" => $protein) . amely mutatja. mint azt a következő példa is mutatja: $lunch = array ("carbohydrate" => $carbohydrate. $fruit[] = "banana". $fruit_weight = array("apple" => 35. " p o t a t o " ) ) . Az array()-t és a fejezetben bemutatott függvényeket be lehet ágyazni. Figyeld meg a következőben. "beans". Az explode()-függvény első paramétere a határoló jel.3. mint ez lentebb látható. "feijoa" => 25). Tejezet lombok Gyors megoldások Tömbök létrehozása listából az array()-jel Az array ()-függvény tömböt hoz létre egy listából. így bármilyen listát beírhatsz tömbként. és listákat többdimenziós tömbökké egyesíthetsz. hogy rendeli a = > az értéket a kulcshoz. amely készen áll a feldolgozásra. " s h e e p " ) ) . "deadthings" => array ("cow".feijoa"). és 6. " l e n t i l s " ). mi kerül a tömbbe: $fruit = explodel". Ebben a példában vessző van a gyümölcsök nevei közt. Asszociatív tömböt is létrehozhatunk az array()-függvénnyel. a második a sztring. "vegetable" => array("carrot". Az 5. Tömbök létrehozása sztringből az explode()-dal Az expíodeQ-függvény feldarabolja a sztringet (a határoló jel alapján).". Egy egyszerű számozott tömböt valahogy így építhetünk: $fruit = array("apple". Az explode()-kódot egy másik kód követi. Tömböket az array()-en belül is használhatsz többdimenziós tömböket létrehozására. hogy többdimenziós tömböket hozzál létre. 76 .

melynek formáját alább mutatom be. akkor szükséged van olyan parancsokra.Gyors megoldások Tömbök létrehozása sztringből az implode()-dal Az implode() fordítottja az explode()-nak.és XML-részeken belüli listákat. A táblázat neve furniture és a következő mezőket tartalmazza: • szoba • típus • • stílus szín • márka magasság szélesség mélység súly anyag megrendelő szállítási idő összeszerelés ideje lehetőségek 79 . ábrák koordinátázott listáit. a tömb adatait tetszés szerinti határoló jellel fűzi össze. akkor ez ugyanolyan gyors. akik nem ismerősek az SQL (Strukturált Kereső Nyelv) prog ramnyelvben megjegyzem. c. mint az összes mező kiválasztása a select segítségével. Ha nincsen where-paraméter. Az egyes listáknak átadott részek a select utáni mezőlista. order by-paramé-ter vagy group by-paraméter. Ha a táblázat kevés mezőt tartalmaz.helyi bolt bútor listáját tartalmazza. hogy az SQL-adatok valamely táblázatból való kiválasztását teszi lehetővé. A következő példában az SQL felépíthető' valamely tömb által tartalmazott mezőlistákból.belsőépítészeket kiszolgáló . b. „b mező" kiválasz tása stb. és a HTML. Ez az eljárás tetszőleges karaktersorozatokra épülő lista szerkesztésére alkalmazható. akkor az egészet kihagyhatod. A vásárlás egyszerűsítése céljából a bolt szobákra van osztva. A mintatáblázat egy . és csak bizonyosakat akarsz kiválasztani. Ha a táblázat sok mezőt tartalmaz. c group by b Megjegyzés: Azok számára. d from x where a = 'z' order by b. az order by utáni mezőlista és a group by utáni mezőlista lesznek. beleértve a dinamikusan generált függvényeket. mint például az „a mező". a where utáni feltételi lista. select a. Elemi SQL Az SQL felépítésének illusztrálása céljából az elemi SQL legyen egy select parancs.

és annak bejegyzéseit vesszővel és szóközzel választja el. hogy fel tudd építeni az SQL-ed select mezőlistáját. fejezet Tömbök select Először is kell egy kiválasztási lista. Az SQL építő kódja ellenőrzi. where Ezután kell a where-lista. order by Szín. "height". hogy legyen hol tartani a könyveidet. SQL építése Az SQL felépítésének első lépése az SQL select-részének felépítése a $sql-sztringen belül. Először azt ellenőrzi. ak kor feltételezhető. hogy kiválaszthasd a fa megfelelő színét. hogy létezik-e $group-tömb. hogy az igazán nagy könyveket is tárolhass. és beépül a másik order by listába az SQL-ben: $order[] = "color". if(isset($select)) { if (is array($select)) 80 . akkor könyvespolc kell ne ked. A lista tömb alakban kell a feldolgozás megkönnyítése érdekében. akkor alapértelmezés szerint a "'"'" jel használatával a táblázat mindegyik mezőjét ki kell választanod. hogy a kód más részében megszerkesztett előformázott l ista. Ha a $select nem tömb. $sql = "select ". "width". hogy vajon létezik-e a select-hsta. A $order tartalmazza a rendezési mezők listáját. $order[] = "depth". $order[] = "height". Ha polcot akarsz venni. A következő példában használd a $select nevű tömböt: $select [] Sselect[] $select[] $select [] $select[] "room". "color". így nincs group by-lista a könyvespolc választáskor az SQL-ben. Ha a select-hsta nem létezik. és válassz magasabb és mélyebb könyvespolcot. tehát hozd létre a $where nevű tömböt: $where["type"] = "bookshelf". mielőtt használná a group by-lista elkészítéséhez. "depth11. magasság és mélység szerint rendezd a listáját a könyvespolcoknak. group by Nem kell a listát csoportokra osztani.3. hogy az adatbázis-táblázatból a megfelelő sorokat kiválaszthasd.

amely akár standard. arra az esetre. $v) each ($where) ) { $where_list[] = $k . Ez után ellenőrzi.= } "*". hogy teljesen megszerkesztett where-sztring.= $select. ha nincsen szükség elválasztó jelre. A kód először definiálja. hogy a tömbmutatót a tömb kezdetére állítja be. A where-lista egy kicsit bonyolultabb. először az asszociatív értékpárból a where listatömböt egyszerű tömbbé kell átalakítanod. hogy tömb-e. A következő lépésben a kód végigmegy a $where-tömbön. } $sql. Ahhoz. hogy a select-kódhoz hasonlóan a kód egyszerű legyen. és ebben az esetben is használhatod az egyszerű implode() parancsot a többszörös where-értékek egyesítésére. ". ugyanis csak a tömb értékeit használja fel az eljárás. hogy vajon a $select nevű tömb létezik-e. amely sztringek listáját tartalmazza. $sql . akkor azt kell feltételezned. Ha a $select létezik. akkor az is_array() használatával eldönti. Ezután végigmegy a tömbön.= " from furniture". Az implode() első paramétere az elválasztójel. amelynek neve Swherelist. Az egyszerű példában a from előírás csak az itt felsorolt táblázatot nevezi meg. Az implodeQ második paramétere a tömb. A select parancsot az SQL from előírás követi. mint alább: if{isset(Swhere)) { if(is_array($where)) {~ r e s e t ( $ w h e r e ) . így a nulla hosszúságú sztring is.Gyors megoldások $sql . mind a tömb kulcsára szüksége van. hogy a Ssql-sztring tartalmazza az SQL-t és beilleszti a select kulcsszót. majd alapállapotba hozza azáltal. és beilleszti a "*" jelet. és sztringként kell átadnod. Szerencsére az összes érték az and segítségével egyesíthető. és ezután az implode() segítségével felépíti a kiválasztási listát. . amely tetszőleges sztnng lehet. így egy új tömböt hoz létre. Ha a $where nem tömb. " = ' " .= implode(". }} else { Sselect). Először ellenőrzi. " '". mert ez a lista asszociatív tömb és az SQL-nek mind a tömb értékére. hogy a $where létezik-e. hogy ezáltal ezt a listát az implode() parancsban használhasd. és a kulcsokat összekapcsolja az értékekkel. akár asszociatív tömb is lehet. else { $sql . ha nincsen ilyen nevű tömb. while (üst ( $ k . = $v .

$order). hogy a whileQ-ciklus soronként végigmegy a Swhere-tömbön és létrehozza $where_list-et. és a változót egyszerű sztringként kezeli. korábban bemutatott kódhoz és az ezt követő order by.= implode("r ". A korábbi select-hstáktól eltérően az SQL-ben most nincsen a hiányzó listát alapértelmezésben helyettesítő *. i f ( i s array($order)) t ~ $sql } .= " where ". } else f $sql .= implode(" and ". amelyeket majd az SQL where részében and fog összekötni. hogy a változó létezik-e. amely olyan tömb. mielőtt a $where_íist adatot létrehozná. hogy a $order teljesen megszerkesztett lista. if(is_array($where_list)) { $sql . s ezek mindegyike egy SQL kiválasztási feltételt tartalmaz.és group by-kódhoz. else { $sql } . hogy a kód a változó használata előtt ellenőrzi. A select. A fő különbség az. r Most már átalakíthatod a $where_list-et SQL-lé. Ehhez a select-kódhoz hasonló kódot kell használnod. hogy ez a rész hiányzik az SQL-ből. mint alább: if(isset($order)) { $sql. Megjegyzés: Számos adatbázis nem szereti az egész számok melletti egyszeres idézőjelet (Ő '). ha a $order nem tömb.3. Az order by alapértelmezése az. Erre az is_array() parancsot használja. amelynek elemei sztnngek. A select-kódhoz hasonlóan ez a kód is feltételezi. A következő lépés az order by SQL létrehozása a Sorder-ből a $select-et végrehajtó kódhoz és a $where_list-kód utolsó részéhez hasonlóan. 82 > 1 . ha a változó tömb. ha a $where_list nem tömb. $where_list).és a where-kódhoz hasonlóan ez a kód is feltételezi.= $order. mint alább: if (isset ($where__list) ) { $sql . hogy a where kódodnak először ellenőrizni kell a mező típusát. tehát előfordulhat.= " order by ". hogy kihagyja az SQLból hiányzó részt. A where-lista alapértelmezése az. Ez a kód annyiban hasonló a $select utasítást megvalósító. fejezet Tömbök else { $where üst = íwhere.= $where_list. ha nem az. hogy a $where_list teljesen megszerkesztett lista.

= implode (". $i++) { $i <= 10. = $i. a következőt kell kapnod: select room. $group). ha nem állna rendelkezésre a rangeQ. Key Valuel 0 5. color. amint a 3. hogy hiányzik ez a rész az SQL-bó'l. hogy rendelkezésedre álljon számoknak egy tömböt alkotó listája. height. hogy mit kellett volna írnod akkor. mint alább: if(isset($group)) $sql . f o r ( $ i = 5.= " group by ".(jyors megoldások A group by SQL a $group-ból jön létre a $order esetében használt kóddal majdnem teljesen megegyező kód felhasználásával. hacsak a $group nem tömb. height. if(is array($group)) $sql .= $group. else { $sql . A korábbi kódhoz hasonlóan ez a kód is felteszi. $labels = rangé( 5 . akkor a range() a listát az első paraméterében megadott számtól kezdve és a második paraméterében megadottal befejezve építi fel számodra. depth Az adatok tartományának kijelölése a range() segítségével Ha címkék nyomtatásához vagy más megszokott eljáráshoz szükséged van arra. A group by alapértelmezése az. ". depth from furniture where type = 'bookshelf' order by color. $labels[] 10). I I EJ 1? [3 '' U : 5 1 6 J 7 ] 8 9 10 3. width. A kód többi része mutatja be azt.1 ábra Tőmbértékek létrehozása a range()-dzsel 83 . amit tömb követ. hogy a $group teljesen megszerkesztett lista. amint azt a következő kód első sora mutatja. } Amikor kinyomtatod a $sql-t.1 ábra mutatja.

5 . J j : 2 ] 7 8 9 10 3 1 ° .. akkor fi gyelmedbe ajánlom az array_flip() kétszeri alkalmazását. akkor esetleg a tömbkulcsba akarod belerakni a kijelölt tartományt. $x = array^flip(\$labels) . hogy rendelkezésedre álljon számoknak egy tömböt alkotó listája. J 3.. ) E . A 3.. A range{) és az array_flip-kód első két sora után az a kódlista következik. $labels[] = "monitor". 84 ..2 ábra mutatja az eredményül kapott tömböt: $numbers = rangé ( 5 . $labels[] = "mouse". while (üst ( S k . hogy a tartomány a kulcsba kerüljön. A mintatömbben a keyboard kétszer szerepel: $labels[] = "keyboard". hogy így később majd értékként hozzáad hass még valamit (például dátumot). A következő kód kibővíti „Az adatok tartományának kijelölése a rangeQ segítségével" részben szereplő kódot.2 ábra Tömbértékek létrehozása a range()-dzsel és az array_flip()-el Duplikát tömbértékek megszüntetése az array_flíp() segítségével Ha valamely tömb listát tartalmaz és a duplikált értékeket meg akarod szüntetni. először egy munkatömbben létrehozva a megfelelő tartományt. 1 0 ) . ezáltal a rangé() segítségével létrehozott számtartományt a kulcsba viszi át. Az array_flip() tömbön belül átvált az értékek és a kulcsok között. amint a lenti kód mutatja. $labels[] = "keyboard".. amelyet az array_flip() kitalálása előtt kellett volna írnod. Value 5 |6 L. majd a $labels tömbbe rakja oly módon. mint például a nyilvántartási címkék esetében. $labels array_flip($numbers).fejezet lomüoK Kulcstartomány kijelölése a range() és az array_flip() segítségével Ha címkék nyomtatásához szükséged van arra. { $labels[$v] $v) = = each ($numbers) ) = $k.

Amikor a második átváltás megtörténik. amit szeretnél megkeverni. azonban az eredetitől eltérő sorrendben. "Walkin' The Blues". de már unod mindig ugyanabban a sorrendben hallgatni. amivel véletlenszerű listát lehet létrehozni. csak írd be ezt: shuffle($tracks). A 3. hogy csak egyetlen keyboard maradt. Hasonlóképpen. Most jelenítsd meg a tömb első adatát. miközben a kulcs szerint rendez.mouse 1 2 . ezért hozzáadtam a ksort() parancsot. "Help Me". "We're Gonna Make It". A ksort() megtartja a kulcs és érték párokat.3 ábra mutatja a tömböt a kétszeri átváltás előtt és után.*—— ~~- Ikeyboard |l . A shuffleQ-függvény az a varázslatos függvény. Először is kell egy lista. amit le akarsz játszani. a má sodik keyboardérték pedig felülírja az első keyboardértéket. "Wang Dang Doodle". \Key\Value (o" fi -------. hogy visszarendezze a tömböt az eredeti sorrendbe. "Forty Four". "I'm Your Hoochie Coochie Man". 85 . ezért ugyanabba a kulcsba mennek át. az értéket a kulcsba viszi át. "High Heeled Sneakers". "My Babé". Itt van egy blues-CD számainak listája: $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] $tracks[] = = = = = = = = = = = = = "Smokestack Lightnin'". ksort(\$labels). hogy van egy CDéd. akkor a tömb az eredeti alakjába megy vissza.Gyors megoldások $labels = array_flip( $ x ) . ha van egy weboldalad egy csomó bannerrel. A számok összekeverése egyszerű. "I'm In The Mood". Ez az adat bármelyik szám lehet. Az első átváltás a kulcsot az értékbe. hogy érdeklődést keltsenek. "When The Lights Go Out".ti -------. hogy a bannerek véletlenszerű sorrendben jelenjenek meg.3 ábra A tömb a két array_flip() előtt (balra) és után (jobbra) Tömb véletlenszerűsítése a shuffle() segítségével Tegyük fel.3 Imouse Ikeyboard imonitor [2 |3 jkeyboard [monitor 3. "I'd Rather Go Blind". talán szeretnéd. "Walking By Myself". Mint hogy mindkét keyboardnak ugyanaz az értéke. Láthatod.

mert a microtime() mikromásodpercben számol. amiket én kedvelek: $banners[] = "Coriolis". függetlenül attól. amiket egy igazi véletlen szám generátortól elvárnánk. olyan nagy változások nélkül.j. hányszor használod a shuffleQ vagy a rand() függvényeket. hogy elég véletlenszerű. hogy csökkentsük a parancsfájl lefuttatásának ismétlődését azáltal. A következő példa megmutatja az srand{). 86 . ha a Frissít gombot 2 másodpercenként nyomom meg rendszeresen. a microtime(). de olyan termékeket gyártanak. ábra mutatja a számlista kétszeri gyors egymás utáni keverésének eredményét. Azt találtam. hogy egész másodpercek helyett a másodperc töredékét vesszük alapul.4 ábra Lejátszó lista két véletlen sorrendben Bannerek véletlenszerűsítése az array_rancl()-dal Ha nem kell az egész listát összekeverned. és a shuffle() együttes használatát. srand((double) microtime() shuffle($tracks). akkor használd az array_rand()-ot. az azért van. A részletek a rand() függvény kapcsán a 2. hogy sikerül kétszer ugyanazt az eredményt elérni. és ez a véletlen szám generátor az időn alapszik. fejezet IOÍVDOK Ha a számok sorrendje nem tűnik eléggé véletlenszerűnek. A microtime() használata csak azért szükséges. Az array_rand()-függvény alapértelmezésben adott számú adatból választ ki egy adatot. íJHigh Heeled Sneakers Help Me I'd Raíher go Blind |My Babé ' Smokestack Lightnin' FmüiTheMood We're Gonna Make It ||Fourty Four * 1000000). és csak egy véletlenszerű adat kell (mint például. így az Unix időalapú (másodperc alapú) véletlen szám generátora helyett használd az srand() függvényt.4. Talán nem hallottál az alábbi vállalatokról. mert a shuffle() a PHP véletlen szám generátorát használja. Bizonyos körülmények között ez nem biztos. ||Forty Four i |Wang Dang Doodle !|I'm Your Hoochie Coochie Man fWe're Gonna Make It j ' [When The Lights Go Out jfWalkin' The Blues High Heeled Sneakers Wang Dang Doodle I'm In The Mood I'm Your Hoochie Coochie Man Help Me Walking By Myself [i'd Rather Go Blind [MyBabe Walkin' The Blues 'Smokestack Lightnin' When The Lights Go Out . A microtimeQ függvény jó helyettesítője az srand() time() függvényének. ha csak egy banner van az oldal tetején). és a 3. akkor minimális lesz a változás a számok sorrendjében. így nem valószínű. Majdnem tökéletes egy banner listából való kiválasztására. $banners[] = "Coopers". Walking By Myself . Először is kell a reklámok listája. A srand()-ot parancsfájlonként csak egyszer kell használni. fejezetben megtalálhatóak. i ! \ j 3.

= each ($banner_list) ) { print ("<img " . "AMD". Jegyezd meg.jpg"). Ezután megmutatja a reklám nevét. $v) $banners[$v] . print("<p align=\"center\"xfont color=A"339933\" size=\" + 4\">" . nem az értékét. print ("<br>Banner file name: " .jpg kiterjesztés is. print("<br>Banner name: " . így használhatod a választás kulcsát vagy az értékét is. Bármelyik bannert kiválaszthatod és megjelenítheted az alábbi egyszerű kóddal. A következő kódpélda véletlenszerűen választ ki egy bannert a $banners tömbből. Sbanners[Sbanner]). majd megmutatja a banner kulcsát. így ellenőrizheted. Ebben a banneros példában először megnézem a reklám nevét. ahogy ezt szokták: srand((double) microtime() * 1000000). és az értékek tömbjét adja vissza egynél több adat esetén. amely a HTML <ímg> tag-et állítja elő a $banners tömbből vett fájlnevek felhasználásával. Az array_rand() a választás kulcsát adja vissza. akkor lehet. A reklámok listájának használatához a while-ciklushoz hasonló kódot használhatsz. Sbanner_list = array^rand(Sbanners. de lehet. Sbanner). $banners[Sbanner] . ha középre igazítod és kiemeled a bannert. "Compaq". j p g \ " border=\"0\">"). amiben benne foglaltatik a .Gyors megoldások $banners[] Sbanners[] Sbanners[] $banners[] Sbanners[] Sbanners[] = = = = = = "Penfolds"/ "Volvo". while (üst ($k. "Apache". hogy a kulcs kell (a szám sorszáma). src=\"" . print("Banner number: " . ahogy azt egy HTML <img> tag-be raknád. hogy az array_rand() a tömb adatának értékét adja vissza. hogy az array_rand() segítségével ellenőrizhesd a visszaadott értéket. Ha egy számot választasz ki véletlenszerűen egy CD-ről (mint azt az előző Gyors megoldásokbeli példában is láttuk). $banner = array_rand(Sbanners). Itt van az a kód. A kód az előző példákban használt a normál while(). Iist() és each() parancsokat használja és rendre a print-utasítást adja ki. hogy az érték kell (a szám címe) a megjelenítéshez. amely három véletlen bannert választ ki a $banners tömbből. A srand()-ot csak egyszer kell lefuttatni a parancsállományban az array_rand() első futtatása előtt. $banner = array_rand(Sbanners). hogy a $banner-tömbből kapott érték helyes-e. Esetleg szükséges lehet egy másik véletlen adatra. "PHP". \5banners[\$banner] . ha egyetlen adatot választasz ki. 3 ) . "</font></p>"). hogy azt megadd a CD-t olvasó és lejátszó programnak. 87 . ". Egyes honlapok három mozgó bannert helyeznek el minden oldalra. Ezután megmutatja a banner fájlnevét annak megfelelő módon. A print() parancs élethűbb lesz. amint alább látod.

és így már biztos lehetsz abban. hogy a bannertáblázat bonyolultabb legyen. A Simage ["alt"] értéke a kép neve lesz.3. A print()-utasítás kiterjesztett formája szerepel. hanem sztringek tömbje. amelyet minden extra adattal kibővít abból a célból. mint alább: $lines = fileftest. Alkalmas sztring-függvény segítségével eltávolíthatod a newline-karaktert. Ez a fájl weboldal is lehet. Egyszerű. "V" . $banner = array_rand(Sbanners) . $image["alt"] = $image Fájl tömbbe olvasása a file() segítségével Egy fájlnak valamely tömbbe olvasását kezdd a test. vajon mindegyik tömbattribútum létezik-e. "\ "" .txt-fájllal. " alt=\"" . newline-karakterrel végződik. és néhány hasznos alapértelmezést beállíts. mivel a választott érték most már nem egyetlen sztring. border=\"0\"" Amikor egy honlapot készítesz. " height=\"" . $image = $banners[$banner]. A következő példa gondoskodik arról. az első dolgod az.jpg\" . $image [ "height" ] . ".html"). Az első sor ugyanaz a véletlen kiválasztás. ún. amely elősegíti. " width=\"" . megmutatja. $image["widthM] . "height"=>50. $image ["name"] . hogy a banner hatásosabb legyen. ha a Simage ["alt"] hiányzik vagy üres sztringet tartalmaz. amely a $image-ben szereplő összes adatot felhasználja az <img> tag-en belüli megfelelő tag-ekben. hogy használat előtt ellenőrizd. "alt"=>"Check out their cool Black Books"). olyan többlet információval kiegészítve. mint az előző példában. amely néhány sor szöveget tartalmaz. A második sor a kiválasztás eredményét a $image-be rakja. A Windows operációs rendszerből beolvasott fájlok sorai return-t követő newline-nal is 88 . ezért bonyolultabb tömböket is kezelhetsz vele. amely elválasztja a sorokat egymástól. A következő kód a $banners-tömbből egyetlen bannert mutat. mint ez: $lines = file ("http://petermoulding. " \ " > " ) . A tömb mindegyik adata a \n-. $image = $banners[$banner] . hogy a kép alt szövegének legyen értéke. hogy jó alapértelmezéseket kapsz. "width"=>200. $image["alt"] .com/index. A kódot közvetlenül a Simage létrehozatala utáni sorok beiktatásával ki lehet bővíteni.txt"). hogy a Sbanners-tömb egy adatának kibővítése milyen lesz: $banners[] = array("name"=>"Coriolis". A bannertáblázatok esetében jó ok van arra. Olvasd be ezt a fájl a file()-függvény segítségével egy tömbbe. hogy annak megjelenése sokkal jobb legyen. fejezet Tömbök Mivel az array_rand() a tömb kulcsát adja vissza. A következő kód. print("<img src=\"" . if(!isset($imagefalt"] ) or { !strlen($image["alt"]) ) ["name"].

"a_name_in_lower_case". mint a newline.f Gyors megoldások végződhetnek. } Eredményül a következő listát látod majd: Fuji Ilford Kodak Konica a_name_in_lower_case. mivel a sortQ parancs megkülönbözteti a kis. Ha olyan rendezést akarsz. amely később szerepel a „Gyors megoldások" részben. Megjegyzés: A kisbetűvel kezdődő adat nem illeszkedik az abc-sorrendbe. így tehát a file() néhány kisebb részre bontja fel a JPEG-eket. amelyek a newline-karakterre végződnek. Azonban a file() ekkor is egy vagy esetleg néhány hatalmas elemet tartalmazó tömbként fogja a fájlt beolvasni. Ugyanakkor jobb módszerek is vannak az olyan bináris fájlok beolvasására. \r\n. \n\r bármelyikével. mint például a JPEG. Szerencsére a file() parancs a newline-karaktert a helyén hagyja. amely a kis-és nagybetűt olyan módon kezeli. Tömb rendezése érték szerint a sort() segítségével Fényképezőgépbe való filmmárkák listájának növekvő sorrendbe rendezését egy standard tömb definiálásával kell kezdened. fejezetben szerepel. így eldöntheted. az Apple Mac fájljai végződhetnek a \n. mit teszel vele. amint az a 8. melyeket számba vehetsz és kezelhetsz. amely a márkaneveket adja meg. $v) = each($film)) { print("<br>" . A JPEG-ek tartalmaznak néhány olyan bájtot. "Ilford". \r\n. amelyeknek ugyanaz az értéke. akkor a „ Tömb értek szerinti természetes rendezése a natsortQ segítségével" részt nézd meg. mint alább: $film[] $film[] $film[] $film[] $film[] = = = = = "Konika". Ezután a sort()-függvény segítségével rendezed a listát az alábbi módon: sort{ $ f ilm).és nagybetűket. ahogy azt a JPEG-fájlok olvasása során tapasztaltam. "Kodak". 89 . ahogy azt elvárnád. $v). "Fuji". Nem mindegyik fájl tartalmaz olyan sorokat. A lista kinyomtatásához használd az alábbi kódot: while (üst ( $ k .

amely az egyes filmcímeket tartalmazza. print("<br>" . $films[] = "Men of Honor". hogy az összes kulcsból szám lett. így például: $films[] = "Taxi Driver".és nagybetűket. $film["a_name_in_lower_case"] = "anywhere". Az asort() parancs az asszociatív tömböket úgy rendezi az érték sze rint. hanem a bináris értékek alapján rendez. A következő kód bemutat ja. hogyan működik az asort() a $film-tömbön: asort($film). $films[] = "The Adventures of Rocky & Bullwinkle" . hogy közben megtartja az eredeti társított kulcsokat. az rsort() sem látja a kis. Kezdd először egy normál tömb definiálásával. A következő segítségével kinyomtathatod a listát: while (üst ( $ k . akkor azt találod. Filmcímek listájának fordított (csökkenő) sorrendbe rendezéséhez használd az rsort() parancsot. mint a sort()-függvény. Ugyanúgy. hogy a tömböt az értékek szerint fordított sorrendbe rendezd. $films[] = "Great Expectations" . $film["Fuji"] = "Japán". A következő példa filmek már káit és a származási országot tartalmazó tömböt használja. fejezet Tömbök Asszociatív tömb rendezése érték szerint az asort() segítségével Ha egy asszociatív tömböt a sort() segítségével rendezel. $film["Kodak"] = "Mexico". Itt a mintatömb: $film["Konika"] = "Japán". Az asort() segítségével a filmek márkáit a származási ország szerint sorrendbe rendezheted. mivel az asort() az egyes karakterek bináris értéke alapján rendez. $v Az eredmény az alábbi lista: England Ilford Japán Fuj i Japán Konica Mexico Kodak anywhere a_name_in_lower_case Tömb érték szerinti fordított sorrendbe rendezése az rsort() segítségével Bizonyos helyeken esetleg arra van szükséged. amelyek rendezni akarsz. $film["Ilford"] = "England". az asort() is a nagybetűk után sorolja a kisbetűket. $films[] = "Heat".3. mint a sort(). 90 . $v) = each < $ f ilm) ) $k). Ugyanúgy.

a kisbetűvel kezdődő adatok a nagybetűsök előtt szerepelnek: any other film The Adventures of Rocky & Bullwinkle Taxi Driver Men of Honor Heat Great Expectations Cape Fear Asszociatív tömb érték szerinti fordított sorrendbe rendezése az arsort() segítségével Filmcímek asszociatív listájának fordított (csökkenő) sorrendbe rendezéséhez használd az arsortQ parancsot. print("<br>" } $v) . Ezután rendezd a listát az rsort()-függvénnyel. A sort() és asort() parancshoz hasonlóan az arsortQ is a bináris értékek alapján rendez. A következő segítségével kinyomtathatod a listát: while (Üst ( $ k . while (Üst ($k. $v) = each ($f ilms) ) print("<br>" . mint alább: rsort( $ f ilms). majd nyomtasd ki az eredményt: I 1 I arsort{$films). Az eredmény a következő listához lesz hasonló. = each ( $ f ilms) ) $v). megadva a filmek címét és főszereplőiket. } Az eredmény a következő lista: any other film anyone Swordfish John Travolta Planet Of The Apes Mark Wahlberg Escape From Alcatraz Alcatraz Atlantis: The Lost Empire Michael J. $v . $films["anyone"] = "any other film". $films["Alcatraz"] = "Escape From Alcatraz". Rendezd a listát a arsort()-függvény segítségével.I Gyors megoldások $films[] $films[] = "Cape Fear". $films["Michael J. $k). Kezdd egy asszociatív tömb definiálásával. $films["Mark Wahlberg"] = "Planet Of The Apes". " " . Fox 91 . = "any other film". mint alább: $films["John Travolta"] = "Swordfish". Fox"] = "Atlantis: The Lost Empire".

= "MILDEW44. A következő példa filmek és gyártók tömbjét használja. A natsort() történetesen jól működik olyan fájlnevek esetében. = "Mildew54. Az ideillő krsort() asszociatív tömböket kulcs szerinti fordított sorrendbe rendezi." .jpg". Kezdd először a képfájlok nevét tartalmazó tömb definiálásával. mint például a számozott képek. = "mildew04 0. $v) = each ($plastic) ) { print("<br>" } .Dow Chemical generic plastic wrap . = "mildew4. Ugyanúgy. Számos definíciója van a természetes rendezésnek. = "condensation.jpg".3. $plastic["GLAD Wrap"] = "Clorox Australia Pty Limited". = "greaseO3. $k . Itt a mintatömb: $plastic["Sarán Wrap"] = "Dow Chemical". Eredményül az alábbi listát kapod: GLAD Wrap . fejezet Tömbök Asszociatív tömb kulcs szerinti rendezése a ksort() segítségével A ksortQ-függvény az asszociatív tömböt kulcs szerint rendezi.jpg". $v) .jpg". $plastic["Multix"] = "Multix Pty Limited" .jpg". 92 . mint alább: Simage[] $image[] $image[] $image[] $image[] $image[] $image[] = "grease. Kulcs szerinti rendezéshez rendezd az asszociatív tömböt a ksort() segítségével. a ksort() is a nagybetűk után helyezi a kisbetűket.jpg". A következőképpen csinálhatod: ksort($plastic).jpg". " .just about anyone Tömb érték szerinti természetes rendezése a natsort() segítségével A natsort()-függvény a listát természetesebb növekvő sorrendbe rendezi. mint a sort(). mint a sort() és az asort(). A következővel kinyomtathatod a listát: while (üst ( $ k .Multix Pty Limited Sarán Wrap . $plastic["generic plastic wrap"] = "just about anyone". így a műanyag csomagotómárkáknak a nevük szerint rendezett listáját kapod.Clorox Australia Pty Limited Multix . és ezek a használt nyelv és karakterkészlet függvényében eltérnek egymástól.

jpg rust 3 c . "rust3 a .jpg condensation. $v) .j pg mildew4.jpg butter.jpg Mildew54.jpg".jpg g re a s e .jpg mildewO 4 0.jpg".jpg". j p g rust3 a . j p g " .jp g greaseO3.jpg rust 3 b. a következő begépelésével: natsort(Simage). Nyomtasd ki a listát az alábbi módon: whiledist ( $ k . Ezután rendezd a listát a natsort()-függvénnyel. mint a rust3. Először rendezd a listát a sortQ segítségével.jpg mildew4.j p g " .jpg slime. "rust 3c.jpg rust 3 b.jpg rust3 a.jpg Megjegyzés: Vedd észre.jpg Mildew54.jpg butter. j p g rust3e. print ("<br>" Eredményként a következő listát kapod: MILDEW44. hogy a rust 3c előbb van a rendezésben.jpg slime. mivel a szóközkarakter a 3 elé kerül a rendezésben. "rust 3 b . hogy lásd mi történik: sort($image).jpg 93 .Gyors megoldások $image[] $image[] $image[] $image[] $image[] $image[] = = = = = = "slime .jpg mildewO40. = each ($image) ) $v). "butter.jpg condensation. j p g rust3e.jpg " . Az eredmény az alábbi lista: MILDEW44.jpg rust 3 c .jpg g re a s e .jp g greaseO3. "rust3e.

jpg rust3e. Az ilyen helyzetekben a számítógépek alapértelmezése szerint a 040 előbb jön a sorrendben. Ez a tulajdonság hasznos Windows.jpg greaseO3. A következő példa ugyanazt a tömböt mutatja. Itt szerepel a kód.jpg grease. Pontosabb (és terjedelmesebb) eljárás a metafonok használata a metaphone()-függvény segítségével. mivel a natsort() a számok kezelése során nem távolítja el a kezdő zérusokat. az angol nyelv kiejtési szabályaiból többet használnak fel. nagyszámítógépek vagy Mac OS alatt szervezett fájlok esetén. fejezet tartalmazza. jóllehet a különböző adatbázisok . A mildewO4O. még mindig a mildew4 előtt van. 94 . mint a 4. A kis kezdőbetűs adatok a nagy kezdőbetűsök után vannak. A rustképek ugyanolyan sorrendben vannak. Ezt elemzi a következő rész. j p g rust 3c. az natsortQ parancs a különböző helyekre beszúrt szóköz ellenére képes volt a helyes sorrendbe rendezni a 3a. amint láthatod.jpg MILDEW4 4.és nagybetűket. j p g s li m e .3. Ez a függvény már kezeli a kis. hogy a "mildew"-ek a helyes sorrendben szerepelnek. hogy az E betűhöz hasonló helyre kell rendezni. mivel a natsort() nem különbözteti meg őket. amelyet a PHP soundex()-függvénye támogat. az usort() segítségével megcsinálhatod. azonban a natcasesortQfüggvény segítségével történt rendezés után. mintha nem lennének szóközök a nevükben. azonban túlságosan újak ahhoz.jpg mildew4. hogy ezt a natsort() segítségével elvégezhesd.jpg condensation. butter.jpg rust 3 b .jpg Mildew54. A Soundex általában egy rögzített négykarakteres azonosítót használ.jpg rust3 a. fejezet Tömbök Amint láthatod. amely már teljes azáltal.mint például az Oracle által támogatott MySQL — változó hosszúságú Soundex-értékeket használnak. Bár nem áll rendelkezésre olyan lehetőség. Bizonyos helyzetekben szükséged lehet fonetikus rendezésre. Ez olyan rendező függvény. 3b. egy másik pedig 040-ra. mintha ez a 004 helyett állna. hogy széles körben támogatottak legyenek. hogy egy függvény segítségével megadd az összehasonlítási szabályokat.. amely megengedi. A következő lista a natcasesort() eredményét mutatja. amely a natcasesort() használatát mutatja: natcasesort($image). A metaphone() és a soundex() használatának szabályait a 12. amely jóval a standard abc után következik. A metafonok változó hosszúságúak. A legegyszerűbb rendezési rendszer a Soundex-rendszer. Az európai betűk esete egy másik példa arra. a rendezés bonyolult lehet: E (ékezetes E) bináris értéke 200. 3c és 3e rustképeket. azonban azt várhatnád. azonban az emberek szerint a 4 van előbb. NT. j p g A példában az egyik fájlnév 4-rc végződik.jpg mildew040.

0-t. ha nincsenek. ". "Mildew54. j p g " . "mildewO4O. "butter. Először is átveszi a rendezni kívánt tömböt.jpeg-et összehasonlítás előtt jpg-re cseréli.pgn". "condensation. A rustképek helyes rendezéséhez előbb eltávolítóm a szóközöket. Ezt a függvény egyes részeinek ma gyarázata követi: function unnatural($x. a felhasználó által definiált rendezés a fájl típusa által fog rendezni. Visszaadhat tetszőleges pozitív egészet. ha az értékek sorrendben vannak. Először nézd meg a függvényt. str replace(" ". a neveket az összehasonlítás előtt kis kezdőbetűsre alakítva. hogy mindent te intézz. "rust3 a .jpeg" . "slime. Az usortQ -függvény megengedi. Egy típuson belül a fájlokat abc-sorrendbe rendezi. visszaad valamilyen értéket. "mildew4. és +1 értéket. Ebben a példában a képek különböző típusúak. végül az eredményt. Az általad megadott függvény két összehasonlítandó értéket bemenő adatként fogad. strrpos($x. amely utal arra. "rust 3 c . majd a tömb elemeinek összehasonlításához használt függvény nevét. hogy egy tömböt valamilyen speciális sorrendbe rendezzél.jpg". hogy a két érték egyenlő.jpg".") IT II r IT II r r $x ) $y ) 95 . az unnatural() éppen ezt teszi. amely a. $y) I $x $y $x $y $p = = = = = strtolower($x). amely azt jelzi. hogy a két érték nincsen sorrendben. "greaseO3. és a hagyományos rendező függvények nem adják meg erre a lehetőséget. ha egyenlők. str replace(" " . Egy lépést beiktatok. "rust 3 b . strtolower($y).Gyors megoldások Tömb nem természetes rendezése az usort() segítségével Néha szükséged lehet arra. j p g " .jpg". a 0 jelzi. A következő példa képfájlok nevét tartalmazó tömböt használ. j p g " .jpg". "MILDEW44. Az usort() függvénynek szüksége van egy olyan függvényre. hogy a két érték sorrendben van. amely -1 értéket ad vissza. Itt a példatömb: $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] $image[] = = = = = = = = = = = = = "grease.jpg". Te szolgáltatod az összeha sonlítási függvényt. A következő függvény.JPG". majd a következő példában a függvény használatát.gif". így a/jpeg mindkét fajta írásmódját együtt rendezi majd. hogy a rendezésnek milyen műveletet kell elvégeznie. a negatív szám jelzi.jpg". "rust3e.

3. $p + 1). $p = strrpos($y. } else i if($xf < $yf) í return(-1) . 0. 0. $yt = substr($y. else { $xf = substr($x. else return(0). $xt = "". else $yf = substr($y. $p). $p). if($p === falsé) i $yf = $y. elseif($xf > $yf) return(1). ". if($xt < $yt) return(-1). elseif($xt > $yt) return(1). $xt = substr($x. 96 . fejezet Tömbök if($p === falsé) $xf = $x. $p + 1). $yt = "". if($yt == "jpeg") $yt = "jpg". if($xt == "jpeg") $xt = "jpg".").

sor és a $y-ra vonatkozó megfelelő sor eltávolítja a szóközöket a fájlnevekből. Ezt mutatja a következő kód: $p = strrpos($x.jpg rust 3 b . Mindkét értéket azonnal átfordítja kisbetűkre a strtlowerQ-függvény.pgn Vedd észre.jpeg grease. $x). amelyet a $x esetében újra leírok. függetlenül attól. amelyeket a folyamat ezen pontján most eltávolíthatsz. beleértve a kötőjelet és alulvonást. a fájl neve csak akkor kerül felhasználásra. hogy a gépíró milyen kezdőbetűvel írta. A kinyomtatáshoz használd a következőt: while (üst ( $ k . A soron következő összehasonlítás ban a $xt. A következő rész. és a pont előtti szöveget a $xf változóba helyezi. $v). "unnatural"). A $x = str_replace(" ". Az unnatural()-függvény két értéket fogad el. = each ( $image) ) . attól függetlenül. majd az összes JPEG-fájl. ha a típusok egyenlőek. amikor létrehozta őket. mindegyik operációs rendszer megenged valamilyen szóközhöz hasonló karaktereket. j p g butter. 97 . amelye(ke)t az ucase() ad át. j p g rust 3c.jpg rus t 3e . A JPEG-fájlok a helyes sorrendben vannak. { print("<br>" Az eredmény: s l i me . Bár nem mindegyik operációs rendszer engedi meg a fájlnevekben a szóközöket.JPG mildew040. $v) .jpg mildew4. hogy milyen a fájl kezdőbetűje. gi f condensation.jpg rust3 a. "".). a pont utáni szöveget a $xt változóba. és hogy a JPEG hogyan van írva."). a substr()-függvény segítségével az utolsó pont pozíciójánál két részre bontja a fájlnevet. a típus szerepel. hogy a rustképek logikus sorrendbe kerüljenek.jpg MILDEW44. hogy az eredményben a GIF-fájl jön legelőször.jpg Mildew54. a strrpos()-függvény segítségével megtalálja a fájlnében az utolsó pontot (. i f ( $ p === falsé) ". hogy a fájlnevek. jpg greaseO3. A $xf. és végül a PNG-fájl. $x-et és $y-t. ugyan olyan helyre kerüljenek.I uyors megoiaasoK A listának az usort()-függvény és az unnaturalQ-függvény segítségével történő rendezéséhez írd: usort($image.

if($yt == "jpeg") í $yt = "jpg". 0. és kicseréli ajpg-értékre. A következő kód összehasonlítja a fájltípusokat. + i). ha sorrendben vannak. Bár a kód hosszú. $xt és $yt értékét. így az SQL segítségével kiválaszthatók és rendezhetők. hogy $xt vagy $yt értéke jpeg-e. sok helyet takarítva meg ezáltal. Az utolsó else a fájltípusok megegyezése esetén szükséges eljárásra vezet át: if($xt < $yt) return(-1). a str_replace() parancsot a strtolower() belsejébe helyezhetik. elseif($xt > $yt) return (1). $xt = else r ( $Xf II H * r = = su bs tr ($x. $yt helyett $yf szerepel. és külön mezőben tárolom el őket. ugyanakkor a legtöbb ember csak jpg-nek írja. hogy $xt helyett $xf. amint alább látható.j. amely a teljes megegyezésre utal. 1-et. egyszerűen csak ellenőrzi. akik sorokat akarnak megtakarítani. ahelyett. else A fájlnevekre vonatkozó eljárás a fájltípusokra vonatkozó eljárás másolata azzal az eltéréssel. gyorsan és könnyen lehet megjegyzésekkel dokumentálni. su bs tr ($x. $Xt A kód két következő része. re/ezer IOUIDOK $xf = $x. mint itt: if($xt == "jpeg") $xt = "jpg". és -1-et ad vissza. ha nincsenek sorrendben. 98 . Ha a fájlnevek megegyeznek. Azok. hogy az usortQ-függvényt kelljen használnom. gyakran már az eljárás korai szakaszában levágom a fájltípusokat. $P $P) . a kettőt azonossá teheted a fájltípusok összehasonlítása előtt. Mivel a fájl típusának teljes neve a jpeg. Amikor én adatbázisok segítségével kezelek fájlokat képkezelő vagy más hasonló alkalmazásokban. akkor a kód 0 értéket ad vissza.

Először is vegyük az alábbi mintatömböt: $mineral $mineral $mineral $mineral $mineral $mineral $mineral $mineral $mineral "gold". amely a tömb fájlmutatóját az előző adatra helyezi.ff ■ tr . Ezután a következőt kell kapnod: indium Visszafele lépegethetsz a tömbön a whíle() és prev() használatával. mivel az eachQ az üres 99 . Ezután a következőt kell kapnod: tantalum A tömb előző adatát a prev()-függvény segítségével érheted el. "ruby". "iridium". majd előrehaladsz. "rhodium". Alternatívaként felmerül. mint alább: while{$x = prev($míneral)) { print($x) . Az üres tömbelemek esetén is hamis értéket ad vissza. hogyan lehet egyszerűen a végén kezdeni és visszafelé haladni. Kezdd a tömb utolsó elemének kiválasztásával. amikor a tömb kezdetén túlszalad. és visszaadja annak értékét: print(prev{$mineral)). "platinum". majd az each()-függvényt használd a tömb elemein való előrehaladáshoz. "tantalum". hogy először fordítsd meg a tömböt. mint alább: print(end($mineral)). Jelen szakasz el magyarázza. Azonban ha csak néhány utolsó elemet akarsz gyorsan megtalálni. ahhoz ez a tömbelemek kezelésének nagyon lassú módja lenne. Van azonban egy probléma a prev()-függvénnyel. "palládium". mivel a prev() a hamis értéket adja vissza. "ruthenium". "indium". ha előbb a tömböt fordított sor rendbe rendezed. Gyors megoldások Sztringfügg vények 57 Fordított ciklus a tömbelemeken Egy tömb elemein fordított sorrendben is végigmehetsz. amely az utolsó adatot adja vissza. Erre az end()-függvényt használd.

A tömb elemein a for()-ciklus segítségével is végigmehetsz. amely a tömbön alkalmazott count()-függvényen alapul. így a tömb többdimenziós. elkerüli az üres elemek problémáját. A $weight>tömbben néhány terméket más termékekből szerelnek össze. ha biztosítani tudod. Szerencsére a PHP ben egyszerű eljárás áll rendelkezésre. azonban egy valódi raktárrendszer mennyiségeket és más értékeket is tartalmazna: $weight["nut"] = 50. while(list( $ k . és a whileQ-függvényt. A ketyerét gyártó cég zászlóshajója a WidMAX. array($weight["nut"]. a tömbelemeken való végiglépegetéshez nem használhatom ciklusok egyszerűen egymásba ágyazott halmazát. amelyek ismét más termékeket al kothatnak. amelynek neve Sweight. A prev()-függvény a tömbelemeken való visszafelé haladásnak a leggyorsabb módja. $weight [ " f lange"]. Ilyen például a kütyü. $v) . és azután a fordított tömbön lép végig. h ogy a súlyuk szerepelne. és ahelyett. Ciklus a többdimenziós tömbökön Ez a példa egy különböző termékeket tartalmazó tömb esetén összeadja az egyes tételek súlyát. $weight["flange"] = 300. Gyorsaság szempontjából a for()-függvény a következő választás. Minthogy nem tudom előre. és a dimenziók történetesen nem szimmetrikusak. Ehhez az array_reverse()-függvényt használja. fejezet Tömbök elemek esetén nem hamis értéket ad vissza. ha a cikluson belül nem adsz hozzá vagy nem veszel el elemeket. A példa csak a súlyokat használja. Először kezdjük azzal. azonban a count()-függvény értéke elromlik. karimából és csavarból készül. amely még a legkülönösebb tömbstruktúrák kezelé lkai sere is a mas. hogy néhány példaterméket és azok súlyát egy egydimenziós tömb be rakjuk. $weight["gasket"] = 30. amely végigmegy a megfordított tömb elemein. íreversed = array_reverse($mmeral) . amely utóbbi más termékekből áll ös sze: 100 . Bár a tömb megfordítása időigényes. $weight["widget"] = $weight ["bolt"]) . hozzáadsz vagy elveszel tömbelemeket. $v) = each ($reversed)) { prínt ("<br>" . hogy nin csenek üres elemek.3. $weight["bolt"] = 550. hogy hány dimenziós. A következő kód megfordítja a tömböt. amely az átfordítást végzi. mivel az each() üres elemekkel. Egyes termékek más termékekből állnak össze. amelyet a ketyeréből és további csavarok ból szerelnek össze. az a lista áll rendelkezésre. Az tömbelemeken való lépegetésnek a legbiztonságosabb módja az each{)-függvény. hogy milyen termékekből állnak össze. törlés és hozzáadás esetén is működik. ha a ciklus belsejében valamit csinálsz. amely a ketyerére való utalást is tartalmazza. A következő példa a Sweight tömbben mutatja a WidMAX bejegyzést. amely csavaranyából.

hogy a tömb szerkezetében egy szinttel lejjebb ismétlődjön a folyamat. ami meghívja az add_weights()-függvényt. akkor ezen elemek feldolgozása újra meghívja az add_weights()-függvényt. Ha a részhalmaz elemei tömbök. amely összeadja az egy egydimenziós tömbben lévő számokat (ahhoz. és valami különlegeset tenni. hogy az alaszkabeli Kotlikból a texasi Brownsville-be szállítsd át az árukészletemet. ha az. ami maga is tömb. ha $v tömb. hogy a $v tömb-e. ha $v nem tömb. amint azt a következő bekezdésekből láthatod): function add_weights($weights) { $x = 0. és visszaadja a részhalmaz súlyát.Gyors megoldások $weight["WidMAX"] $weight["bolt"]. hogy a Sweight["WidMAX"] adattal dolgozni tudjál. } } return ( $ x ) . } += Az előző $x + = $v. és hozzáadja a $x-hez. felcserélődött az if(is_array($v)) kezdetű kódra.ini-ben beállított időkorlátot el nem éri. a kódban szükség van egy összeadásra is. hol tartott a kódban. Az ilyen kódok teszteléséhez futtasd le egyszer az újrameghívót a $x+=add_weights($v) sor kiikta tásával. amikor kifutott az időből. A hi baüzenet nem fogja megmondani. akkor lehet. és ugyanazt a $x += $v. A többdimenziós tömbnél meg kell nézned. Az add_weights() a tömb részhalmazával kezd. while (Üst ( $ k . $v) = each ($weights) ) { i f ( i s array($v)) { $x add weights($v) . Ez az egyszerű tömb megkapja a $v-ből az értékeket. Ötlet: Figyelembe kell venni az ilyen újrameghívásoknál a végtelen ciklus lehetőségét. while (üst ($k. $weight["widget"]. hogy mindig ugyanarra a pontra visz vissza a ciklus addig. } else { $x += $v. Tegyük fel.-t használja. 101 . A legegyszerűbb dolog meghívni az add_weights()-függvényt a $v-hez. $weight["bolt"]). = array($weight["widget"]. és megkérlek arra. $weight["bolt"]. amíg a php. hogy van egy teherautód. } return($x). $v) = each ($weights) } { $x += $v. Hogyan számolod ki az elszállítandó teljes súlyt? Kezdd az alábbi egyszerű függvénnyel. A következő példában egy egydimenziós függvény korlátlan dimenziók kezelésére való kiterjesztését láthatod: function add_weights($weights) { $x = 0. Ha csak egy kis gépelési hibát is ejtesz a kód írásakor.

4. fejezet Bankkártyák Gyors megoldások Adatok hash-elése mhash() mhashgethash _name() mhash_get_block_size() mhash_count() mhash_keygen_s2k() oldal: 122 122 124 124 125 125 .

A te dolgod a weboldaladat láthatóan biztonságosabbá és megbízhatóbbá tenni a versenytársaid honlapjainál. Egy nap egy hasonló kinézésű honlapról vettem egy mobiltelefonhoz való akkumulátort. Más weboldalak tovább rontanak a helyzeten azzal. Ezen a cégen keresztül nem fogok vásárolni. és megadtam a hitelkártyaszámomat. csak olyat veszek meg. gyümölcsöt szállítasz. mert nem bízom meg abban. és az újabb online-aukciók üzemeltetőinek nagyon nehéz lesz meggyőzni engem az aukciós weboldaluk biztonságáról. hogy a weboldalak azért vannak. hogy megtévesztőén mutatják be az árut azáltal. mint kellett volna. mint az a linkelt oldalon látható volt. hogy soha nem fogok olyan aukcióra menni. de a régire terheltek. a valós világból vett problémákat: 1. hogy kerüljék el ezeket a weboldalakat. ami raktáron van. kretének. Ha zöldséget. és mikor van a következő szállítás. majd panaszkodnak. ahol van automatikus licit. Vásároltam bort egy online-aukción. így telefonon rendeltem. vagy csak gonoszak vol tak. a vevő otthon lesz a kézbesítésnél. ez még akkor is bekapcsolódik. hogy a szállító nagy és megbízható. így aztán nem fogok olyan online-aukción vásárolni. ahogy a számlázást lebonyolítják.4. Egy házhoz szállító cég csak egyszer kéri el a hitelkártyaszámot. Fontold meg az alábbi. hogy gyor sabban kézbesítsék az árut. hányat hívtak vissza. 2. hogy egy linkkel a gyártó honlapjára mutatnak. Más vásárlók a szállítási feltételek és kikötések elolvasása nélkül megadják ezt. Amikor valami sürgősen kell. 3. hogy az automatikus licitemelő funk ció segítségével az eladónak a lehető legmagasabb árat biztosítsák. A bizalomra nem méltó szállító 104 . amikor egy nem várt tétel bukkan fel a számlakivonaton. hogy az automatikus bid bekapcsolódott. hogy többet fizettem. de más terméket vagy más felszereltséggel szállítanak. Volt egy kis probléma az online rendeléssel. A paranoiásoknak jó okuk van azt hinni. és hogy szólni fogok másoknak. hogy a fejlesztők figyelmetlenek. Visszavontam a régi kártyaszámom és megadtam az újat. aki egyszer már ráfázott az online vásárlásra. ha egy weboldalon a hitelkártyaszámát kérik. A vége az lett. hogy megkopasszák a vásárlókat. Az oldal azt sugallta. őrülten kapzsiak. Ez a számlakivonat egy hónappal későbbi érkezéséig nem derült ki. Majd a fejlesztők alapértelmezésben beállították az automatikus emelést. fejezet Bankkártyák Áttekintés Némely vásárló paranoiássá válik attól. így nagyon nehézzé teszi a kártyaszám megváltoztatását. majd mindig azt ter heli. és hogy a cégnek nincs raktára. Mi ment rosszul az onlineaukción? A weboldalt a fejlesztői úgy építették. viszont ugyanezt a számot bármiféle óvintézkedés nélkül nyugodt körülmények között beolvassa a telefonba. Olyan szállítótól veszem a lemezmeghajtóimat és más tételeket. Pár hét várakozás és jó néhány telefon után kiderült. de a licitem több mint kétszeresével terhelték meg a számlámat. Nehéz lesz olyannak bármit is eladnod. így nyugodtan fizethetnek kézbesítéskor. hogy hány van még raktáron belőle. így fontold meg a szállítás utáni fizetést. amely mindenegyes tételnél felsorolja. hogy a cég online értékesítési részlege egy fiatal srác egy telefon mellett. Nem tudom. ahol a kézbesítés előtt kérik a hitel kártyaszámot. ha korábban kikapcsoltuk is. és amikor az oldalt megláto gatjuk.

a rendelés beérkezésekor lefoglalja a kért cikket. 105 . és leküzdheted az online vásárlásban már csalódottak félelmét. visszakérd a pénzed. majd vi tatták a számlakivonatnak ezt az elemét. minimális tranzak ciós költséget és a forgalom után százalékot kell nekik fizetned. ország szerint. és árucikk szerint is. esetleg 35$ -ra is nőhet. akkor a problémáidat csök kentheted azzal. amellyel az ügyintézései akár interneten vagy telefonon keresztül is történhet. aki nagyon olcsón leszállítja neki az akkumulátort. Ha a szállítónak sokszor kell visszatérítenie. Ha elfogadsz online fizetést és a következő napon szállítasz. mert öreg volt. hogy a fizetés jóváírását a szállítás napjára halasztód. nagy ügyfelek pedig akár csak 0. kereskedői bankszámlára van szükséged. és én az első késedelem után lemondtam volna a rendelést. mint egy helyi bank. Egy online értékesítő elmondta.Áttekintés végül is talált valakit. valószínűleg használt vagy bemutató darab. és több da rabot rendelnek. a szállítónak vissza kellett volna térítenie a pénzemet és visszatérítési díjat kellett volna fizet nie. miközben én teljes árat fizettem. a kereskedői díja nőni fog. olvass tovább.2%-ot (ezt hívják kereskedői díjnak. hogy az amerikai pornóoldalak sok országból nem fogadnak el Visa kártyát. Túljut hatsz a szoftveres problémákon. Ha online fo gadta volna el a fizetést. Elfogadhatsz hitelkártyát a rendelésekhez. de csak American Expresst fogad el nemzetközi értékesítés esetén. mint például Sony Walkman. akinek van raktára. Vigyázz. Ezek után csak olyan szállítótól vásáro lok. bár ő nem ad el semmi olyat. mert az American Express nagyobb biztonságot nyújt a hitelkártya-azonosítás terén. aminek több hétbe telt egy akkumulátort találnia. mert számtalanszor előfordult. hogy hitelkártyát fogadj el. és az akkumulátor gyorsan tönkrement. és az árut eredeti csomagolásban szállítja le. A tranzakciós költségek 10 és 20 cent között mozognak. Egy ausztrál bolt hagyományos Visa/MasterCard kereskedői bankszámlát használ a helyi értékesítéshez. A havi díj papír alapú számla esetén körülbelül 10$. Ez a bank számla teszi lehetővé. hogy az emberek feliratkoztak egy hónap nézelődésre. hogy a banktól vagy más cégektől. hogy az értékesítésed volumenéhez a legmegfelelőbb üzletet kössd. Számlanyitási díjat. havi minimumdíjat. és minden lépést alaposan tesztelned kell. Ellenőrizd a részle teket a bankodnál. akik a hitelkártyapanaszokat fel dolgozzák. hogy egy árucikk addigi eladásait megnézhessék az adás-vétel teljesítése előtt. ha kiskereskedelmi oldalad van és egy új vásárló 10 Walkmant rendel. A Visa beje lentette. és a fizetés három hónapig visszavonható. Gondolj csak annak a szállítónak a problémájára. Csak a megfelelő irányba kell haladnod. Csak késedelemmel fizetnek. M Kereskedői bankszámla Ahhoz. amit egy turista venne vakáción. Ha még mindig elég erőt érzel magadban a problémák legyűrésére. A lopott hitelkártyával fizetők gyakran gyorsan újraértékesíthető árukat vesznek. Drága árucikkek kereskedői valamilyen módon nyomon követik az értékesítést. Nyomon követheted vásárló szerint. és nézz jól körül. az ügyfélszolgálat sok problémáján. hogy sok megrendelést kap indonéziai turistahe lyek közeléből. avagy egyszerűen díjnak). Kis ügyfelek forgalmuk 6%-át is kifizethetik. de elektronikus számla esetén.

fejezet Bankkártyák Sok ellenérv van az online fizetés ellen. minden egyes változtatás után futtasd le a Bastille biztonsági utasítássorozatot.bastille-Iinux. semmit nem vesztesz az online fizetéssel. de ez nem zárja ki a hitelkártya-használatot. mire számíthat az weboldaladtól és a számlakivonatától. amelyben a hitelkártyára vonatkozó információkat a webszervered soha nem tárolja el. az SSL Apache-webszerveren való megvalósításáról pedig a www. késleltetheti a szállítást. A problémák egy részét megelőzheted azzal. hogy egy távoli országból esetleg nem fizetnek. Ha egy online zöldséges 1. és a rendelés visszaigazolása miatt felhívhatja a vásárlót.org/) olyan utasítássorozat. A szervert biztonságosan kell tárolnod. gyerekek fognak a szülők kártyáival vásárolni.com. hogy észleld a gyanús megrendeléseket. Ha az oldalad adományokat fogad alapítványok számára. 106 . Ha a webszerveredet akár csak egyszer is megemlíti a sajtó.4. mint az. és a szülők vitatni fogják a számlát.com jelenik meg.openssl. és késleltesd a szállítást.com. Számlázási név Ha az oldalad címe custom-software-delevopment.openssl. Amikor online szoftvert adsz el. Az információt csak átadja a kereskedői bankszámla szolgáltatónak. Biztonság A tranzakcióknál a minimális biztonsági elvárás a 128 bites Secure Socket Layer (SSL). akkor a nevedet vádak és hitelkártya-veszteségekre vonatkozó utalások lengik majd körül. hogy az új megrendelők szállítását addig késlelteted. hisz nem tudja. A tanulság az. nehogy a hitelkártyára vonatkozó információkat ellopják. Hozzáadhatsz egy kódot. mi az a internationalservices. az azonnali értékesítés lehetősége fontosabb. Az SSL-ről további információt a nyílt forráskódú SSL-weboldalon (www. Egyes kereskedői bankszámla szolgáltatók olyan jóváírási rendszert használnak. Szerver Ha a webszervered RedHat vagy Mandrake Linux. Gyerekek Ha az oldalad vonzza a gyerekeket. hogy a vevőnek tudnia kell. nagyobb megrendeléseknél például felhívhatod a vevőt. A többi operációs rendszer esetén találd meg az ezzel ekvivalens programot.org/). A Bastille (www. és hogy kérd a kereskedői számládat vezető pénzintézet segítségét a problémák megelőzéséhez. néhány vevő vitatni fogja a számlát.000$ értékű chipszről és kóláról kap megrendelést. hogy a problémák felderítéséhez az értékesítést nyomon kell követned. azonban a webszervereden jelentkező rést a tömegtájékoztatás nem fogja ártalmatlannak minősíteni. viszont a vevő számlakivonatán a internationalservices.org/ címen találsz. hogy a rendelést ellenőrizd. amíg nem ellenőrizted őket.

hogy a betörő átvegye a teljes szerver felett az irányítást.az eredeti érték meghatározható a hash-értékből — ezek azonban a legtöbb egyirányú . hogy egyetlen támadás is elérné a lokális hálózatomat és szerveremet. és beépített biztonsági beállításai miatt sokan i nkább a freeBSD-rendszert választják. hogy minden második másodpercben támadást intézzen a hálózatom ellen. de a router tűzfala a támadó csomagokat visszadobja anélk ül. hogy az adatokat visszaigazold anélkül. tehát nem tudod vissza-hash-elni az eredeti információt. akkor az operációs rendszernek kell megakadályoznia. Az adatbázisod a sós tócsnira vonatkozó recepteket a 129 -es rekordban tárolja. ezek olyan különböző értékeket számítanak ki. amelyek veszélyeztetik a biztonságot. Ezek közül némelyik kétirányú . nem pedig titkosításra használják. A hash-ek általában egyirányúak.Áttekintés amely végigfut a webszervereden és az operációs rendszereden kikapcsolja azokat az opció kat. Az általad használt hash típusa a követelményektől függ. Ugyanakkor a hash-nek a számítástechnikában speciális jelentései vannak. az egészségesebb változatot pedig a 19-es rekordban. Az mhash_függvények működését a Gyors megoldások „Adatok hash-elése" része mutatja be. amit akkor csinálok. A kriptográfiában és más területeken különböző hash-számítási módokat használnak. Amikor valaki olyan recepteket keres. A CRC-ket arra tervezték. hogy a hash értéke 19 és az adatbázisban való keresés nélkül előveheted a 19 -es rekordot. amelyeket kissé pontatlanul hash-értékeknek fogunk nevezni. Hash-elés A zagyvalék (hash) az. amelyekben burgonya. és ezek közül nem mindegyik jelenti azt. A hash-ek lehetőséget adnak neked arra. A Linux egyes változatai a biztonság magasabb fokát biztosítják alapértelmezésben. és a 9 jelzi a sütést mint a főzés egy módját. hogy a kódom arra a sorsra jut. hogy egy fájl vagy rekord mindegyik bitjét ellenőrizzed.az eredeti érték nem határozható meg a hash-értékbŐl. rendszerint szám. mint a főztöm. a hálózati routeremen a fények villognak code -red-támadásokat jelezve. ugyanakkor a sómentes tócsni vegyítése 19 lenne. Ha valaki a webszervereden keresztül betör. és a code-red hármas verziója már elég HS-szerveren megtalálható ahhoz. Ekkor a tócsni (hagymás burgonya olajban sütve. Ha az adatbázisod recepteket tartalmaz. sütés. rendszerint sózott) hash-száma 129 lesz. amely valamely sztringből jön létre. A féreg véletlenül választott IP-címeket támad meg. és hosszú sztringeknek rö vid számsorozattal való azonosítására lehet használni. ha a főzés során az étel katasztrofálisan sikerül. ugyanakkor más hash-értékek esetleg csak a sztring első részét használják. tehát felhasználható egy fájlnak ezrek közül történő azonosí - 107 . akkor azonnal kiszámol hatod. fejezet ír le) 4 milliárd értéket tárolhat. A hash-eket ellenőrzésre és visszaigazolásra. hogy az adat két tel jes másolatát küldd el. A code-red-féreg a Microsoft IIS rendszerét támadja meg és az HS-szervereket használja támaszpontként más szerverek megtámadásához. A webszerver-szoftvered az első védelmi vonalad. só nélkül a fő jellemzők. Miközben gépelek. 2 a só helyett. akkor a hash-t a többi hozzávalók alapján is elkészítheted. A hash olyan kód. A PHP-ban mhash_-függvények állnak rendelkezésre. A CRC32 (amt a 8. A webszerverre tűzfalat is telepíthetsz a szerver ellen intézett támadások bizonyos típusai nak kiszűrésére. például 1 a burgonya helyett.

• A CRC32 egy 32 bites Ciklikus Redundancia Ellenőrzés. és lemezen való tárolására. Antoon Bosselaers és Bárt Preneel terveztek. MHASHTIGER160 és MHASH_TIGER128-ként van definiálva. Ez igazából elavult. Az mhash-ben ez az algoritmus MHASH_TIGER192. Többféle hosszúságú értéket enged meg. állítólag nagyon gyors 64 bites számítógépeken. A mhash a MHASH_SHA1-algoritmust hívja meg. te hát nem kell dekódolni az MD5-öt. viszont azok valójában 32 bi tes előjel nélküli egész számok. Használd inkább az MD5-öt.nist. hogy elmenti a jelszót MD5-verzióban. vissza kell a jelszót állítanod alapbeállításra. amely 49 000 hasonló méretű és tartalmú fájlt tartalmaz. MHASH_HAVAL192 és MHASH_HAVAL160. fejezet Bankkártyák tására. MHASHHAVAL224. Az MD5 nem titkosító. A RIPEMD-et az EU RIPE projektjének részeként fejlesztették ki. • GOST . amit Hans Dobbertin. 108 . MD5 és a RIPEMD 160 bites helyettesítője. • Az MD5 algoritmust Ron Rivest találta fel az RSA-nál.html).A Tiger. például egy jelszót rejteni. • Tiger . • RIPEMD-160 . • SHAl — A SHA-algoritmust az NIST (Országos Szabvány. és az mhash-ben definiálja. mert 32 bites előjeles egész számoknak tekinti őket.és Technológiai Intézet [www.A GOST az 256 bites orosz digitális aláírási szabvány. amit Eli Biham és Ross Anderson terveztek. ami elbukott. A webszervereden tényleg a jó idő van beállítva? • HAVAL . olyan hősies próbál kozásra. majd a vásárlónak kell megváltoztatnia. Az MD5 úgy működik. hogy a helyes értéket kapd meg. majd később elő akarod venni. és az RFC 1321-ben le van ír va (www. és 1 másodpercet téved 20 millió év alatt. és fájlokat (például a ZIP fájlokat) ellen őriz. amely a lemez hibáját deríti fel. akkor 4 milliárdot kell hozzáadnod. akkor a hash helyett titkosításra van szükséged. A mhash_-függvény támogatja MHASH_CRC32-t (Etherneten használják) és a MHASH_CRC32B-t (ZlP-fájlokra használják). amikor hálózaton továbbítanak adatot. (Nekem olyan könyvtáram van. Az MD5-öt használják a jelszó verziójának átadásá ra a böngészőből a szervernek. Az mhash ezt az algo ritmust MHASH_GOST-nak hívja.A HAVAL az MD5 változata. akkor azt te sem tudod neki megmondani.4. Megjegyzés: Egy érdekes történet: a NIST-F1.faqs/rfcs/rfcl321. Az mhash ezt MAHSHRIPEMD160 algoritmusnak hívja. hogy ellenőrizze a jelszót. és összehasonlítja az MD5-értékeket. A CRC32 értékek megjeleníthetők hexadecimális és egész számként is. mert a NIST új merkúrium alapú órája 1 kvadrilliót rezed másodpercenként és 1 másodpercet téved 20 000 millió év alatt. a NIST egyik cézium alapú órája másodpercenként 9 billiót rezeg. Ha a PHP negatív előjelű egész számot jelenít meg. és mégis mindegyiknek egyedi CRC-száma van. mint a titkosítás Apolló-13-jára. és nem lehet megszerezni a jelszavakat az MD5től. A PHP néha szétvagdalja az egész szám változa tot. majd átalakítja a bejövő jelszavakat MD5-be. Ha egy vásárló elfelejti a jelszavát. • MD4 .org/]) használja a Digitális Aláírás Szabványaként.Az MD4-re tekints úgy.) Ha el akarsz egy sztringet.A RIPEMD-160 az MD4. mint MHASH_HAVAL256.

aki akár egy cégnél. Valami olyanra van szükséged.x. Ha az azonosító hibás. hogy törvényes kutatást vé gez a cég megbízásából.gz-fájlt az ftp://mcrypt. akár egy egyetemen pár ezer hálózatba kötött géphez is hozzáfér. hogy fel akarja törni a helyi bank jelszavát vagy egy koncertjegyeket árusító oldalt.6 Win32 bináris állományai nem tartalmazzák a php_mcrypt. 3WAY. 3. mcrypt-függvények A következő rész néhány példával illusztrálva sorolja fel az mcrypt_-függvényeket. IDEA.hellug. Viszont a titkosítás megfelelő megvalósítása a weboldaladon az már művészet. A hacker mondhatja azt. RIJNDAEL. a függvény hamisat ad vissza. hogy elkerüld a jogosultságból fakadó problémákat. mégis feltörhetetlen még egy olyan hackernek is.hellug. TWOFISH. Kövesd a telepítési utasításokat. Unix Ha Unix alatt installálod: 1.gr/ oldalról kéri le az mcrypt-szoftvert. DES. MARS. LOKI97. A példa eredménye: DES 109 . hogy egy gazdaságos webszerveren is elfogadható időn belül lehet elvégezni a titkosítást.tar. CAST. Fordítsd be a libmcrypt-et a következő opcióval: — dísable-posix-threads. SAFER. Superuserként konfiguráld a libmcrypt-et. ami használható abból a szempontból. 2. így lehetővé teszi a BLOWFISH. amely a http://mcrypt. GOST. A PHP tartalmazza az mcrypt-függvényt.gr/pub/mcrypt/libmcrypt/ oldalról. de nem említi. hogy egy titkosítás működik-e vagy sem. mcrypt_get_cipher_name() A titkosító algoritmus (cipher) nevét az alábbi kód használatával kaphatod meg egy algorit mus azonosítójából.Áttekintés Titkosítás A titkosítás félig tudomány. 1 Az mcrypt telepítése Az mcrypt installálásához kövesd az alábbi lépéseket. print("<br>" . Remélem. RC6. r 4. Töltsd le a libmcrypt-x. RC2. Fordítsd be a PHP-t a következő opcióval: —with-mcrypt. SERPENT. mcrypt_get_cipher_name(MCRYPT_DES)) . A tudomány ellenőrzi. egy későbbi kiadása már tartalmazni fogja.dll-t. ARCFOUR és WAKE titkosító algoritmusok használatát. I Windows és NT A PHP 4. TripleDES.0. félig művészet.

vagy az MCRYPT_BLOWFISH előre 110 . hogy megtalálja a könyvtárban található összes titkosító algoritmust. és STREAM-et (A PHP jelenleg még nem támogatja a stream módot). amelyet más függvények használnak. elektronikus kódkönyv). ECB-t (electronic codebook. while (üst ( $ k . hogy a megadott könyvtárban lévő összes módozatot felleld. CFB-t (cipher feedback. $v). titkosító algoritmus blokk láncolás). amit akarsz. További könyvtárnevet is megadhatsz. mcrypt_get_block_size(MCRYPT_DES. hogy az aktuális könyvtárban megvan-e az a módozat. és nem stream-ek vagy más bonyolultabb dolgokét. cbc) ) . amely a speciális titkosító eljárást megvalósítja. hogy olyan dolgokat beállíthass. mcrypt_list_modes() Ez a függvény felsorolja az mcrypt könyvtárban fellelhető összes módozatot. OFB-t (output feedback with 8bit data. mcrypt_get_block_size () Ez a program megmondja egy adott algoritmus blokkméretét. titkosító algoritmus visszacsatolás). mcrypt_get_key_size() A mcrypt_get_key_sizeQ-parancsot használd. $v) = each ($modes) ) ( print("<br>" . $v). Ezt az mcrypt_create_iv(). A modulnév annak a modulnak a neve. nOFB-t (output feedback with nbit data.cbc) ) . A Blowfisf -algoritmus modulja mint a "blowfish"-sztring is bevihető. A titkosítási módozatok tartalmazzák a CBC-t (cipher block chaining. mcrypt_module_open() Az mcrypt_module_open() használat céljából megnyit egy titkosító modult. Az alábbi kód felsorolja az mcrypt_list_modes() által visszaadott módokat: Smodes = mcrypt list_modes(). így megnézhe ted. output visszacsatolás nbites adattal). while (üst ($k. fejezet Bankkártyák mcrypt_list_algorithms() Az alábbi kód felsorolja az mcrypt könyvtárban található összes titkosító algoritmust. Megadhatsz egy opcionális könyvtárnevet. output visszacsatolás 8 bites adattal).vagy a titkosító és a visszafejtő függvény előtt le kell futtatni. $v) = each ( $array) ) í print("<br>" . így a blokkméretre csak azért van szükséged. A PHP jelenleg sztringek titkosítását támogatja. ha egy speciális titkosító eljárás kulcsának méretére van szükséged: print ("<br>" .4. mint például a tábláz atok mezőméretei: print("<br>" . Az eredmény olyan forrásazonosító lesz. íarray = mcrypt_üst_algorithms () . mcrypt_get_key_size(MCRYPT_DES.

a php. Az opcionális ötödik paraméter egy IV lehet. vagy az MCRYPT_DEV_URANDOM. Az első paraméter az mcrypt_get_block_size()-parancs által visszaadott blokkméret. "/usr/lib/mcrypt-modes") . A következő paraméter a titkosítandó vagy visszafejtendő adat. kihagyható._ 5iv) . amelyet a file()-utasítás segítségével sztringbe olvastál be. ha a kulcs-sztring hosszú. amely a /dev/urandom-ból. amelyet az mcrypt_create_iv() ad át.ini mcrypt. cbc)}. a kulcsot nem mutatja a példa. amely vagy sztring vagy pedig egy fájl. "".algorithms_dir paramétere által kijelölt könyvtárban vannak. MCRYPT_MODE_CBC. Add meg az IV méretét és az IV-hez felhasználandó véletlen forrását mint alább: srand {(double) microtime() * 1 0 0 0 0 0 0 ) . valamint a CBC módot használja. titkosítás vagy visszafejtés. A következő példa megnyitja a DES-t. amely a /dev/random-ból olvas be adatot. a második a kulcs. ugyanakkor más eljárások csak korlátozott sztringhosszúságot használnak. akkor bezárhatod a modult az mcrypt_module_close() vagy mcrypt_generic_end() alkalmazásával. Az mcrypt_creat_Ív() első paramétere a CBC számára az mcrypt_get_block_size() által visszaadott blokkméret kell hogy legyen. $iv = mcrypt_create_iv(32. A második paraméter lehet az MCRYPT_DEV_RANDOM.im-ben alapértelmezésként beállított könyvtárat. fejezetben mutattam be). mcrypt_cbc() A mcrypt_cbc() a titkosító algoritmus blokk láncolás módszer szerint tikosít. Ha már nyitva van. Mivel a kulcs titkos kell legyen. Alapértelmezésben ez az /usr/local/lib/libmcrypt. 111 . A mcrypt_create_iv() létrehozza ezt.Áttekintés definiált név használatával. A modulok a php. Az MCRYPT_RAND előtt használd az srandQ-parancsot (amelyet a 2. amely fájlok esetén megfelelő: $key = "Do not teli anyone the contents of this string". Az első paraméter a titkosító. mcrypt_get_iv_size() A mcrypt_get_iv_size() az algoritmushoz tartozó IV méretét nyeri ki: print ("<br>" . MCRYPT_ENCRYPT. $string = mcrypt_cbc(MCRYPT_DES. és a CBC -t az /usr/lib/mcrypt-modes könyvtárból veszi: $cipher = mcrypt_module_open(MCRYPT_DES. MCRYPT_RAND). Az mcrypt_module_close() nincsen a jelenlegi dokumentációban. mcrypt_createjv() A titkosítás valamilyen formájának megkezdése előtt egy inicializáló vektorra (IV) van szükséged. mcrypt_get_iv_size(MCRYPT_DES. $file_or_string. Némely eljárás erősebb lesz. A negyedik paraméter a mód. A kulcsnak a titkosítóhoz kell alkalmazkodnia. $key.

mint mcrypt_encrypt(). amelyet az mcrypt_module_open() ad vissza. A következő pé lda egy sztringet titkosít: $string = mcrypt_encrypt(MCRYPT_DES. $key. Ha hiba adódik. * $key. és output visszacsatolás módban titkosít. Az opcionális ötödik paraméter IV értéket szolgáltat azon eljárások számára. $key. $key. MCRYPT_DECRYPT). fejezet Bankkártyák mcrypt_cfb() A mcrypt_cfb() ugyanazokat a paramétereket fogadja el. MCRYPT_MODE_CBC) . és a negyedik paraméter által megadott módban titkosít. A következő példa visszafejt egy sztringet: $string = mcrypt_decrypt(MCRYPT_DES. $file_or_string. $key. mcrypt_ofb() A mcrypt_ofb() ugyanazokat a paramétereket fogadja el. $file_or_string. amelyek igénylik. így például kulcsok esetén. és visszafejt a negyedik paraméter által jelzett mód szerint. mcrypt_decrypt() A mcrypt_decrypt() ugyanazokat a paramétereket fogadja el. Ez egy kulcs és egy IV A függvény a titkosításhoz használt összes puffért inicializálja. $file_or_string. mint az mcrypt_cbc(). $file_or_string. mcrypt_encrypt() A mcrypt_encrypt{) majdnem ugyanazokat a paramétereket fogadja eí. mint mcrypt_cbc(). A titkosító algoritmus visszacsatolás módban titkosít. Az opcionális ötödik paraméter IV értéket szolgáltat azon eljárások számára. amely a legjobb választás a bájtonként történő titkosítás esetén. a függvény az -1 értéket adja vissza: $int = racrypt_generic_init($cipher. mint az mcrypt_cbc(). 112 . A következő példa egy sztringet fejt vissza: $string = mcrypt_ecb(MCRYPT_DES. $iv). $key. A következő példa egy sztringet titkosít: $string = mcrypt_ofb(MCRYPT_DES. MCRYPT_DECRYPT). MCRYPT_MODE_CBC) . és elektronikus kódkönyv módban titkosít. amely a legjobb választás rövid sztringek. Ez egy 8 bites eljárás. amely nem biztonságos és nem java solt. amelyek igénylik. A következő példa egy sztringet fejt vissza: $string = mcrypt_cfb(MCRYPT_DES. $file_or_string. mint mcrypt_cbc(). MCRYPT_ENCRYPT). mcryptjgeneric_init() A mcrypt_generic_init() a titkosító eljárás forrásazonosítóját fogadja el.4. mcrypt_ecb() A mcrypt_ecb() ugyanazokat a paramétereket fogadja el.

(Dynamic Shared Object. mcrypt_generic_end() A mcrypt_generic_end() bezárja az mcrypt_generic_init() által megnyitott puffereket és az mcrypt_module_open{) által megnyitott modult. } Ha ezt a tesztet használod. ha az eljárás működik a blokk algoritmussal. akkor 0-t. és egy titkosítandó sztringet. hogy bármit titkosítottál volna. Az mcrypt_generic_init()-parancsot az mcrypt_generic() meghívása előtt kell kiadni: $string = mdecrypt_generic($cipher. if(mcrypt_enc_is_block_algorithm_mode($cipher)) { print("<br>mode is for block algorithms. mcrypt_enc_is_block_algorithm_mode() A mcrypt_enc_is_block_algorithm_mode() az aktuális módon futtat le tesztet. ha az eredmény megfelelő. A mcrypt_generic() titkosított sztringet adja vissza. akkor 1-et: LÍ (mcrypt_enc_self_test($cipher)) { print("<br>module failed. Dinamikus Megosztott Objektum) modulként nem.0. és 0 értéket ad vissza. } else 113 . mcrypt_enc_self_test() A mcrypt_enc_self_test() tesztet futtat le az mcrypt_module_open() által megnyitott modulon. mdecrypt_generic() A mdecrypt_generic() a titkosító forrás azonosítóját fogadja el."). azonban Apache/Unix DSO.Áttekintés mcrypt_generic() A mcrypt_generic() a titkosító eljárás forrásazonosítóját fogadja el. $encrypted). 1 értéket ad vissza."). akkor azelőtt használd. $string) . amelyet az mcrypt_module_open() ad át. A PHP 4.6 verziójában. Az mcrypt_generic_init()-parancsot az mcrypt_generic() meghívása előtt kell kiadni: Sencrypted = mcrypt_generic($cipher. A mdecrypt_generic() visszafejtett sztringet adja vissza. és egy titkosított sztringet. amelyet az mcrypt_module_open() ad vissza. if(!mcrypt_generic_end($cipher)) { print("<br>mcrypt_generic_end() failed. az mcrypt_enc_self_test() CGI-modulként és hagyományos Apachemodulként működött. ha pedig a modul nem megy át a teszten. ha pedig a mód streamekre alkalmas.").

fejezet Bankkártyák print("<br>mode is for stream algorithms. else print("<br>stream algorithm. mcrypt_enc_get_key_size () A mcrypt_enc_get_key_size() a megnyitási mód által használt kulcs maximális méretét adja vissza. amelyek változó méretű kulcsot támogatnak. 0 értéket. mcrypt_enc_get_supported_key_sizes() A mcrypt_enc_get_supported_key_sizes() az aktuális algoritmus által elfogadott kulcsméreteket tartalmazó tömböt adja vissza. akkor 1-től a maximális méretig minden kulcsméret elfogadott. if(mcrypt enc is block_algorithm($cipher)) print("<br>block algorithm. Azon módok esetében. Ha a tömb üres. ha a mód blokkokat ad vissza. ha bájtfolyamot. és 1 értéket eredményez. } print("<br>mode print("<br>mode mcrypt_enc_get_block_size() A mcrypt_enc_get_block_size() a megnyitott algoritmusban használt blokkméretet adja vissza: $size = mcrypt enc_get_block size($cipher)."). 0 értéket.4. és 1 értéket ad vissza. ha ez a lista létezik: 114 . A következő kód a kulcsméretek listáját nyomtatja ki. mcrypt_enc_is_block_algorithm() A mcrypt_enc_is_block_algorithm() az aktuális algoritmuson futtat le tesztet. tetszőleges.")."). ha az algoritmus blokkokkal dolgozik. if(mcrypt_enc is_block_mode($cipher)) is for is blocks."). ha az algoritmus streamekre alkalmas. m cryp t_e n cjs_b lo ck_mode () A mcrypt_enc_is_block_mode() lefuttat egy tesztet a megnyitási módon. a maximálisnál nem nagyobb kulcsméret elfogadható: $size = mcrypt enc get_key size ($cipher)."). else for streams.

és igaz értéket ad vissza sikeres.I I Áttekintés $size = mcrypt enc get supported_key_sizes($cipher). $module . " ) . while( l i s t ( $ k . és 1 értéket ad vissza. ha a modul stream algoritmus-móddal dolgozik. Az opcionális második paraméter a modult tartalmazó könyvtár nevét fogadja el: i f ( ! m c r yp t _ m o d u l e _s e l f _ t e s t ( $m o d u l e ) ) { print("<br>module " ."). } else { print ( "<br>stream algorithm modes. ha a modul blokk-algoritmussal dolgozik. mcrypt_module_is_block_algorithm() A mcrypt_module_is_block_algorithm() a megadott eljáráson futtat le tesztet. és 1 értéket ad vissza. Ha a függvény nulla értéket ad vissza. ha az eljárás blokkokkal dolgozik. mcrypt_enc_get_algorithms_name() A mcrypt_enc_get_algorithms_name() az aktuális eljárás nevét adja vissza: $name = mcrypt_enc_get_algorithms_name($cipher) . hamis értéket sikertelen teszt esetén. mcrypt_module_is_block_algorithm_mode () A mcrypt_module_is_block_algorithrn_mode() a megadott modulon futtat le tesztet. mcrypt_module_self_test() A mcrypt_module_self_test() egy modult tesztel. $v). mcrypt_enc_get_modes_name() A mcrypt_enc_get_modes_name() a megnyitási mód nevét adja vissza: $name = mcrypt_enc_get_modes_name($cipher) . Az opcionális második paraméter a modult tartalmazó könyvtár nevét fogadja el: if(mcrypt_module is block_algorithm_mode($module)) { print ("<br>block algorithm modes. mcrypt_enc_get_iv_size () A mcrypt_enc_get_iv_size() az aktuális eljárás IV-je méretét adja vissza."). 0 értéket. akkor az eljárás nem használ IV-t: $size = mcrypt_enc_get_iv_size($cipher) . vagy 0 értéket. $v) = each($size)) { print("<br>" . " f a i l e d . ha az eljárás streamekkel 115 .

4. while {üst ( $ k . Az opcionális második paraméter a modult tartalmazó könyvtár nevét fogadja el: if{mcrypt_module_is_block_mode($module)) print("<br>block. $size = mcrypt_module_get_algo_key_size($module). $v). fejezet Bankkártyák : : dolgozik. Ha a tömb üres.0. Az opcionális második paraméter az eljárást tartalmazó könyvtár nevét fogadja el. mcrypt_module_is_block_mode() A mcrypt_module_is_block_mode() a megadott modulon tesztet futtat le. mcrypt_module_get_algo_block_size() A mcrypt_module_get_algo_block_size() a megadott eljárás által használt blokk méretét adja vissza. 116 ."). else print ("<br>byte. és 1 értéket ad vissza. } ' . Az opcionális második paraméter az eljárást tartalmazó könyvtár nevét fogadja el. ha a modul blokkokat."). ha a modul bájtokat ad vissza. mcrypt_module_get_algo_supported_key_sizes() A mcrypt_module_get_algo_supported_key_sizes() a PHP 4. else print("<br>stream. $v) = each(Ssíze) ) { print("<br>" . A következő kód a kulcsméretek listáját nyomtatja ki."). mcrypt_module_get_algo_key_size() A mcrypt_module_get_algo_key_size() a megadott eljárás által támogatott maximális kulcsméretet adja vissza. akkor 1-től a maximális méretig minden kulcsméret elfogadott.6 utáni verziók által tartalmazott új függvény lesz majd. Az opcionális második paraméter az eljárást tartalmazó könyvtár nevét fogadja el: $size = mcrypt modulé get algo block size(Smodule). 0 értéket. Az opcionális második paraméter az eljárásmodult tartalmazó könyvtár nevét fogadja el: if(mcrypt_module_is_block_algorithm($module)) print("<br>block."). amely a megadott eljárás által elfogadott kulcsméretek tömbjét adja vissza. ha ilyen lista létezik: $size = mcrypt_module_get_algo_supported_key_sizes($module).

az internet-szolgáltatód vagy harmadik fél. Könnyebbé teheted az életedet. A c:/Program Files/php/extensions könyvtárból másold át a php_cybercash. Változtass meg egy sort a c:/wínnt/php. Az üzenet formátumával kapcsolatban olvasd el a CyberCash dokumentációját. szükséged lesz egy szoftverre. Az fopen() a tranzakció eredményét adja vissza. CyberCash A CyberCash jelenleg a VeriSign tulajdonában van (www.com/). Az fopen() leírása a 8.cybercash.firstdata. miért is akarnál tehát velük üzletelni?) A CyberCash Unix alá való installálásához fordítsd be a PHP-t a — with-cybercash-sel. majd letöltőd a Nathan Cassano's CyberClasst a www. és a CyberCash szoftvert eladták a First Data Merchant Services-nek (www. Lehet például egy sztring. hanem JSB-t használ. kereskedői azonosítót és titkosító kulcsot kapsz. 2. A Windows más verzióiban a c:/winnt/system32 helyett a c:/windows/system -be másold. Indítsd újra a webszerveredet (ha a PHP modulként fut).com). A CyberCash Windows NT4 vagy Windows 2000 alatti telepítéséhez az alábbiakat kell ten ned: 1.txt oldalról.dll-re. jelszót. cybercash_encr() A cybercash_encr() háromszoros DES titkosítást használ. illetve egy CGI parancsállománnyal. titkosítsd az üzenetet a CyberCash számára a cybercash_encr() használatával. amelynek segítségével a kereskedői számlád szolgáltatójával kommunikálhatsz.ini-ben a . majd egy felhasználói azonosítót.dll -t a c:/winnt/system32-be. fejezetben utánanézel a objektumoknak. fejezetben található. kódold a titkosított üzenetet a cybercash_base64_encode()-dal. A Payflow a CyberCash egy alternatívája. tehát ugyanazé a cégé. ha a 17. Ezt a szoftvert adhatja a kereskedelmi számlád szolgáltatója.dll-ről extension = php_cybercash. Itt van néhány ezek közül. A CyberCash dokumentációja a www. A session-kulcs egy session-önként egyedire állítható azonosító.com/~nathan/ /class. A CyberCash használatához a CyberCash weboldalán regisztrálnod kell magad.cyberclass. mint a CyberCash. amelyeket a PHP függvényei közvetlenül támogatnak. A Payflow is a VeriSign tulajdonában van. 3.extension = php_cybercash. Ha egy fize tést fel akarsz dolgozni. és a cybercash_decr()-tel kell visszafejtened. vagy a forráskódját kicserélik a Payflow-ra.com/cashregister/support/docs/ oldalon található.cjhunter. (A First Data weboldala nem PHP-t. majd küld az üzenetet a CyberCash-nek az fopen()-nel. majd a cybercash_base64_decode()-dal dekódolnod.Áttekintés Elektronikus fizetési szoftverek Ha belevágsz az online fizetés lebonyolításába. így valószínűleg a CyberCash meg fog szűnni. A kereskedői kulcs a kereskedői azonosítóval fog megérkezni.verisign. ami a session azonosítóját és az aktuális dátumot tartalmazza: 117 1 . Az eredményt fel kell osztanod.

fejezetben található. cybercash_base64_decode() A cybercash_base64_decode() dekódolja a base64 kódolt üzeneteket: $output = cybercash_base64_decode($result_output).) A következő kód egy példát mutat be (az URL meg fog változni. meg kell adnod az URL-t az fopen()-nel a CyberCash-nél lévő CGl-parancsfájlnak. cybercash_base64_encode($encrypted["macbuff" ] ) . $output) . cybercash_base64_encode() A cybercash_base64_encode()az URL-be való foglalásra kódolja a titkosított üzenetet: $outbuff $macbuff = = cybercash_base64_encode($encrypted["outbuff" ] ) . $decrypted["macbuff"]). $session_key. "<br>mac buffer: " . majd a végeredményt a dekódolás ba kell táplálnod.4. "<br>output length: " . (Az fopen() leírása a 8. $decrypted["outbuff"] . $encrypted["outLth"] . cybercash_decr() A cybercash_decr()a kereskedői és session-kulcsok segítségével visszafejti a CyberCash-től kapott üzeneteket: $decrypted = cybercash_decr($merchant key.cybercash. fopenQ A cybercash_base64_encode() és a cybercash_base64_decode() között a kódolt sztringet egy URL-be kell beépítened. if($decrypted["errcode"] === falsé) { $session key. } else { print("<br>error code: " . print ("<br>output buffer: " . $encrypted["errcode"]).com/cgi-bin/". fel kell darabolnod az eredményeket. } else { print("<br>error code: " . ahogy a VenSign újracímkézi a CyberCash termékeket): $file = fopen("http://cr. Szükség lesz hibaellenőrzésre és a a hálózati időtúllépés kezelésére alkalmas kódra. " " . fejezet Bankkártyák $session_key = session_id() . $mac = cybercash base64_decode($result mac). "r"). 118 . date("Y-m-d H:i:s"). $encrypted["outbuff"] . $encrypted = cybercash_encr($merchant_key. $rnessage) if ($encrypted["errcode"] === falsé) { print("<br>output buffer: " . $decrypted["errcode"]). $encrypted["macbuff" ] ) . "<br>mac buffer: " .

Az első paraméter mindenképpen szükséges. 1 6 8 . A Payflow mintha hiányozna a PHP 4. és a VeriSign-tól töltsd le a szoftverfejlesztő csomagot (SDK) (először regisztráltatnod kell magad a VeriSign-nál). $sslproxy_logon. $sslproxy_host = " 1 9 2 . $server.verisign. $port = 44 3."). hogy figyelmeztesse a rendszergazdádat. pfproJnitQ A Payflow-folyamatot a pfpro_init() indítja el. "ACCT" => "1234123412341234". $port. A következő kód egy tranzakciót dolgoz fel. pfpro_version() A pfpro_version()a Payflow-könyvtár verziószámát adja vissza.95. a többi opcionális. és a print_r()-rel kinyomtatja az eredményt: $test = arrayC'USER" => "fredsmith". a következő Payflow-függvény automatikusan elindítja a folyamatot: pfpro_init(). "TRXTYPE" => "S".0.Áttekintés Payflow A VeriSign (www. } else { print("<br>pfpro_process() failed. a hitelkártya-elszámolást is beleértve. és tömbként adja vissza az eredményt. $timeout = 30. $timeout. és arra használható. i pfpro_process() A pfpro_process() feldolgozza a tranzakciót. $sslproxy_logon = "securetran". $sslproxy_password)) { pr in t r( $a rra y) . $server = "test-payflow. "PWD" => " f s l 2 3 " .com/payment) Payflow Pro-ja a pénzügyi tranzakcióknak széles választékát nyújtja. de a szervert úgyis majd nem mindig rneg fogod határozni. A Payflow Unix alatti telepítéséhez fordítsd be a PHP-t a ~with-pfpro-vaí. 3 2 . "EXPDATE" => " 0 9 0 4 " ) . payflow library wrong version. Ha elfelejtenéd ezt a függvényt. $sslproxy_port.verisign. ha megfelelő tesztelés nélkül telepítettek újabb verziót: if (pfpro_version() != " L 2 1 1 " ) { print("<br>Warning.com". $sslproxy_port = 123. $sslproxy_password = "secl23". if ($array = pfpro process($test. "AMT" => 49.6 Win32 bináris állományokból. "TENDER" => "C"."). 119 . 4 5 " . A proxy beállításáról kérdezd meg a rendszergazdát. $sslproxy_host.

Sajnos ez az extra költség nincs a Red Hat honlapján feltüntetve. miközben te épp az előfizetések havi fri ssítését végzed. akkor valószínűleg használhatod a PHP hálózati és titkosítási függvényeit a tetszésed szerinti klíringházzal való kommuniká láshoz. mint a ccvsd. Kanadában és néhány más országban. 4. A CCVS-szoftver a weboldalad és a hitelkártya klíringház között helyezkedik el. A kulcs egy kereskedő egy szerverére szól. A CCVS a Visa 2nd Generation K Formát protokollját használja. 2. Ha nem ismeri.com/products/ /software/ecommerce/ccvs oldalon olvashatsz. A dokumentáció azt sugallja. Mutasson a PHP a — with-ccvs-sel a CCVS könyvtárára. és nézd meg. és a kijövő adat is sztring. hogy a protokollt a modemes csatlakozáshoz írták. Ha elfelejted ezt a függvényt. Indítsd el a ccvsd-folyamatot.redhat. két különbséggel. A Red Hat állítása szerint a CCVS jól együttműködik az olyan valós idejű online klíringek kel. hogy konfigurálhasd a PHP-val való használatot. A pfpro_process()-t könnyebb használni. egyre többe kerül. ők kivel végzik a klíringet. mert a sztring kódolásánál nem fogsz hibát ejteni. fejezet Bankkártyák pfpro_process_ra w() A pfpro_process_raw() ugyanazt csinálja. és hogy kevésbé kifinomult. A Red Hat állítása szerint a CCVS együttműködik a „legtöbb" klíringház protokollal. A hozzáférési kulcs és a fenntartás nem ingyenes. és megbízhatóbb eredményeket ad. hogy a CCVS ismeri-e a megfelelő protokollt. hogy az ügyfeleid új előfizetéseket vásárolhatnak. pfpro_cleanup() A pfpro_cleanup() fejezi be a Payflow-folyamatot. Töltsd le a www. 3. 120 . mint a PHP.4. így ahogy terjeszkedsz. amelyek több batch-fájl átvitelével egyidőben történnek. ccvs A Red Hat Hitelkártya Ellenőrző Rendszerről (CCVS) a www. hogy a PHP-folyamatok ugyanazzal az azonosítóval fussanak.redhat. Ez azt jelenti.com/products/software/ecommerce/ccvs/-rol és telepítsd a CCVS-t. Állítsd be. amelyek az URL kódoláshoz hasonlóan vannak kódolva. Az első megadott paraméter egy sztring az összes kulcsértékkel. Ha a Red Hat nyerővé akarja tenni a termékét. Az ingyen teszt helyett 95$-ért lehetőség van 30 napos kipróbálásra. kinél nyitod a kereskedői számlád. mint a pfpro_process(). és ezt bizonyos hitelkártyaelszámoló-rendszereknél nehéz megcsinálni. akkor jó kis átalakításra van szükség a PHP4-hez. így keresd ezt a helyi bankodnál vagy kereskedői számlaszolgáltatódnál. így nézd meg. A CCVS működik az USA-ban. akkor a következő függvény automatikasan elindítja ezt a folyamatot a parancsállomány végén: pfpro_cleanup(). t CCVS telepítése Unix alatt A CCSV Unix alatti telepítéséhez kövesd az alábbi lépéseket: 1.

Függvények A régi. A RedHat szerint a CCVS megfelel a POSIXnak. amihez van Cygwin is. fejezetben bemutatott PostgreSQL-t a Cvygwin-t használva telepítették a Windows NT alatt. és a Red Hat egyszerűen tudja másolni a PostgreSQL megközelítést. Az 5. működnie kell. •■). így natív Windows NT alatt. vagy olyan Windows NT-vel.Áttekintés Windows és NT A PHP 4.6 Win32 binárisban nincs CCVS. PHP3 CCVS-függvények dokumentációja a www.com/products/software/ /ecommerce/ccvs/support/docs/ProgPHEhtml oldalon található meg.redhat. I 121 .0.

amely az igazi munkát végzi. Mivel a CRC-k 32 bites bináris adatok. $v) = each($data)) { $hash = mhash(MHASH_CRC32. </td>" . &nbsp. while (üst ( $ k . egész. mhashQ Az mhash() több hash-t is előállít. print ("<tr><td>" . A könnyebb összehasonlítás végett a bevitt és a kapott adatok egy táblázatba kerülnek. CRC32 A CRC32 egy normál 32 bites CRC. bin2hex($hashb) .4. "special á é . $hashb = mhash(MHASH_CRC32B. A következő kód végigmegy a teszt adaton. "</tdxtd>Snbsp. $v) .</td>" . i r: 11^ . </tdxtd>CRC32B</tdx/tr>") . "</tdxtd>&nbsp. &nbsp. így a kód a CRC-ket hexadecimálisán jeleníti meg a bin2hex() segítségével: reset($data). "<td>CRC32</tdxtd>&nbsp. speciális és nemnyomtatható karakterekkel vizsgálja ezt: $data[] $data[] $data[] $data[] $data[] = = = = = " gf gf gf d gf s dgs " .</td>" . " . amit hálózathoz és lemezekhez használnak. $v). print ("<tablextrxtd>Data</tdxtd>&nbsp. Az mhash() az. 125. 125. bin2hex($hash) . chr(13) . htmlentities ($v) . ■ ■ ■ t ■ 122 .és lebegőpontos számmal.986. tejezet Bankkártyák Gyors megoldások Adatok hash-elése Ez a megoldás az mhash-függvényt használja. amely sztringgel. a maradék adminisztrációs szolgáltatásokkal használható. és minden egyes adatból CRC32. ahol a rendelkezésre álló hashekről szeretnél információt.és CRC32B-sztringeket hoz létre. print{"</table>"). "</tdx/tr>") . if($hash === falsé) print("<br>made a hash of } else htmlentities($v) ). A hash-ek különböző típusú adatokkal való használhatóságát tesztelve végezzük el az alábbi próbát. "non print" . chr(lO). míg a CRC32B-t speciálisan a ZlP-fájlokhoz.

while(list($k. "</td><td>&nbsp. Az első változtatás a CRC32 fejlécet MD5-re cseréli ki. non print d8b32ce7 3 0bd0d54 63a8 5dlc2a4 4b7 0 8 3defl84ad8f4 755ff2 698 62ea77393dd f3b22c8513875add521ef724a53a5c7 9 ff5e791248822257f8a279c4b72c88f4 80b5da917ee85d4e797831( A lista olyan nemmegjeleníthető karaktereket is mutat. else print ("<tr><td>" .986 special aé. A hash szót kicseréli a hibaüzenetben. A második a két mhash()-függvényt egy olyan mhash()-re cseréli ki. htmlentities($v) . mint például Od és 08. fejezetben található. Amikor egy adatbázisban MD5-öt mentesz el. &nbsp. Data gfgfgfdgfsdgs 125 125.</td>" >" . amely mindig 32 bites és egyenletesen oszlik el a 32 bites értékek tartományán. print ("<tablextrxtd>Data</tdxtd>&nbsp. például 123 . non print CRC32 CRC32B 7478bl78 20859599 29432b3c e7c62b61 b50d8790 b8cf7900 46243921 f5cbe007 f5cdl30c 7dd5c4c7 Hivatkozás: CRC-számolás fájlokra oldal: 286 MD5 Ha nem a biztonságon van a hangsúly. bin2hex ($hash) . $v). A CRC-k leírása a 8. $v) = each($data)) $hash = mhash(MHASH_MD5. if{$hash === falsé) print("<br>Error with " . ami tartalmazza a MHASH_MD5-öt. akkor az MD5-tel gyorsan lehet jelszavakat menteni. Az alábbi kód a CRC32 MD5 alatti változata: reset($data). A következő lista mutatja az eredményt hexadecimális. 16 bites MD5-sztring formájában: Data Hash gfgfgfdgfsdgs 12 5 12 5.Gyors megoldások Az eredményeket a következő táblázat mutatja.</tdxtd>MD5</tdx/tr>") .98 6 special áé. majd a végső print()-et kicseréli arra. htmlentities($v)). hogy csak egy eredményt nyomtasson ki az mhash()-ből. "print("</table>"). akkor bináris-biztos mezőt vagy megjelenítést.

Amikor URL-en vagy e-mail-en keresztül MD5-öt küldesz. Az eredmény (lásd alább) az adott típusú hash-hez szükséges hossz. bin2hex(mhash(MHASH_SHAl.</td>" . amikor automatikusan építesz fel egy adatbázis-táblázatot. És a maradék Fussunk át gyorsan még néhány mhash() hash-en. mhash_get_hash_name(MHASH_CRC32) } . csak a kiemelt kódrészben a SHA1 sztringet más hash-ek neveivel cseréltem ki: print ("<table><trXtd>Hash</td><td>&nbsp. és meg akarod kapni a hash hi vatalos nevét. mint például a MHASH_CRC32. "<td>" . Használhatod ezt a számolást. $datá print("</table>"). mhash_get_block_size(MHASH_CRC32) ) . ezt a kódot használd: ! print {"<br>" . </td><td>Result</td>" print ("<tr><td>SHAl</td><td>&nbsp. A következő lett az eredmény (a sorok a könyv formátuma miatt törve vannak): Hash Result SHA1 3 6c02 4 4 3ad02 211bb93 8 25e2ab0 57 0fe7 5 9 9b0bf HAVAL2 5 6 b0e7 77d66725 4 41baaf19dff51d8e4e94b56be0ad61605d8d814 05b2c6 a777eO HAVAL22 4 323323aele7550f323527ac6891888 5557 4a9d94clcl46518 8e2 8c2 0 HAVAL192 7d4dbefa3bl5b4 5ea4dd9158 0301dfle8 8f2bla6b0bla3db HAVALI 60 dfbbab634 9 67ab93ab8 68223de90ec2c83d70c63 RIPEMD160 631b5 94ffdb75af2 0el4a62 5 85f8d4 00a02 0 964 2 GOST bcl0c57f8931759eafe871e68f72f248273bda56018d98732a0b7bla48cc 6394 TIGER 424e4 610167e4dlaa5 87eff90d7 6ccbel4 87 74 24a0ddecb0 mhash_get_hash_name() Ha van hash-azonosítód. és ki kell számolnod a mezők méretét: 124 . a következő kódot használd: print("<br>" . hogy mennyi helyre van szükséged. Az alábbi kódot használtam. j Az eredmény: CRC 3 2 mhash_get_block_size() Ha megvan a hash azonosítója és ki akarod számolni. fejezet Bankkártyák hexadecimálist kell használnod. &nbsp.4. akkor base64-es kódolást kell használnod.

print ("<table><tr><td>Hash</tct><td>&nbsp. 3 2 ) . "</tdx/tr>") . és mind a nevet. $h++) t print("<tr><td>" . bin2hex($hash)). . Itt van az eredmény. A függvénynek szüksége van a hash nevére. mind a méretet egy helyes kis táblázatba foglalja: $hashes = mhash_count{). De ha más salt- 125 . hogy olyan kódot írj. mhash_get_block_size($h) . és 32 a sztring hossza. amelyeknek nmcs nevük vagy tömbméretük. és lehetővé teszi. "</td><td>&nbsp. A következő kód végiglépked az első hash-azonosítótól. a $data-érték a jelszó.Gyors megoldások mhash_count() * A mhash_count() a hash-hez rendelt legmagasabb értékű azonosítót adja vissza. "turkey". print("<br>" . $hash = mhash_keygen_s2k{MHASH_MD5. Ha mindig ugyanazt a salt-sztringet és jelszót használod. a nem túl véletlenszerű turkey a salt-sztring. htmlentities($data[0] ) .</td>" . print ("</table>"). for($h = 0. A következő kód az MD5-öt használja a hash-hez. $data[0]. és a régi idejétmúltak törlődnek (üres bejegyzéseket hagyva hátra): Hash CRC32 MD5 SHA1 HAVAL2 5 6 RIPEMD160 TIGER GOST CRC32B HAVAL22 4 HAVAL192 HAVAL160 Block Size 4 16 20 32 0 20 0 24 32 4 28 24 20 mhash_keygen_s2k() Az mhash_keygen_s2k() segít a felhasználó által megadott jelszóból egy salt-sztringgel kódolt S2K-algoritmussal kulcsot generálni. ahogy új hash-típusok hozzáadódnak. amellyel az összes rendelkezésre álló azonosítón végiglépkedhetsz. " " . akkor mindig ugyanazt a kulcsot fogod kapni. mely algoritmus specifikációi az OpenPGP RFC2440-ban találhatók. a 0-tól a mhash_count()-tól kapott értékig. Megjegyzés: A salt-sztring értéke a kezdő érték. amely elindítja a folyamatot. Lehet véletlenszerű vagy akár minden alkalommal ugyanaz. mhash_get_hash_name($h) . $h <= $hashes. a salt-sztring értékére és a hosszra. Az eredmények változni fognak. a jelszó adataira. amely azokat az azonosítókat is tartalmazza. "<td>Block Size</tdx/tr>") .

tördeltem.4. lehet. tehát mentsd el a salt-sztring-et is. Az mhash() létrehozhat egy hash-t egy sztringből. ha a salt-sztring túllépi a 8 bitet. A 32 bites eredményt. Tedd a salt-sztringet annyira véletlenszerűvé. fejezet Bankkártyák sztring-értéket használsz. amikor a kulcsot mented. amely hexadecimálisán jelenítődik meg. amikor a kulcsokat ellenőrződ. amelyből a kulcsot generálod. és az alábbi hibaüzenetet kapod. A salt-sztring-re szükséged lesz. a weboldaladnak egyedi salt-sztríng-értéket kell választanod. hogy a felhasználó adja meg a jelszót. A salt-sztring 8 bitre korlátozott. amikor túlméretezett salt-sztring-mezőt próbál feldolgozni: Warning: The specified salt [13] is more bytes than the required by the algorithm [8] 126 . Ha hagyod. tehát ahhoz. hogy az emberek ne találhassák ki. hogy a kulcs egyedi legyen. és a hash válhat a salt-sztring-gé. A PHP 4.0. akkor még ugyanazzal a jelszóval is más kulcsot fogsz kapni. Itt a példaként felhozott kód eredménye. hogy ezt a jelszót más weboldalon is megadják. amit például a microtimeQ ad eredményül.7dev szintúgy kilép. hogy a könyv formátumának megfeleljen: gfgfgfdgfsdgs b2alflba22 3195 92b7 3 9557aell8c2ee7 4 7c0 5 37 32 005c33 5c43a0 0 8eb b0e0e8 A salt-sztring-mező csak egy véletlenszerű kezdőpontja a generálás folyamatának.

5. fejezet MySQL és PostgreSQL Gyors megoldások oldal: 142 144 146 148 152 157 160 t Kapcsolódás az adatbázishoz Az adatbázisok listázása Adatbázistáblák megjelenítése Táblák mezőinek megjelenítése Táblák adatainak megjelenítése Adatsor beillesztése Adatbázis létrehozása Táblák létrehozása Adatbázisok használata session-ökhöz A kód megtisztítása 160 161 169 .

amit mSQL-nek nevezett. Régebben Windows NT alatt készítettem weblapokat. Vannak hasonlóságaik. Ha PostgreSQL-t szeretnél használni Windows alatt. és nagyjából ugyanolyan szintű terméktámogatást kapunk hozzájuk. amelyek előtérbe he lyezhetik valamelyiket egy bizonyos projekt szempontjából. mint a Windows NT. vagyis minimális átalakításra lesz szükséged. A Unix és a Linux különböző verzióin mind a MySQL. Solaris-on. a „Gyors megoldások" megmutatja. melyek igény szerint Windows NT -n. mert nem végzett erőforrás-igényes tranzakció-feldolgozásokat. A MySQL korábban gyorsabb teljesítményt nyújtott a számos weblapon használt egyszerű. ha a PostgreSQL valamelyik speciális funkciójára lenne szükségem. de gyors Porsche (MySQL). vagyis mindkét operációs rend szer használói elkezdhetnek MySQL-lel dolgozni. amelyik bárhová eljut és bármit megcsinál (Postgres). és akkor használnék PostgreSQL-t. hogy teljesen áttérek Linuxra. tehát a teljesítmény már nem képezheti igazán a választás alapját.5. Ausztráliában a Bond Universityn a programozó Dávid Hughes megpró bált a Postgres-szel összekapcsolni egy alkalmazást SQL-en keresztül (a Postgres-ben ekr kor még nem volt SQL). fejezet MySQL és PostgreSQL Áttekintés A MySQL és a PostgreSQL egyaránt nyílt forráskódú adatbázisok. ezért egy saját egyszerű és gyors adatbázist készített a miniSQL-hez. ha át kell térned egyikről a másikra. hogy a Postgres túl lassú. Történet Az adatbázisok evolúciójában a nyílt forráskódú fejlődésnek két fő ága volt: a nagy és lassú buldózer. amelyek mindkettőt egyaránt jó választás sá teszik a legtöbb weboldal számára. Sőt. akkor jelenleg számos termék bonyolult telepítésével és fordításával kell szembenézned. ami látszólag az Oracle egyes funkcióval akart versenyezni. A MySQL már Windows és Windows NT alatt is elérhető. hacsak nem tervezed egy nagyméretű és különleges szerkezetű adatbázis használatát. hogyan oldhatjuk meg a leggyakrabban felmerülő feladatokat MySQL-lel és PostgreSQL-lel. amely mindkét adatbázishoz megfelelő. | . egyaránt könnyű (vagy nehéz) telepíteni őket. A Linux a Mandrake 8 disztribúcióval hasonlóan felhasználóbarát telepítést és kezelőfelületet biztosít. és a kicsi. míg a második rész. Dávid úgy találta. Most már a MySQL is képes tranzakció-feldolgozásra és a PostgreSQL felveszi vele a versenyt a frissítésigényes adatbázisok területén. mind a PostgreSQL egyaránt elérhető. ezért mindig MySQL-lel kezdenék. és ideálisak kis és közepes méretű honlapokhoz. A Postgres egy a Berkeley egyetemen folyó projektből nőtte ki magát. Queenslandben. olyan kód megírására törekedtem. és vannak különleges funkcióik. olvasásigényes adatbázisokkal. ezért lehet. A fejezet első része áttekinti a hasonlóságokat és a különbségeket. Dávid megírta a saját SQL-feldolgozó programját. ez megkönnyíti a megfelelő adatbázis kiválasztását. és miniSQLnek nevezte. Linuxon vagy FreeBSD-n kerültek megjelenítésre.

128 .

09-2-t (www. de egyszerű és gyors maradt. Monty Widenius. A szolgáltatásainkból származó bevételekből jelentős összegeket fordítunk a MySQL fejlesztésére. akkor ne próbálkozz a PostgreSQL Windows NT-s telepítésével. hogy egy praktikus. A PostgreSQL 7. A fejlesztők az mSQL vizsgálatával kezdték. a MySQL fejlesztésvezetó'je egyértelműen azt a célt tűzte ki.l-es verzión teszteltük. mindennapi használatra alkalmas adatbázist fejlesszenek. majd elhatározták. ha PostgreSQL-t akarsz használni Windows NT-n. E két program egy kiterjesztett POSIX-környezetet biztosít. és a MySQL egyszerű. vagy kérj meg egy gyakorlott Linuxost. Windows NT Service Pack 6a platformon. kiegészítve a Unix bash shell-jével. az Informix megvásárolta az Iílustriát. így a Postgres-ből néhány elem átszivároghat az IBM DB2-jébe. Az emberek többsége eddig a Porschét részesítette előnyben a traktorral szemben. hogy vezessen végig a telepítési és konfigurálási procedúrán.1-et (http://cygwin.1. amely jobban illeszkedik nagyobb weblapok kiszolgálásához. A Unix környezettől eltekintve a PostgreSQL telepítése még mindig nehézkes. amely biztosítja a MySQL további sikerességét. de mára a standard GNU General Public License (GPL) alatt forgalmazzák. A fejezetben található PostgreSQL kódokat 7. hogy más platformok elérése hasonló nehézségekbe fog ütközni. majd az IBM megvásárolta az Informíxt. ami a Windows-t használó webfejlesztők millióit arra sarkallja. de nem jártam sikerrel. Megpróbáltam felkutatni egy időszerű. A Postgres-ből végül kifejlődött a PostgreSQL. verziója óta számos MySQL felhasználó a PostgreSQL jó teljesítményéről és magbízhatóságáról számolt be a közepes méretű weblapok területén.neuro. A Windows-os problémák arra engednek következtetni. Mielőtt PostgreSQL-t telepítenél Windows-ra. cygwin 1.edu/users/cwilson/cygutils/Vl." A MySQL-nek egy fura szoftverfelhasználói szerződése volt. Először próbálj Linux-gyakorlatra szert tenni. A cygpic és a cygwin nélkülözhetetlen.Áttekintés A MySQL később felváltotta az mSQL-t. mindegyikük külön telepítési művelet. hogy egy olyan adatbázist írnak. Ha a bash shell és hasonló kifejezések összezavarnak. ezért a MySQL tartja az előnyét. Célkitűzésünk a MySQL fejlesztése és az adatbázisunk elterjesztése az új felhasználók körében. A Postgres kereskedelmi változatát az Illustna Information Technologies fejlesztette ki. PostgreSQL A PostgreSQL a berkeley-i University of Californián 1986-ban megkezdett Postgres szoftverfejlesztésből származó Postgres95 továbbfejlesztett változata. amint az emberek kellő gyakorlatot szereznek az adatbázisok területén ahhoz. A MySQL AB tulajdonában van a szerver forráskód szerzői joga és a MySQL márkanév. megbízható felépítése révén inkább meghódítja az új platformokat. MySQL Az alábbi idézet a MySQL dokumentációjából származik és a MySQL tulajdonjogait magyarázza meg: „A MySQL AB az a svéd vállalat. átfogó és pontos oktató anyagot a PostgreSQL Windows-os és Windows NT-s telepítéséről.3.gatech. amelynek tulajdonosai és működtetői a MySQL alapítói és fő fejlesztői. tehát számíthatunk a PostgreSQL terjedésére.1/cygipc/) használva. számos Unix komponenst kell telepítened.com) és cygpic 1. hogy kihasználják a PostgreSQL plusz szolgáltatásait. hogy előbb a MySQL-t sajátítsák el. 129 .

A főbb funkciók közti eltérések sokkal többet nyomnak a latban. nem pedig sztringek összefűzése.). amely túl könnyen összekeverhető az európai nap/hónap/éwel. A MySQL nem szabványos SQL-je engedélyezi a kettős keresztet a megjegyzésekhez (de szintén elfogadja a szabványos — szimbólumot). mint pl. fejezet MySQL és PostgreSQL Néhány különbség A MySQL és a PostgreSQL közel áll az ANSI/ISO SQL92 szabványához és a PostgreSQL az SQL99-ből is átvett néhány dolgot. és minden programnyelv könnyebben megtanulható volna a jövőbeli programozó nemzedékek számára. mint az or és az and. egy napon végleg eltűnnek. mint az SQL-t fejlesztők. Mindkettő folyamatosan fejlődik. a " szimbólummal jelöli a sztringeket (de szintén elfogadja a szabványos ' szimbólumot is.5. ha a logikai VAGY-ra van szükséged és mindig kiírod az ilyen kifejezéseket. ha mindig or -t írsz.és nagybetűk megkülönböztetése A PostgreSQL a sztringek összehasonlításakor megkülönbözteti a kis . ezért nincs sok értelme a szabványoknak való megfelelés alapján választani közülük. míg 130 . mint a szabványokhoz való igazodás. vagyis a kettős ke reszt szimbólum a sor elején.és nagybetűket. Elkerülheted a | | karakter téves használatát. más esetekben a MySQL fejlesztői jobban ragaszkodnak a szabványokhoz. Mindössze arra van szükség. a maga különcségeivel. egyes különbségeket. és ezeket dokumentáld is a kódodban. a legtöbb programozó számára egyszerűbb volna. amit mindkét adatbázis elfogad. a legnépszerűbb kereskedelmi adatbázisok a leg rosszabbak.hónap nap. a másik az olasz Köztársaság Napja (június 2. a " szimbólumot használja a rendszer-azonosítók meghatározásához (amit a legtöbb programozó ritkán használ). Példa erre a megjegyzéseket jelző karakterek: a programozási nyelvekben legáltalánosabban elterjedt megközelítés a #.és nagybetűkre érzéketlen összehasonlítást végez. amelyeket én nem-szabványosnak neveznék.). Kis. ha a sor elején kettős kereszttel jelölhetnék a megjegyzé seket. és a | | szimbólum jelentése VAGY. az adattípusok. ha egységes megjegyzés-határoló szabványt használnának. a hónap/nap/évhez ragaszkodnak. és biztosít olyan utasítást. A MySQL a #-et választotta és a — szimbólumot is támogatja. Az ANSI/ISO/SQL létrehozói a ~ szimbólumot választották a megjegyzések jelölésére. A legtöbb programnyelvben ez a legbiztosabb módja a programozásnak. Az SQL-szabvány az év . Dátumok A PostgreSQL és a MySQL majdnem ugyanúgy kezeli a dátumokat. Az SQL is csak egy programnyelv. hogy tisztában legyél a különbségekkel. A MySQL-ben vannak olyan SQL programozási megoldások. a fejezet hátralévő részé ben tárgyaljuk. amelyek remélem. de itt megint csak kü lönbségek vannak az adatbázisok közt. a szabványoktól való eltérések nagy részét és a funkciók különbségeit az alábbi akban felsoroljuk. amely a kis. mivel az amerikai dátumformátumhoz. míg a PostgreSQL fejlesztői ragaszkodtak a — szimbólumhoz. A 02/06/2002 és a 02/06/2002 megkülönböztethetetlen egymástól: az egyik az új-zélandi Waitangi Day (február 6. Azt hiszem. amit ebben a könyvben a példaprogramokban használok).

és a frissítendő táblákhoz használd a MySQL új típusú tábláit vagy a PostgreSQL-t. és a MySQL nemrég vezetett be egy új táblatípust.vagy nagybetűssé alakít. A char-. ami azt jelenti. ugyanis még egy programnyelvet meg kellett tanulni. Tranzakciók A PostgreSQL-ben mindig is voltak tranzakciók. ami csökkenti a forgalmat az adatbázis és az alkalmazás közt. mivel a feldolgozást az adatbázis kódja hajtja végre. ahelyett. A PostgreSQL formailag érzéketlen módon kezeli a mezők. hogy az üzleti logikát az adatok definíciójába ágyazzák. táblák és adatbázisok neveit. ezért csak kisbetűket és számokat használj. ami logikus lépés volt. de megadhatsz egy meghatározott formát. tranzakció nélküli tábláit válaszd. Ha a MySQLben kezdetben beállítod a lower_case_table_names = 1 paramétert. A tárolt eljárások sokkal gyorsabban futnak le. ha szeretnéd megbonyolítani az életedet. hogy figyelembe vegye a kis -és nagybetűk közti különbséget. csak olvasható táblá kat akarsz használni a referencia-információk számára. A tárolt eljárások a több programnyelv együttes használatának problémáját oldották meg. ami csak az adott adatbázisra korlátozódott. Ma a programokat. és be lehet állítani. A Star Trek világa egyre kevésbé tűnik hihe tetlennek. míg a blob-típusra bináris összehasonlítást végez (ami nem különbözteti meg a kis. míg a tábla nevek egyedi fájlok. amely lehetővé teszi a tranzakciókat. hogy számos külön böző programnyelvben megírt kódba kellett volna eltemetni. hogy egy üzleti logikát egyetlen helyen tárolhatsz. Ha egy weblapon nagyméretű. Tárolt eljárások Húsz évvel ezelőtt a tárolt eljárások az adatbázisok megmentői voltak.és varchar-típusok is formailag érzéketlenné tehetők. az adattípusok közti konvertálást Assembly nyelven. mivel lehetővé tet ték. A MySQL különálló könyvtárakban tárolja az adatbázisokat és külön fájlokban a táblákat. amely szöveges mezőket kis. egy függvényben 131 . de az operációs rendszer fájlnevekre vonatkozó meg szorításai komoly gondot okozhatnak. A MySQL formailag érzékeny összehasonlítást használ a char. Semmi nem gátol meg abban.Áttekintés a MySQL a formai érzéketlenségtől indul. hogy párhuzamosan futtasd a kettőt.és nagybetűket). a tárolt eljárások nyelvét. ami rugalmasságot biztosít. ezáltal kézzel is elvégezhető az összehasonlítás. majd egy tranzakciómentes másod példányt készíthetsz a referenciaszerverről — ez ideális megoldás a több ezer szerverből álló keresőmotorok esetében. Egy több szervert használó honlapon az elsődleges referencia-adatbázison engedélyezheted a tranzakciókat. A MySQL olyan utasítással is rendelkezik. és mindkettőt befolyásolja az operációs rendszer formai érzékenysége. text. a jelentéseket RPG-ben. ezáltal elkerülheted a formai érzékenységből adódó csap dákat. akkor a MySQL standard. de adódott egy új probléma. akkor minden táblaneved kisbetűs lesz. A MySQLadatbázis definíciói könyvtárakként szerepelnek a fájlrendszerben. hogy garantáld a hibamentes frissítést. jelentéseket és a konvertálást egyaránt megírhatod PHP ban. mivel a tranzakciók mégiscsak csökkentik a teljesítményt. ha a binary tulajdonsággal definiáljuk őket. text és varchar sztring-típusokra. mikor az emberek az eljárásokat COBOL-ban írták.

egy iizletilogika01. lehetővé teszik. Egy kisebb fejlesztői csapatban megspórolhatod annak a költségét. merülj el a PostgreSQL-ben. hogy az egyik fejlesztőnek specializálódnia kell még egy nyelvre. míg a többi fejlesztőnek nincs kellő tapasztalata az SQL-tervezésben.és objektumhasználata és a PHP4 sebessége révén feleslegessé teszi a tárolt eljárások használatát. ha megengeded a dolgozóknak. ha triggerekre van szükséged. de nem engedik.org-oldalon. hogy lássák egymás fizetését. Ha egy adatbázis-adminisztrátorod van és számos programozód. egyszerű nézet. az adatbázis-kezelőbe beépített trükkök. és nézeteket használsz. ha egyvalaki kifinomult tárolt eljárásokat fejleszt. de a tárolt eljáráskora hagyatkozás növelheti a problémákat. vagyis megünnepelhetik a születésnapokat. hogy a dolgozók megnézzék egymás nevét és telefonszámát. amelyek pl. Tovább is fokozhatod az ellenőrzést. Ha olyan rendszert használsz. hogy a PHP-n kívül egy másik nyelvet is meg kell tanulnunk. pl. amelyet különböző nyelveken megírt alkalmazások használnak. amelyet nem befolyásolnak tárolt eljárások vagy egyéb. akkor az adminisztrátor az egyedüli ember. amelyek az SQL-tervezés hibáiból adódhatnak. A tárolt eljárásoknak nem kell többé megoldaniuk a több programnyelv együttes használatából fakadó problémákat. de nem engeded. mert a weblapok kliens/szerver felépítése feleslegessé teszi a triggerek néhány hagyományos alkalmazását. Ha már megértetted az adatok struktúráját és tartalmát. A triggerek adatbázisfüggőek. az SQL-nézet hibás lesz. A tárolt eljárások valójában egy újabb problémát jelentenek. amelyeket nehezen tudnál leprogramozni. mert a MySQL-ben nem találod meg a megfelelőjét. de olyan funkciókat biztosítanak. A tárolt eljárások megelőzhetnek néhány balesetet. amit jó SQL-tervezéssel lehet megoldani. azáltal. akkor a klasszikus kliens/szerver hálózati forgalom problémával szembesülsz. és bármely szkriptbe beágyazhatod. Alaposan vizsgáld meg az igényeidet mielőtt bármit implementálnál. megőrizheti a titkát. ha szükséged van rájuk tanulmányozd a PostgreSQL dokumentációját és oktató anyagait a postgresql. és a PostgreSQL biztonsági megoldását használva ellenőrizheted a hozzáféréseket a nézetekhez. egyszerű függvény.html include-fájlban. hogy lássák egymás születési napját és hónapját. amelyik hozzáfér az adatbázishoz. így az a dolgozó. Triggerek A triggerek a tranzakciókhoz hasonlóan csökkentik a teljesítményt. SQL-ben is megírhatod a korlátozott nézeteket. míg a PHP a webszerveren. hogy lássák egymás születési évét. tehát. akkor hasznosíthatod a korlátozott nézeteket. A PostgreSQL-nézet funkciója lehetővé teszi. Nézetek A legjobb kezdeti nézet a sima. ahol az adatbázis egy külön adatbázisszerveren van. A tárolt eljárások arra valók. 132 . hogy a nézetet mint új táblát rögzítsd az adatbázisba. hogy megvédjenek egy adatbázist.5. aki kikémlelheti a dolgozók fizetését. aki 20 ezer dollárt költött plasztikai műtétre. ha még soha nem használtad volna őket. A PHP kódbeágyazása. de ha a következő programozó hozzáad egy új mezőt. fejezet MySQL és PostgreSQL vagy objektumban.

A PostgreSQL bit. bármilyen paritást jelző vagy egyéb jelentéssel kitüntetett bit nélkül. és van két bit sztring-típus is. Mindkét adatbázis közel áll az ANSI/ISO SQL92 numerikus adatokra vonatkozó szabványához. vagy egy külső fájlban. amely opciók felsorolását tartalmazza. továbbá a money is elavult. vagyis válassz egy másik formátumot. sztringeket. hogy más formátumot kell használnod. a tartalomra vonatkozó bármilyen megkötés valamint. egész számokat. hogy az operációs rendszer alapján vagy a tranzakciók használata miatt. a decímal-t. A bit varying változó hosszúságú. és ekkor egy hivatkozást tárolsz vala melyik adattípusban. 133 . CRC32-es mezőkben és ha int autoíncrementet használsz a kulcs-mezőkhöz (lásd a fejezet későbbi részét). A MySQL opcionális unsigned-paramétert biztosít a nagy pozitív egészek tárolására és ez az opció főleg az int-típussal használatos. mint a charmezők. tehát valamikor a jövőben könnyedén lecserélhetem a tinyint.és bit varying-mezői egyaránt egy nullákból és egyesekből álló sztringet tárolnak. Az SQLszabványokhoz való alkalmazkodás hosszú távon fontosabb.abvány boolean-típus. mint egy kis adatfeldolgozási többlet vagy egy kis elveszített tárterület. A PostgreSQL bigint-je nem biztos. A PostgreSQL-ben van egy SQL99-sz. Minden mást az előbbi adattípusok valamelyikében tárolsz. de mindössze egyeseket és nullákat tárolnak. Noha a MySQL set-típusával bizonyos adatok esetén megspórolhatunk egy részt a programozásból. Ha hosszabb távra írok alkalmazást és MySQL-t használok. amelyek úgy viselkednek. és ha nem adod meg a maximális hosszát. pl. A MySQL dec-e a decimai alternatív neve. és semmi okot nem látok arra. és a MySQL fejlesztői is megígérték. ha 32-bites jelöletlen egészeket akarsz eltárolni pl.Áttekintés Adattípusok Ha adatokat tárolsz. hogy beteszik a boolean-t a következő verzióba.meghatározod a hosszát. és nullával kerül kitöltésre. bináris objektu mokat és nagyon nagy bináris objektumokat akarsz tárolni. bájtokat. amelyet használhatunk arra. A bit rögzített hosszúságú .és set-mezőimet boolean típusúakra. Egész számok A PostgreSQL és a MySQL egész típusai az 5. hogy minden platformon elérhető.1 táblázatban vannak felsorolva. bár sokkal valószínűbb. esetleg a hivatkozási integritás érde kében választasz operációs rendszert. hasonlóan az int is használható az integer helyett. hogy eltároljuk a set-opcióit. akkor a boolean adatokat függvények segítségével tinyint vagy set típusú mezőkben tárolom el. Hogyan viszonyul egymáshoz a PostgreSQL és a MySQL az adattí pusok tekintetében? Bitek A MySQL set-típusa egy speciális bináris objektum. tehát lehet. mégis a PostgreSQL booleanadattípusa a legjobb választás a jövőre nézve. hogy valaki az egész számok miatt válassza az egyiket a másik rovására. akkor biteket. akkor tetszőlegesen hosszú lehet.

mind a PostgreSQL korlátozásokat tartalmaz arra vonatkozó an.474. ha az adatbáziskezelő megcsonkítja a túl nagy számokat. hogy megduplázzuk a tartományukat. ha automatikus növelésű mezőként használjuk őket. tehát a BCMath-ben vagy GMP-ben használt tetszőlegesen nagy számokat inkább hagyományos sztringben tároljuk.48 dollártól +21.474.2). 134 . hogy az egész mezőkhöz unsigned-paramétert adjunk. Típus Hossz (bájt) Értéktatomány MySQL PostgreSQL tinyint smallint 1 2 -128-tól + 127-ig -32768-tól +32767-ig -8388608-tól +8388607-ig -2147483648-tól +2147483647-ig 17-től 18 számjegyig Nincs korlátozva Nincs korlátozva O-tól +2147483647-ig -21. 5. A lebegőpontos típusok felsorolása az 5. a kompatibilitás érdekében inkább kerüld el a float használatát.836. és pl. Ha mégis használod ezeket az adattípusokat. ha a számítási eredmény garantáltan elfér a kisebb mezőben.vagyis csak akkor térj el a duoble precision használatától. Serial A PostgreSQL serial-je és a MySQL int autoincrement-je a numerikus azonosítók automatikus növelésére szolgál. fejezet MySQL és PostgreSQL Decimai és a numeric A decimai és a numeric sztringként tárolja a számokat. mivel ehhez az adattí pushoz ritkán szükséges a számítási pontosság meghatározása.5.1 táblázat Egész adattípusok a MySQL-ben és PostgreSQL-ben. utóbbi megegyezik a PHP belső nyolcbájtos formátumával . meghatározhatod a maximális hosszt és a számolási pontossá got.836. A MySQL double-ja a double precision alternatív neve.47dollárig Igen Igen Igen Igen Igen Igen Igen Nem Nem Nem Igen Nem Igen Igen Igen Igen Igen Igen mediumint 3 integer bigint decimai numeric serial money 4 8 Változó Változó 4 4 Lebegőpontos számok A MySQL és a PostgreSQL azonos négy és nyolc bájtos lebegőpontos számokkal rendel kezik. A MySQL float típusához tetszőleges pontosságot lehet beállítani. ami nem SQL92 szabvány. Mind a MySQL. hogyan kezeli ezeket az adattípusokat. A MySQL megengedi.2 táblázatban található. decimal(ll. A későbbi „Azonosítók beillesztése" részben tárgyaljuk az automatikus növelésű egészek azonosító kulcsként való használatát. tehát akármilyen hosszú számot eltárolhatsz. pl. vagy ha nem bánod. számlák azonosítójához vagy tranzakciószámokhoz hasz nálható. annak érdekben.

Enum A MySQL enum-típusában egy számot tárolhatsz. amit az enum-mező megadásakor definiáltál. ha annak jóval hosszabb maximális hosszt állítunk be.3 táblázat sorolja fel. Tegyük fel. tinytext-. és tökéletesen használható a rádiógombokhoz olyan űrlapokon. A sztnng-típusokat az 5. A character varying másik neve a varchar. mediumtext. 5.3 táblázat Sztring adattípusok a MySQL-ben és PostgreSQL-ben Típus char varchar tinytext text mediumtext longtext text character character varying 0 1 1 2 3 4 Hossz mező Adat (bájt) 1-től 255-ig 1-től 255-ig 1-től 255-ig 1-től 65535-ig 1-től 16777216-ig 1-től 4294967295-ig 1-től 4294967295-ig 1-től 4294967295-ig 1-től 4294967295-ig MySQL Igen Igen Igen Igen Igen Igen Igen Nem Nem PostgreSQL Nem Nem Nem Nem Nem Nem Igen Igen Igen 4 4 4 A MySQL varchar-.Áttekintés Sztringek A rövid sztringek tárolására a MySQL átfogóbb körű típusválasztékot kínál. a character varying-je pedig a MySQL maximum korláttal ellátott text-tí-pusával. A PostgreSQL text-je megegyezik a MySQL longtext-jével. ahol a látogató több lehetőség közül csak egyet választhat. amelyek jó hasznát veszik a rövid szöveges mezőknek. hogy a i 135 . amelyek a bennük eltárolt adatokon kívül egy. a hosszukat leíró mezőt tartalmaznak. amely egy kulcsszót képvisel.3 táblázat mutatja. vagy a 255ről 4294967295-re növelt maximális hosszúságú varchar-típussal. vagy a MySQL char típusával. mint az 5. egyre kevesebb értelme van néhány sztring-mezó'nként néhány bájtot megtakarítani. text-. Ahogy csökken a merev lemezes tárolókapacitás ára. megegyezik a meghatározott hosszúságban szóközökkel kitöltött character varying PostgreSQL-típussal. A PostgreSQL character-e vagy más néven char.és longtext-típusai változó hosszúságú mezők. azaz a legjobb választás lehet olyan alkalmazásokhoz.2 táblázat Lebegőpontos adattípusok a MySQL-ben és PostgreSQL-ben float reál double precision 4 4 6 tízes helyi érték 6 tízes helyi érték 15 tízes helyi érték Igen Igen Igen Nem Igen Igen 8 5.

és „tenyésztésre alkalmas DNS-sel rendelkezik". amely a top 10-es listán szereplő neveket tartalmazza a votes. hogy a szavazatokat fogadó weblapon a látogatók egy listán kipipálhatják azokat a tulajdonságokat. 'Péter Moulding'. úgy hogy a megadott kulcsszavakat egy-egy bittel ki-be kapcsolhatod. de nem mindig. amelyek miatt a kérdéses jelöltre szavaztak. ahelyett. Nagyon jó példa erre a titkosított jelszó.5.(szavazatok) táblázatban. és egyszerű outputot szolgáltat. 'Hannibál Lecter'. 'Rasmus Lerdorf'. 'Janet Jackson'. ' _ insert your name here _ ')) Set A set révén egy bináris sztringet tárolhatsz.4 ábra a legnagyobb hasonlóságot mutató mezőtípusokat sorolja fel. create table votes {person enum('Nicole Kidman 1. A set mezőnként 64 lehetőséget fed le. ahol az emberek a megadott lehetőségek közül többet is kiválaszthatnak. Tegyük fel. A következő" kód az enum definícióját példázza. Dátum és idő A PostgreSQL-ben és a MySQL-ben hasonló. Mindkettő elfogadja az egyszerű inputot. hogy a boolean szerepel a következő verzióban): altér table votes add 'caring1.'. 1 és 255 közötti nevet tartalmazó listákhoz tartozó index számára elegendő 1 bájt. a mező neve person (személy). „jóképű". és ezúttal tényleg szeretnél takarékoskodni a hellyel. fejezet MySQL és PostgreSQL honlapodon szavazatokat tárolsz a világ tíz legnépszerűbb emberére vonatkozóan. 1 handsome Blobok A Nagyméretű bináris objektum (Bmary Large Objects. Definiálhatsz egy enum-mezőt a jelöltek neveivel. 'Cuba Gooding Jr. és egy szavazathoz csak egy bájtot fogsz használni. A features-ben minden tulajdonsághoz tartozik egy 0 vagy egy l-es. mivel a neveket csak egyszer tárolod a tábla mezó'definícióiban és a mezők csak a névlistára vonatkozó indexet tartalmaznak. 136 . A set-típus a HTML-űrlapok jelölőnégyzetéhez illeszkedik. 'Yoda '. mert mind a 800. hogy a név minden karakterét eltárolnád. ami csak 32 bájtot foglal az adatbázisban. „gondos".000 internetező szavaz ni fog. és az adatokat be lehet vinni az enum definíciójában használt névvel vagy közvetlenül az indexszámmal. 'Madonna'. és mivel a setmezők maximum 8 bájt (vagyis 64 bit) hosszúak lehetnek. de egy különálló fájlként a Linux ext2 fájlrendszerében 8192 bájt lemezterületet fogyasztana el. egy set-mezőhöz 64 különböző tulajdonságot határozhatsz meg. 65 ezer nevet tartalmazó lista két bájtban fér el. A következő kód azt mutatja. ami néha előnyös. és az adatbázisban csak egy hivatkozást tartunk. 'sharing'. és csökkenti az igényt a PostgreSQL boolean mezőtípusára (a MySQL megígérte. pl. ha az egyik adatbázishoz írt PHP-kódodat a másikra alkalmazod az SQL átalakítása nélkül.000. column 'DNA') features set('intelligent'. Az 5. Teljes képe ket az adatbázisban tárolni ennek épp az ellentettje: egy 100 000 bájtos képet a fájlrend szerben kell tárolni. ' Kevin Spacey'. amely a tulajdonságok listáját tárolja. a legáltalánosabb dátum és időformátumok eltárolására alkalmas mezők vannak. blob) képek vagy más bináris adatok adatbázisban történő tárolására alkalmas. hogy definiálunk egy features nevű mezőt.

és mind a month-.4 táblázat Dátum és idő adattípusok a MySQL-ben és a PostgreSQL-ben Type ormatum ostgre. A PostgreSQL interval-ja a Umxos időformátum kiterjesztése egy olyan tartományba. ami 1970-től 2037-ig érvényes.x. Ausztráliában négyjegyű irá nyítószámokat használnak. hogy a helyi időt is átalakítsuk GMT/UCT időre. 4137-től 32 767-ig tart. mind day-mezőkre megengedi a nulla értéket. A macaddr különböző for- 137 . amely minden cím minden helyén megenged nem nulla értékeket. pl.3.5 táblázat tartalmazza. (Az internetes közösségben már bevezetés alatt áll az IPv6. de nem árulja el a korát). A MySQL-é akkor frissül. 0000-11-04 (megadja egy személy születésnapját. ami lehetővé teszi. és a Posta minden évben felveti a hatjegyűre való áttérést. melyik évben született az egyik ősöd. date datetime timestamp time year interval 3 8 4 3 1 12 eeee-hh-nn éééé-hh-nn óó:pp:mm ééééhhnnóóppmm óó:pp:mm 1901-től 2125-ig Igen Igen Igen Igen Igen Igen Igen Igen IgenNem Igen -178000000-tól +178000000-ig Nem A PostgreSQL year-típusa Kr. amely csillagászati számításokra alkalmas. A PostgreSQL úgy tűnik. 5. és mivel az egy évre jutó másodpercek száma csökken (a föld lassul). A PostgreSQL különleges típusait az 5.x/y formátumban.168. az intervaí közelítő értéket használ a másodpercek eves szamara. vagy esetleg az adóhivatal is használhatja. melyik napon). egy másodperces pontossággal. A PostgreSQL különleges típusai A PostgreSQL-ben van néhány különleges formátumú mező. A PostgreSQL-ben időzónákat is megadhatunk.4. tudod. 192. amelyeknek jó hasznát veheted. A cidr a hálózatod előtagjának tárolására használható. ám a speciális formátumú mezők csapdát is jelenthetnek.Áttekintés A MySQL timestamp-je a szabványos Unix időjelzés megfelelője. ha beillesztesz egy rekordot. Az interval 365 millió évet tárol másodperces felbontásban. vagy a PostgreSQL valamely másik kü lönleges funkcióját kell használnod a feladat magoldásához. pl. vagy 1857-00-00 (pl. és az inetben tárolhatod az egyedi számítógépek címet. pl. míg a MySQL a 0000-tól 9999-ig tartó időszakot fedi le. vagy null értéket adsz egy mezőnek. vagyis egyedi gazdaszámítógép címek tárolására is al kalmas. ahol az y a címhez használt alhálózati maszkban lévő bitek száma. A cidr 4-es verziójú Internet Protocol (IPv4) címeket tárol x. de nem tudod. 192. vagyis egy tárolt eljárást kell írnod. ezért Ausztráliában valóban csapdát jelenthet egy speciális adatformátumot használni az irányítószámokra. e. míg a PostgreSQL timestamp-je 1903-tól számol.x.) Az inét a cidr másik változata. vagyis részleges dátumokat is eltárolhatsz. nem frissíti a timestamp-jét. vagy megváltoztatsz egy mezőt egy rekordban. hogy mely hónapban.168.3/8.

5. A MySQL-ben benne van a last_insert_id() (utoljára beillesztett azonosító) SQL-függvény. 5. fejezet MySQL és PostgreSQL mátumú média acces control (MAC. a polygon-ban tárolt x.y koordinátapárt tárol. hogy szeretnéd megkapni az automatikusan növelt mező értékét. Azonosítók beillesztése Mikor olyan rekordokat illesztesz be. a path több x. amelyek auto_increment.5 táblázat A PostgreSQL egyedi adattípusai Típus cidr inét macaddr point line lseg box path polygon circle 12 12 6 16 32 32 32 Bármilyen IPv4 hálózati cím Bármilyen IPv4 hálózati vagy gazdacím Bármilyen hálózati illesztő MAC címe Egy pont a kétdimenziós térben Egy végtelen vonal a kétdimenziós térben Egy véges hosszú vonal a kétdimenziós térben Egy téglalap a kétdimenziós térben Egy nyitott vagy zárt út a kétdimenziós térben Egy poligon a kétdimenziós térben A kör a kétdimenziós térben változó 32 24 A point egy kétdimenziós geometriában használatos x. A betűk lehetnek kis. szeretnéd megkapni a számla automatikusan növelt azonosítószámát a számla tételeinek beillesztéséhez. Ha a számlát egy számlákat tartalmazó táblába illeszted be. a PHP pedig tartalmazza a mysql_insert_id() MySQL-utasítást. a line két pár koordinátát tárol egy végtelen hosszú vonal számára. lehet. a box-ban egy téglalap két szemközti csúcsa tárolható. pl. amelyek egy nyílt vagy zárt utat adnak meg (a polygon párja). médiahozzáférési vezérlés) címeket fogad el.y koordinátapárt tartalmaz. ezért biztosítani kell. 10:03:44:0a:f3:92.és nagybetűk és az inputban a kettőspontot (:) kötőjel (-) is helyettesítheti. ezt az SQL-lekérdezést futtasd: select last_ínsert id{) from invoices limit 1 A MySQL-hez ezt a PHP-kódot is használhatod: $invoicenumber = mysql__insert_id {) . az lseg egy véges hosszú vonal kezdőés végpontjának koordinátáit tartalmazza. az outputban viszont szigorúan kettőspont (:) szerepel. és a circle egy kör középpontjának koordinátáit és sugarát tartalmazza. 138 . Ha egy számlát adsz az adatbázishoz.y koordináták egy poligont írnak le. Az automatikusan növelt értéket különféle módokon elérheted. Mindegyik mező 8bájtos lebegőpontos számokat tárol.(automatikus növelésű) mezőt (a PostgreSQL-ben serial) tartalmaznak. hogy a megadott értékek a megfelelő határok közé essenek.

from invoices" A PHP-ban kétmilliárdig növelheted az egész számokat. mert bizonyos dolgok hatására. Az eredmény azonosítóját a pg_fetch_array()-utasításban használjuk. $oid) . A kód azt csinálja. A következőkben a PostgreSQL megfelelő utasítását. és az SQL-lekérdezés eredményének formájában adod át a PHP-nek. hogy visszanyerjük az oidnak megfelelő sort. amely egy kicsit különbözik a mysql_insert_id()-tó'l. azonnal kérd le az értéket. Megkerülheted a problémát. táblák újra betöltésére törlődik. ennek révén tudjuk megadni a $inviocenumber változónak a megfelelő értéket. 139 . pl. Webhelyenként oldalletöltések tízmillióit regisztrálhatod. ha az SQL-t használva nyered vissza az azonosítót. de nem biztos. és nézz utána az adatbázis dokumentációjában. Előfordulhatnak-e egyáltalán ilyen nagy számok? Képzeld el. az oid-ot adja vissza. több szkript egyidejűleg illeszt sorokat ugyanabba a táblázatba. ha folyamatos an törlőd a 7 napnál régebbi rekordokat. "select invoice . $result = pg_exec($link. ezért a mysql_insert_id()-utasítást közvetlenül a sikeres insert (beillesztés parancs) után kell tenni. Néhány adatbázis esetében ez csak úgy lehetséges. Vannak más módok is a PostgreSQL-ben ennek a műveletnek az elvégzésére.Áttekintés A mysql_insert_id() az auto_increment-mező legfrissebb értékét adja az aktuális szálban. ami egy nap összesen akár százmillió rekordot is jelenthet az adatbázisban. visszanyered az azonosítót. hogy frissítésre zárolod a táblát. vagyis minden old alletöltéshez több rekord is tartozik. de ez áll legközelebb más adatbázisok módszereihez. hogy lekérje a jelen esetben invoice nevű sorrendmezőt az oid által meghatározott sorból. Az oid-ot nem használhatod hosszú távon. visszatérési értéke az eredmény azonosítója. a sorrendmezőt kinyerhetjük a beillesztés előtt is. A MySQL és más adatbázisok nagyon nagy értékeket is megengednek az automatikusan növelt mezők számára. Ha az automatikus növekedés mi att túlléped ezt az értéket. hasonlóan a mysql_fetch_array()-hoz. hogy lekéri az oid -ot. amellyel a fogyasztók elemezhetik a 25 leglátogatottabb honlap nézettségét. argumentumában egy adatbázis link azonosító és egy SQL-állítás szerepel. akkor a PHP hosszú numerikus (long numeric) mezőre vált. és arra használja. és minden oldalon több banner található. Egy sort felfoghatunk egy tömbnek is. Ha automatikusan növelt értéket nyersz ki egy adatbázisból. A pg_exec()-parancs a mysql_query() megfelelője. majd megszünteted a zárolást. pl. " where~oid = " . mert a PostgreSQL belső azonosítóját. hogy beüzemelsz egy rendszert. ha több. Az automatiku san növelt számláló értéke akkor is tovább növekszik. hogy hiba nélkül átkonvertálják a PHP long numeric formátumára. $row = pg_fetch_array(Sresult) . $invoicenumber = $row["invoice"]. amelynek elemeit a mezők nevei azonosítják. Minden oldalletöltés egy rekord. és ez fog a legkevesebb problémát okozni. PostgreSQL-ben járatlan programozó dolgozik a kódon: $oid = pg_getlastoid($result). mielőtt bármilyen más hozzáférés auto_increment -utasítást futtatna az adatbázison. hogy mi történik ha. a pg_getlastoid()-ot mutatjuk be.

A MySQL úgy tűnik. valamint mindkettő hatékonyan tárolja az adatokat. ami ideális. hogy ugyanazokat az adatokat több különböző formátumban vagy sorrend ben olvasnád be. mert új indexeket is fel kell írni 140 . A platformfüggetlenségbe az SQL is beletartozik. amelyre Apache telepíthető. Indexelni vagy nem indexelni Az adatbázis indexelése meggyorsíthatja az olvasást. viszont lassíthatja az írást. ha az input-fájlok nem illeszkednek tökéletesen az SQL insert-utasításának feldolgozásához.com-on és postgresql. ahol PHP-t használhatsz. A MySQL-nek egyetlen hátulütője van az eltérő platformokon: az adatbázisok és táblák nevei könyvtár. hogyan lehet a PHP-vel manuálisan formázni az adatokat az SQL insert-utasítása számára. ami problémákat okozhat egyes számítógépeken. fejezet MySQL és PostgreSQL Platformfüggetlenség A PostgreSQL a Unix és a Linux minden. hogy mindenütt elérhető. fejezetben ismertetjük. valamint a tetszőleges adatformátum olvasása és visszaadása. ha egy szkript ugyanazt az adatot többsz ör használja. kötőjeleket és egyéb különleges karaktereket. amely mindenhol fut. ezért a jelenlegi és a jövőben használni tervezett operációs rendszerek fájlnevekre vonatkozó megszorításait figyelembe kell venni. Mindkét adatbázis kezeli a nagyméretű bináris objektumokat (blob). Ahelyett. minden platformon elérhető. A szabványos SQL insert-et a „Rekordok beillesztése" című Gyors megoldásokban ismertetjük. és végezd el a rendezést vagy a feldolgozást a tömbökből.org-on elérhető dokumentációban megtalálható. mert az adatbázis-kezelő szoftver egyből a kért adatra tud ugrani. A MySQL szintén. amelyek révén tetszőleges relációs adatot betölthetsz a memóriába és feldolgozhatsz a memóriából. fejezetben bemutatott PHP-tömbök széles körben kínálnak tárolási formátumokat és kulcsstruktúrákat. melyeket több különböző szerveren akarsz használni. Adatbázis nyers adatokból Az SQL különféle módokat kínál a külső fájlok beolvasására az insert-utasításon keresztül és a PHP tökéletesen alkalmas a fájlok átformázására. Adatbázisok és tömbök A 3. és a 8. csak kisbetűs fájlneveket használj. valamint Windows-on és Windows NT-n is. általam ismert verzióján elérhető'. és ne alkalmazz hosszú fájlneveket.5. olvasd be egyszer. Azt tanácsolom. milyen fájlformátumokat tud olvasni az insert-utasításuk. mellőzd a szóközöket. ami gondot okoz a korlátozott tárhellyel bíró kis komputerek számára. A mysql. hogy minden operációs rendszer értelmezni tudja az elnevezéseket. Ezért a MySQL platformfüggetlenebb és jobb választás olyan alkalmazások számára. aláhúzásokat.és fájlnevekké válnak. ami azt jelenti.

beleértve a naplófájlokat. hogy a többletköltségek megérik-e a megnövelt adatintegritást a PostgreSQL-ben. és gondosan ellenőrződ. akkor kezdetben hanyagold a relációkat. Mind a MySQL-lel. hogy olyan kérdésekre válaszoljunk. ellenőrizd. lehetővé teszi az indexek hozzáadását és eltávolítását. A PHP a MySQL és a PostgreSQL összes különleges funkcióját támogatja. mind a PostgreSQL-lel könnyedén létrehozhatsz indexeket. és az ODBC hátrányai nem befolyásolják a fő adatbázisodat. akkor a legjobb megközelítés. Kapcsolatok A PostgreSQL oly módon támogatja a kapcsolatokat. Ki kell számolnod az olvasási sebesség növekedéséből fakadó előnyöket és az írásból fakadó hátrányokat. akkor nyers SQL-parancsokat is begépelhetsz. és a PHP szinte bármilyen formátumot képes olvasni. akkor ezekhez célszerű lehet ODBC-vel kapcsolódni. <m 141 . Ha már átlátod az adataidat és van valamekkora tapasztalatod a relációk tervezésében. Ha többnyire egy adatbázissal dolgozol és alkalmanként más típusú adatbázisokat is használsz. Az adatok betöltésének és vizsgálatának legegyszerűbb módja az előre megírt phpMyAdmin (letölthető a www. megvizsgálhatod a honlap teljesítményét és törölheted az indexeket. Ha egy adatbázissal dolgozol. hogy az adatbázist igazi relációs adatbázissá teszi . A relációk összekapcsolják a táblákat. hogy az egyes hozzáférések optimális sebességgel működnek-e. ha egyszer eldöntötted. mint pl.Áttekintés a lemezre. Ha csak most ismerkedsz az adatbázisokkal. de egy rossz relációs szabály igencsak megnehezíti az adatbevitelt. a naplófájlok mélyére kell ásni. ennek ára az egyes hozzáférések viszonylagos lassúsága.greatbridge. ha mindkét adatbázishoz a PHP saját utasításait használod. ha különböző típusú adatbázisokkal dolgozol. MySQL-lel. és ezután kísérletezz relációk hozzáadásával. melyek a legfontosabb mutatószámok a saját honlapod számára. mert ez egyszerű.net-ről) és pgMyAdmin (letölthető a www. pl. ODBC Az Object Database Connectivity (ODBC) valamelyes adatbázis-függetlenséget biztosít. és a PHP segít a számítások automatizálásában.phpwizard. „Melyik lekérdezés a leggyakrabban használatos?". hogy megállapítsuk.ez rendkívül hasznos bizonyos helyzetekben. Mindkettő előre megírt elemeket tartalmaz és ha ezek nem passzolnak az igényeidhez. vagy teljesen új adatokkal dolgozol. és átkonvertálod egy másik típusra.org-ról) használata. akkor megítélheted. ezáltal összhangban tartják az adatokat. egy index segít-e egy adott lekérdezést valamint. olvasd be az adatokat táblákba. például PostgreSQL-re. A legtöbb adatbázis biztosít valamilyen módot arra. Ahhoz. hogy az adatok megfelelnek-e minden kritériumnak.

vagyis egy sima fájlból ís be lehet tölteni őket. Egy szerverhez a mysql_connect()-utasítással kapcsolódhatsz. Az adatbázis neve movies. vagyis hasznos hibaüzenetet készíthetsz: 142 . $database["user"]. a mysql_select_db() visszatérési értéke hamis. a második pedig az opcionális kapcsolatazonosító. hacsak a rendszergazda nem állít be egy másik portot. amivel egy helyi MySQL-adatbázishoz kapcsolódhatsz. ha a MySQL ugyanazon a gépen fut.mindez kielégíti az igényeidet. amelynek argumentumában a szerver neve az első érték. $database["password"] = "txO4dd". így elcsípheted a hibát. A felhasználónév alapértéke a webszerverfolyamat tulajdonosának felhasználóneve. ami a mysql_connect()-parancs visszatérési értéke. $connect = mysql_connect(). a jelszó alapértéke pedig üres. A további sorok egy hálózaton belüli másik szerverhez való kapcsolódást mutatnak. ha a szkriptjeid csak egy kapcsolatot használnak. amit nem szükséges megadni. amely sokkal hasznosabb számodra. fejezet MySQL és PostgreSQL Gyors megoldások Kapcsolódás az adatbázishoz Az első példa a minimális kódot mutatja. és ha nem adod meg az értékét. A bemutatott alapvető hibaüzenet csak illusztrációs célokat szolgál. ez az első paraméter a mysql_select_db()-utasítás argumentumában. esetleg egy levél a weboldal fenntartójának. A mysqlconnectQ alapértelmezése 3306. Az értékek a $database-tömbben vannak összegyűjtve. ha ezt nem adod meg. $database["server"] = "sqlserver". Connect failed to server: " . ?database["user"] = "sqluser". akkor az utasítások az éppen aktuális kapcsolatot használják . A gyakorlatban kapcsolatfelvételt lehetővé tévő informá ciók szerepelhetnének. Ha nem sikerült létrehozni kapcsolatot. a következő kód révén a MySQL csatlakozik egy adatbázishoz a mysql_select_db()-utasítással. vagy átirányítás egy másik oldalra. akkor alapértelmezett localhostot használja. A szerver neve mellett a portot is meghatározhatod az alábbi formában: sqlserver:3306. Az előző kód csatlakozott egy MySQL-szerverhez. A kapcsolatazonosító sok MySQL-utasításban opcionális paraméter. és a honlapod az egyedüli honlap a gé pen.5. tehát el is hagyhatod. $database["server"]). if (!$connect = @mysql__connect ($database [ "server" ]. és olyan hibaüzenetet jeleníthetsz meg. $database["password"])) { print("MySQL problem. és a honlapod látogatói is jobban megértik. A @ jel a mysql_connect() előtt egyszerűen kikapcsolja az alapértelmezett hibaüzenetet.

passworddel és porton. ami a mysql_connect() és a mysql_selest_db() kombinációjának felel meg: argumentumában az összes paraméter egy kapcsolódási sztringként szerepel. Waniing: Unable to connect to PostgreSQL server: connectDBStartQ — socketQ failed: errno=0 5. $database["password" ] ) . Mikor ezt teszteltem egy PostgreSQL-szerveren. amelyek lehetővé teszik a szkript számára. " password=" . Failed to select " . $connect = pg connect("dbname=" . " port=" . Sconnect)) { print("MySQL problem. $database["port"] = "5432". $database["host"] . hogy nem győződhetsz meg arról.1 ábra Sikertelen pg_connect() ronda hibaüzenete Mindkét adatbázis támogatja az állandó kapcsolatokat. $database["host"] = "localhost".1 ábrán látható egy hibaüzenet. " host=" . if(!@mysql_select_db($database["database"] . $database["port"] . $database["database "]). Abban a verzióban. ugyanavval a felhasználóval. $database["user"] . Vedd észre hogy kihagytam a @-ot a pg_connect() elől és a hibaellenőrzés is elhagytam. a pg_connect(). 1 ' 143 . ezáltal csökkentik az erőforrás-igényes műveleteket. $database["password"] = "txO4dd". hogy a PostrgeSQL kapcsolatod száz százaléko san tökéletes és lehet hogy a felhasználók alkalmanként ronda üzeneteket kapnak. ami azt jelenti. A MySQL állandó kapcsolatai teljesen megbízhatóak. ha már létrejött a kapcsolat. ha nem jön létre a PostgreSQL kapcsolat. $database["database"] . és a kapcsolat legutolsó hibaüzenetét rögzíti.Gyors megoldások $database["database "] = "movies". PostgreSQL-ben pedig a pg_connect()-et pg_pconnect()-re. meghatározott host-on. Milyen rondákat? Az 5. A @ kikapcsolja a PostgreSQL hibaüzeneteit. A PostgreSQL-hez van egy utasítás. A következő példa a helyi szerveren lévő templatel nevű adatbázishoz kapcsolódik (a templatel-et a PostgreSQL telepítője hozza létre) peter felhasználónévvel. akkor meg kellett adnom a host-ot. A MySQL-ben a mysql_connect()-et cseréld le mysql_pconnect()-re. " user=" . de nem kellett megadni a passwordöt és a portot: $database["database"] = "templatel". A pg_errormessage() akkor működik. de a PostgreSQL-lel felmerülhetnek problémák. jelszóval és szerverrel. amelyben ezt a kódot kipróbáltam. hogy a korábbi kapcsolatot használja. mint az Apache webszerver. amely ugyanazon a gépen futott. $database["user"] = "peter". ha újraindítod anélkül. a pg_errormessage() utasítás nem adott vissza semmilyen hibaüzenetet. hogy az Apache-ot is újraindítanád.

hogy már kapcsolódtál az adatbázishoz az előző. a mysql-adatbázist a MySQL használja adminisztrációs célokra. milyen adatbázisok elérhetők a szervereden. A PostgreSQL-ben egy hibaüzenet-utasítás van. Az adatbázisok listázása Ha szeretnéd megtudni. és semmilyen adat nem jelenik meg. plusz táblákat látnak. $databaset"sql"] ) . a kód egy hibaüzenetet ad. ez helyettesíti a MySQL mysq]_error() és mysql_errno() utasításait. de ha az adatbázis elérése sikeres és egyetlen sort sem eredményez az SQL-lekérdezés. Az adatbázisok listáját a select-paranccsal jelenítheted meg. else print ("Query error: " . a MySQL támogatja az SQL show database-parancsát (lásd a példakód első sorát). amely megmutatja azokat az adatbázisokat. A példaprogramban. Ha hiba lép fel az adatbázis elérésében. és a test-adatbázist a MySQL hozza létre tesztelési célokra: movies mysql page test A PostgreSQL-ben az adott szerveren lévő adatbázisok a pg-databases nevű táblában találhatók. mysql_error(} . A mysql_fetch_row()-utasítás egyszerre egy sort olvas ki az eredményből és hamisat ad vissza. ami az adminisztrációs adatbázisban van elrejtve. Ebbe beletartozhatnak azok az adatbázisok is. A kód az SQL-utasításokat beteszi egy általános adatbázis-elérési tömbbe. A movies-adatbázist néhány Gyors megoldások részben használjuk példaként. aminek értéke hiba esetén hamis. A PostgreSQL adminisztratív táblái a táblák felsorolásában saját magukat is tartalmazzák. miután az utolsó sort is elolvasta. amelyekhez van jogosultságod. a pg_exec() hajtja végre a lekérdezést. " using sql " . A szóban forgó függvény egy eredményindikátort ad vissza. a pg_errormessage(). ezért akik adminiszt ratív jogokkal rendelkeznek. $row[0]). ". és a pg_fetch_row() soronként adja az eredményt. amelyeket jogosult vagy látni. 144 . hasonlóan az előzőhöz.5. amelyeket a példaprogram második select-utasításával lehet kizárni. majd továbbadja azt a mysql_query()-függvénynek. akkor nem lesz hibaüzenet. mysql_errno() . if($result = @mysql_query($database["sql"] ) ) { while($row = mysql_fetch_row($result) ) { print("<br>" . fejezet MySQL és PostgreSQL 4. A kód feltételezi. " . mint a következő kód első sora mutatja. „Kapcsolódás az adatbázishoz" című rész ben leírt módon: $database["sql"] = "show databases". Az én munkaállomásomon kapott eredmény a következőkben látható. de nincs jogosultságod olvasni őket.

a mysql_list_dbs(). ezt pedig a pg_numrows() segítségével kapjuk meg. "<br>from sql: " . $database["sql"] ) . mikor a pg_exec() hibásan fut le. majd a mysql_num_rows() megadja az eredmény sorainak számát. else print("Pg_exec() error: " . ezért a pg_fetch_row()-t while() helyett for()-ciklusba kell ágyazni. print("<br>" . plusz a PostgreSQL telepítő által létrehozott két template-tel: test templatel templateO movies A PHP MySQL-utasításai közt szerepel egy speciális utasítás. A mysql_list_dbs() beolvassa a $connect opcionális paramétert. Az alábbiakban látható az eredmény az általam készített test. else print{"<br>Zero results. Az előző kódot abban a tekintetben is kiterjesztettük. $i) . if($result = @pg_exec($database["sql"] ) ) { $rows = pg numrows($result) . vagyis ellenőrizheted az SQL logikai hibáit is. $i++) { $row = pg_fetch_row($result. de nulla számú sort ad eredményül. A PostgreSQL pg_fetch_row()-utasításának a sor indexét is meg kell adni. 145 . $result = mysql üst dbs ($connect) . "<br>using sql: " . mikor működik. amelyet kifejezetten adatbázisok nevének visszanyerésére írtak. Error: " . $row[0]). A ciklust annyiszor hajtjuk végre.és movies-adatbázisokkal.Gyors megoldások select datname from pg-databases select datname from pg-databases where tablename not üke 'pg%' $database["sql"] = "select datname from pg database". amely felsorolja az adatbázisokat a következő kódban bemutatott módon. amennyi a sorok száma. azoktól. if($rows) { for($i = 0. A sorok 0-val kezdődő indexszel vannak ellátva. és az eredményt felsoroló listára mutató pointert ad eredményül. $error . Az if($rows) utasítás vizsgálja a nullasor feltételt és egy speciális hibaüzenetet eredményez. és a for()-ciklus végiglépked a sorokon. hogy elválasztjuk azokat az eseteket. pg_errormessage . csatlakozik a MySQL-szerverhez. Az egyes sorokat a mysql_db_name()-utasítással kapjuk meg. $i < $rows. $database["sql"] ) .

a MySQL támogatja az SQL show table-parancsát (lásd a példakódot). $database["sql" ] ) . A movies-adatbázis a következő eredmény adta. " . hogyan találhatsz meg egy táblát és egy mezőt. $database["sql"] = "show tables from if($result = " . valamint hogyan hozz létre új táblát és adatot. mysql errno() . majd a mysql_fetch_row() soronként beolvassa az SQL ered ményét és hamisat ad eredményül.és nagybetűk. while($row print("<br>" } else { print("Query error: " . @mysql_query($database["sql" ] ) ) = mysqlfetchrow($result) ) . és sem hibaüzenet. Most már képes vagy kapcsolódni egy MySQL. fejezet MySQL és PostgreSQL írows = mysql_num_rows($result) . mysql_db_name($result. ha az adatbázis nem tartalmaz adatokat. Vedd észre. A kód feltételezi. $i < $rows. Egy adatbázis elérési hi ba hibaüzenetet eredményez.vagy PostgreSQL-szerverhez. milyen táblák vannak az adatbázisban. " using sql " . for($i = 0. $x->Database). A kód a mysql_query()-utasításon keresztül továbbítja az SQL-parancsokat. hogy már kapcsolódtál az adatbázishoz (lásd a korábbi „Kapcso lódás az adatbázishoz" Gyors megoldásokat) és hogy az adatbázist movies-nak hívják: $database["database"] = "movies". sem más adat nem kerül megjelenítésre. és megkaphatod a hozzáférhető adatbázisok felsorolását. amely megmutatja az adatbázisban található táblákat. ami hiba esetén hamisat ad eredményül. vagyis a Database-t nagy ű-vel kell írni: $result = mysql_list_dbs(). hogy az objektumok tulajdonságainak nevében számítanak a kis. $database["database" ]. Adatbázistáblák megjelenítése Ha szeretnéd megtudni.5. while($x = mysql_fetch_object($result) ) { print("<br>" . A sorokat egy $x nevű objektumban is megkaphatod a mysql_fetch_object() -utasítással és az adatbázis nevéhez a $x-> Database paranccsal férhetsz hozzá. mysql error() . ". A következő Gyors megoldásból megtudha tod. miután beolvasta az utolsó sort. $i++) { print("<br>" . $row[0]). ezeket a táblákat fogjuk használni a további példákban: 146 .

pg_fieldname($result. a pg_fetch_row() számlálója pedig a pg_numrows() eredményéül kapott sorok száma. de ezek nem kifejezetten úgy írják le az adatbázist. Noha lehetséges közös kód írása a két adatbázishoz.és pg_fetch_row()-utasítása egyaránt indexet használnak a pg_exec()-ből származó eredményhez. else print("<br>Zero results. A PostgreSQL pg_fieldname(). $database["sql"]) . Vedd észre. "<br>from sql: " . amelyik valójában nem is tábla. print("</tr>"). for($f = 0. $f < $fields. hanem a pg_class-tábla nézete. hogy nincs megadva adatbázis. $error . print{"</table>") . f o r ( $ f = 0. néhány alapvető különbség a kódban eltemetve ne hezen érthetővé válna. ahogyan az adatbázisok neveit az előző. print("</tr>") . A pg_fieldname() számlálója a táblák száma a pg_numfields()-ből. $i++) $row = pg fetch row ($result. ezért mindkettőhöz for()-ciklust kell használni while() helyett. Error: " . A kód további része hasonló ahhoz. $f++) print ("<td>" . „Adatbázisok felsorolása" részben megjelenítettük. $f < $fields. de eltér az ekvivalens MySQL-kódtól. if($result = @pg_exec($database["sql"] ) ) $rows = pg_numrows($result) . A táblázat formázása megegyezik a korábbi Azonnali megoldással: $database["sqlM] = "select * from pg_tables". for($i = 0. print ("<tr>"). $row[$f] . $f) . A pg_class egy sor definíciót tartalmaz táblákra és indexekre vonatkozóan. A kiválasztást az adminisztrációs táblában (pg_tables) hajtottuk végre. $f++) print("<td><em>" . 147 . $fields = pg_numfields($result). ahogyan a MySQL táblák az adatbázishoz viszonyulnak. "</td>"). $i). $i < $rows. if($rows) print ("<table border=\"l\"xtr>" ) . és szükség van egy számlálóra a ciklus leállításához.Gyors megoldások cast director movie person producer title A következőkben az előző kód PostgreSQL megfelelőjét láthatjuk.

mint a show columns. mert a mysql_tablename() számára egy indexérték. a tábla a person-. az SQL show fields -parancsa a MySQL-ben megmutatja azokat. az egyes sorokat a mysql_tablename()-utasítással kapjuk meg. A mysql_num_rows() a beolvasandó sorok számát adja. amelyet kifejezetten a táblák nevének kinyerésére írtak.és egy PostgreSQL-verzió követi. $table). majd ezeket egy MySQL. Táblák mezőinek megjelenítése Ha meg szeretnéd találni egy adatbázistábJa összes mezőjét. mint a következő kódban látható. ezért a mysql_tablename() csak erősíti a verziófüggetlenséget. $result = mysql_list_tables($database["database"]). A PHP a mysql_list_tables()-utasítást is támogatja az adatbázis tábláinak kinyerésére. de a mező (field) és az oszlop szavak a legtöbb adatbázisban felcserélhetőek. mint az előző példában: $database["database" ] = "movies". Az adatbázis a movies-. és a for()-ciklus végigmegy a sorokon. $rows = mysql num rows($result). és az eredmények egy új weboldal tesztelésére szánt MySQL-adatbázisból származnak: show columns frotn person from movies show fields from person from movies 148 . és látszólag feleslegessé teszi a mysql_tablename()-utasítást. Egy másik mód a táblák felsorolására. De nem tudhatjuk.5. a $i szükséges. "<br>using sql: " . Azért használunk for()-ciklust while() helyett. $i++) { print("<br>" . $i < $rows. for($i = 0. $i) ) . Ez a technika közelebb áll ahhoz. A relációs adatbázisok nyelvén az oszlop [column) a megfelelő kifejezés. hogy a jövőbeli PHP. ahogyan az előző Gyors megoldásokban az adatbázisokat felsoroltuk. $result = mysql_list_tables($database["database"]). ha a mysql_fetch_row()-t egy while()-ciklusba ágyazva a list()-utasítással kapjuk meg a sorok tartalmát. csakúgy. Minden más ugyanaz.és MySQL-verziók mysql_list_tables()-utasítása hogyan fog működni. Az első példa megmutatja a mezőinformációk kinye résének két általános SQL-megoldását. pg errormessage() $database["sql"]). $database["database"] = "movies". mysql__tablename($result. fejezet MySQL és PostgreSQL else { print{"Pg_exec{) error: . while (üst ($table) = mysql_fetch_row ($result) ) { print ("<br>" .

A mysql_list_fields() az adatbázis egy táblájának mezőit sorolja fel. mysql_field_len($result. A mezők egyes tulajdonságait a mysql_field_name()-. mysql^field_name(Sresult.Gyors megoldások A MySQL tábláinak felsorolásához kapcsolódj a MySQL-hez az első Gyors megoldásokban bemutatott módon. $i) . A sorok megjelenítése előtt a kód beilleszti a <table> tag-et és egy fejlécsort. mysql_field_flags($result. . A mysql_num_fields() a mezők számát biztosítja az eredmény olvasásához. $rows = mysql num fields($result). f o r ( $ i = 0.2 ábrán látható. "<td>" . hogy egy <table> tag-be ágyazzuk. flags: " . A ciklusba ágyazott kód beilleszti a táblázat egyik sorát. és futtasd a következő kódot. mysql_field_flags($result.és mysql_filed_flags()-utasítások adják: $result = mysql üst fields{"movies". length: " . mysql_filed_type()-. a for()-ciklus pedig végigmegy az eredményen. $i) . length: 14. 149 . "</tdx/tr>") A táblázat az 5. length: 65535. " type: " . length: 10. $i++) print("<tr><td>" . $i++) print("<br>" . mysql_field_name($result. . "person"). flags: not_null blob born type: date. "<tdxem>Type</em></td>" . flags: not null comment type: blob. "person"). mysql_field len($result. $i) . Az oszlopok szegélyeinek megjelenítéséhez a kód a border="3" paramétert használja a <table> HTML-tag-ben. flags: not_null unsigned zerofill timestamp name type: string. for($i = 0. mysql_f ield__type ($result. ". length: 255. flags: not_null primary_key unsigned auto_increment updated type: timestamp. annak összes oszlopával: $result = mysql_list_fields{"movies" . . flags: not_null blob A következő példában áttekinthetőbb formában jelenítjük meg az információt azáltal. "<td><em>Flags</em></tdx/tr>") . length: 10. $i) print("</table>"). "<td>" . majd a ciklus végigmegy az adatsorokon. flags: not_null realname type: blob. "<td>" . ". mysql_field__type(íresult. $ i ) ) . mysql_filed_len(). Si < $rows. és végül beilleszti a záró </table> tag-et. Az eredmény: entry type: int. $i) . length: 60. $rows = mysql_num_fields($result) . $i < Srows. print ("<table border=\"3\"xtr><td><em>Field</em></td>" . "<td><em>Length</em></td>" .

a pg_type az 5. a mezőtípusokat külön tí pustáblában. A pg_class-tábla mintája az 5.|f J_ t __ !t it 5.4 ábra A pg_type PostgreSQL-táblázat mintája lattrelid mtname \attcacheqff\ \fttttypid \titdispersion \ittlen \pttnxon fatnelems 132 19 23 l-l ryplen jtypprtlen 1.5-en.. milyen adatokat tartalmaznak: futtasd le háromszor az előző Azonnali megoldás PostgreSQL-példaprogramját. [1247 (typname |1247 jtypowner 21 [0Tl9229 -1 jtypbyval 21 10..198765 [0. a pg_attribute pedig az 5... mert a PostgreSQL a mezőneveket egy általános osztálytáblában tárolja.4 ábrán.. fejezet MySQL és PostgreSQL A PHP PostgreSQL-hez tartozó megfelelő utasítása sokkal bonyolultabb.. Először vess egy pillantást mindhárom táblára. jchar inamé jiotS .... .3 ábra A pgclass PostgreSQL-táblázat mintája typname :bool | bytea typov/ner typlen typprtlen \typbyval \typtype \typisdefined \typdelim 1000 ! 1000 | 1000 1000 1000 1 -1 \l ~ /|t r b > . behelyettesítve a három különböző tábla nevét.518141 H: íjl !5 i l ___ j l 16 . \Field entry updaled \Type Length \Flags jnot null primary key unsigned autó incrementj jnot null unsigned zerofill timestamp J |not null notnull blob j \ int 10 timestamp 14 jname jslring realname blob bom daie comment blob 60 255 10 not_null 65535 inot_null blob 5..3 ábrán látható.. a mezők tulajdonságait pedig külön tulajdonságtáblában.1_ ___ j 1 32 32 '8 20 l£ ! |jb !|b |b ff .5. hogy lásd.2 ábra A person MySQL-táblázat mezői relname pg attribute |pg_shadow pgc l a ss pg toast 1215 idx \reltype\relowner\relam\relfilenode\relpages \reltnples\ 1000 |1247 126 i|75 573 1000 1260 ![1259 80 fíőoö" 10 10 5..

5 ábra A pg_attribute PostgreSQL-táblázat mintája 150 .5.

oid" . és a pg_type oid-jének meg kell egyeznie a pg_attríbute atttypid-mezőjével. vagyis ezeket a mezőket kisebb mint nulla feltétellel lehet vizsgálni.6 ábrán látható eredménye még mindig nem egészen jó. míg a where kulcsszó révén bizonyos feltételeknek eleget tevő rekordokat választhatsz ki a sorok közül. ellentétben a PHP megközelítésével. pg_attribute" .attname as field. e kapcsolat nélkül a részek semmilyen jelentést nem hordoznak: $database["sql"] = "select pg_attribute. Ezt a következő SQL-példában látható pg_class.6 ábra A pg_class. " pg_attribute. hogy azokat a rekordokat kapd vissza. .atttypid = pg_type. Az SQL-szelekt az 5. Adj hozzá egy további feltételt is annak érdekében.typprtlen as printlength." • " pg_class.attnum.a PostgreSQL belső azonosítójának meg kell egyeznie a pg_attribute-tábla attrelid-mezőjével. \attnu n -7 i\field %pe tableoid oid tyengtk variable \-r -7 -7 |-7 tableoid oid tableoid oid k tableoid oid |4 tableoid oid i* h -1 i -1 | -1 !k JÉ K.és a pg_class-táblákat.typname as type. " where pg_attribute. amelyek nem relevánsak a mi tábladefiníciónk szempontjából.relname használatával teheted meg. amelyek attnum-értéke pozitív.relname" .attlen as length.attrelid = pg_class. hogy a mezők a megfelelő táblából legyenek kiválasztva." . " pg_type. " pg_attribute. Egy SQL-szelektben a from-előírásban több táblanevet is megadhatsz.Gyors megoldások Nyilván nem szeretnéd keresztülrágni magadat a nyers adatokon.! ■>tnull printlength 10 10 10 10 10 \relname \ ípg_ipl ' ■|pg_toást_1216 ! jpg_group |pg toast 17058 i |pg_attribute i 5." . " pg_type. Vannak negatív attnum-értékek is — ezek olyan sorokat jelentenek." ." ." .attnum". " pg_attribute. hogy 151 . " and pg_attribute. amely mindhárom táblából kiválasztja a mezőket. Ez esetben a pg_class-tábla oid-jének . az SQL-t viszont felváltottuk egy másikkal. A PostgreSQL adminisztrációs tábláiban sok negatív érték ta lálható.oid" . " pg_attribute. pg_type és pg_attribute első egyesítésének mintája Adj hozzá egy további elemet az SQL where-előírásához.atttypmod as variablelength. az attnum és a relname megjelenítése elhagyható. ahol minden nem nulla szám igazat jelent. amelyek különleges jelentéssel bírnak .az 1 gyakran hamisat vagy használaton kívülit jelent. Mivel ez a kód működik.attnotnull as notnull. Először futtasd le. ezért használd a PostgreSQL fejlett SQL-jét az adatok különböző táblákból való összeszedésére és tetszőleges megjelenítésére. hogy megbizonyosodj arról. pg_type. A következő kód az előző kódot használja a táblázat megjele nítésére is. " order by pg_attribute. Relációs fogalmakkal a pg_attribute összekapcsolja a pg_type. " from pg__class." .

pg_attribute. ¥ j|t_ ' -i 47 -1 -1 10 -1 ! 5. vagy más. Az 5.......atttypmod as maximumlength. " from pg_class. J L _ .attname as field..typprtlen as printlength" . fejezet MySQL és PostgreSQL működik.attlen as length. -i . . $database["table"] . " order by pg_attribute. hogy a movies -adatbázisban a 152 .." ..typname as type. amellyel megjelenítheted a PostgreSQL-táblák mezőit...* ... Táblák adatainak megjelenítése Ha szeretnéd egy tábla összes adatát megtalálni.. ismered a táblák összekapcsolására szolgáló SQL-utasítást. " and pg_attribute..relname = '" .atttypid = pg_type. amelyhez aztán egyszerűbb SQL-paranccsal férhetsz hozzá. " pg_type." • " pg_attribute.. és van tapasztalatod az adminisztratív táblákkal ... " where pg_class. A nézetek definiálása a PostgreSQL-ben túlmutat e könyv keretein. akkor azt szeretnéd. " and pg_attribute. Ha elégedett vagy az SQL-szelekttel. hogy egy tábla mezőinek nézete lesz a következő projektjük. " ' " . A legtöbb adatbázis abban a sorrendben adja vissza a mezőket. bár ez még mindig nem tartalmazza. $database["sql"] = "select pg_attribute.7 ábrán a végső felsorolás látható..tehát fel vagy vértezve egy hosszú és boldog PostgreSQLhasználói pályafutásra. \field entry updated type iní4 tiraestamp lengi maximumlength\iotnull k 4 10 -1 Jt : A _ .5. " pg_attribute..attnum"..." " pg type. PostgreSQL-ben elérhető tulajdonságokat... hogy a tábla összes mezője automatikusan bekerüljön a kiválasztásba...oid" . " and pg attribute. pg_type" . -i _.. ||t 259 ..attnum > 0" . lementheted egy nézetként." . Az SQL select "'-operátora egy tábla összes oszlopát kiválasztja.. Lehet.7 ábra A mezők listája a person PostgreSQL-táblában Most már birtokában vagy a kódnak. A következő példa (és az összes példa ebben a Gyors megoldások részben) azt feltételezi. ahogyan definiálták azokat...oid" ..attrelid = pg_class.attnotnull as notnull. name varchar ^ealname varchar date (bom comment | text | 64 . és kísérletezz az adminisztrációs táblák más értékeinek megjelenítésével is: $database["table"] = "person".i ♦ -i 1 ! Ji _ . melyik mezőé az elsődleges index. aztán olvasd el a PostgreSQL dokumentációját.... Plusz mindezt MySQL-ben is meg tudod csinálni." . de a PostgreSQL fejlesztői minden verzióhoz újabb adminisztratív nézeteket dolgoznak ki. " pg_attribute. de nem ismered a tábla mezőit.

az első név az adatbázisé. A MySQL a mysql_select_db()-utasítást biztosítja az adatbázis kiválasztására. amibe inkább e könyv és a PostgreSQL telepítője által létrehozott összes dokumentáció elolvasása és néhány hónapos PostgreSQL gyakorlat után érdemes belefogni): select * from movies. és megjeleníti az adatokat egy fejléc nélküli nyers táblázatban: $database["database"] = "movies". ahogyan definiálva vannak). hogyan adod meg az oszlopokat. hogyha az adatbázisban módosítod az oszlopokat.Gyors megoldások person-táblát használjuk.= $database["database"] . A következő példakódban a mysql_query() kiválasztja a person-tábla oszlopait. azután PostgreSQL-ben. for($i = 0. mert akkor a számok is változnak (mikor *-ot használsz). $i < $fields.person Az egyedüli probléma az oszlopok indexszámokkal való elérésénél akkor jelentkezik. hogy automatizáljuk az adatok visszanyerését. Nem számít. $database["sql"] = "select * from ". if (isset($database["database"]) and strlen($database["database"])) { $database["sql"] . ". a második a tábláé. mielőtt a megszokott mysql_query()-parancsot használnád. Ha már gondtalanul meg tudod jeleníteni az egész táblát. Ebben a Gyors megoldások részben bemutatott kódok azt a célt szolgálják. born from movies. és ha *-ot használtál. } $database["sql"] . ahogyan az adatbázis felsorolja őket (többnyire úgy. print ("<table border=\"l\">"). A PHP-ban szerepelt egy mysql_db_query().= $database["table"]. akkor továbbmehetsz. így a sorokat számokkal indexelt tömbként is kezelheted és a megjelenítheted a mezőket a megfelelő címmel: select narae. $i++) 153 . amelyben paraméterként megadhattad az adatbázist. akkor olyan sorrendben. ha valahol találkozol a régi típusú kóddal. Kérlek. $result = mysql_query($database["sql"]). ahogyan megadtad a kiválasztásban. és a *-ot lecserélve tetszőleges oszlopokat jeleníthetsz meg. vagy amikor módosítod az szelekthez használt mezőlistát. print ("<tr>") . while($row = mysql_fetch_row($result)) { $fields = mysql_num_fields($result) . vagy milyen adatbázist használsz.person Vedd észre. és megpróbáltam az előbbihez a lehető legközelebb álló típusokat választani (a PostgreSQLben saját típusokat is lehet definiálni. hogy az SQL-ben két nevet egy pont köt össze. cseréld le.". az oszlopokat visszaadó utasítások néhány egyszerű szabályt követnek: az oszlopokat abban sorrendben kapod vissza. amit először MySQL-ben hoztam létre. vagyis a sorrend megjósolható. Az adatbázis nevét az adatbázis-hozzáférést megnyitó SQL-ben vagy PHP-utasításban is megadhatod. de az elkülönített mysql_select_db() és mysql_query() a helyes megközelítés. $database["table"] = "person".

$i < $num__fields. $i + + ) { $flags = mysql_field_flags(Sresult. hogy megjelenjen a mezők neve az oszlopok fejléceként.1943-03-31 5. akkor minden egyes megjelenítéshez írhatsz egyedi kódot. $i). Az 5. $v) = each <$f lag_array) ) { $array[$i][$v] = true. Egy finomítási lehetőség fejléc hozzáadása a mezőkhöz. .8 ábra A person-tábla megjelenítése a formázás előtt Ha szeretnéd. egy sor hamisra állítja az output értékét. ha a tömböt nem hoztad létre. újrafelhasználható függvényekbe írj meg. $row[$i] print("</tr>") . de én azt tanácsolom. $array[$i]["name"] = mysql_field_name($result.Ronald Walken . a következő példa a táblázatok megjelenítéséhez nyújt segítséget. végül az indikátorokat az indikátor nevével megegyező mezőként a kimeneti tömbbe helyezi: function { mysql_result_fields($result) $num_fields = mysql_num_fields($result). } $array[$i]["length"] = mysql_field len($result. és minden információt visszaad. jjf~ 00000000000000 Tom Berenger Thomas Michael Moore 1949-05-31 jJ2~ 00000000000000 MimiRogers Miriam Spickler 1956-01-27 ipT^0000000000000 Lorraine Bracco 1955-10-22 >4~ 00000000000000 JeiryOrbach Jerome Bemard Orbach 1935-10-20 . $flags). A mysql_field_name()-nek és a hasonló utasításoknak az eredmény azonosítóját és a mező indexszámát kell megadni. fejezet MySQL és PostgreSQL :j print("<td>" . $flag_array = explodef" ". szétbontja a sztringet az explode()-paranccsal. $i).5. A kód egy sor indikátort kap egy sztringben a mysql_field_flags() -függvénytől. $array[$i] ["type"] = mysql_field_type($result. A mysql_result_fields()-függvény argumentumában az eredmény azonosítója szerepel. a mysql_num_field() a mezők számát adja vissza. print("</table>") . hogy amit csak lehetséges. :l7~20010422203132 Russell Crowe Russell Ira Crowe IJÍTÍ20010423 083 731 Christopher Walken . 154 . while (üst ($k. 5 00000000000000 John Rubinstein 11937-11-30 !|e" 00000000000000 Ridley Seott 1964-04-07 The world's greatest actor. Abban az esetben. amit a MySQL biztosít az eredmény mezőiről. A mezők tulajdonságai az output tömbben vannak eltárolva.8 ábrán látható eredmény nem kifejezetten tetszetős. a for()-ciklus pedig végigmegy a mezőkön és megszerzi az információkat. for($i = 0. legyen ez az első javítás a kódban. ha nem lennének mezők.

a tömb segítségével fejlécet illeszthetsz be. mint alább látható: $exclude = array("updated". formázást is vezérelhetsz vele. és létrehozza a nevekből álló output-tömböt. $v) . mint mikor a select "'-lekérdezést futtatjuk. Egy másik hasznos dolog. amelyek a harmadik paraméterként átadott tömbben szerepelnek. és más funkciókat. Az in_array() igazat ad eredményül. A fejléc beillesztésére ez az if () a legjobb hely. a ciklus eló'tt megadhatod a tömb értékét. hogy csak akkor fusson le. Most írd meg a mysql_table_fields()-függvényt. A következő" kód az előző táblázatrajzoló kód while() parancsával kezdődik. ha az első paraméter 155 . ha a $field_array változó még nem létezik. hogy az argumentumában elsőnek megadott név szerepel-e az utasítás argumentumában másodikként megadott $exclude-tömbben. ami a mysql_result_field()-függvényt használja a fejléc elkészítéséhez.} Most. hogy a mezők információi egy tömbben vannak. print ("<tdxem>" print("</tr>").9 ábra A person-tábla fejléce a megjelenítéshez while($row = mysql fetch row($result)) if(!isset($field array)) $field array = mysql result fields($result). while (üst ($k. A $field_array-tömb értékeit a mysql_result_fields()-függvény szolgáltatja. print("<tr>"). és egy 9 soros részt szúr be. amit megtehetünk ezen a ponton. igen hasonlóan ahhoz. 5. de nem megy végbe. A függvény a mysql_list_fields()-utasítással kapja meg egy tábla mezőit. vagyis nem kell ugyanazt a kódot minden sorra megismételni. (?array = falsé. "realname"). ha egyáltalán nincsenek sorok az eredményben: \pn ttame irealname •rn \comment ~\bö. mert csak az első sorra lehet végrehajtani. ezt követően a kód a mysql_field_name()-utasítással végigmegy az eredményen.9 ábrán látható. Az eredmény az 5. "</em></td>") . ami egy select-parancshoz használható tömbbe tárolja a mezők nevét. hogy egy könnyen módosítható és újrahasznosítható kóddal az updated-del és a realname-mel kezdődően töröljük a nemkívánatos mezőket. = each($field array)) $v["name"] . a kód az if(!isset()) feltételbe van ágyazva. Az in_array()-utasítással vizsgáljuk. de elhagyja azokat a mezőket.Gyors megoldások if(!isset($array)) return($array). Először készíts egy felsorolást a nemkívánatos mezőkről. pl.

while (üst ($k. print ("<tr>") . $i++) $name = mysql_field_name($result.-re. és ha valamelyik mezője egy nulla hosszúságú sztnng. $i < $result fields. implode(". A változások az előzőhöz képest ki vannak emelve: $database["database"] = "movies". vagyis a $exclude elemei nem szerepelnek az output-tömbben: function mysql_table_fields($database. Az implodeQ-utasítás arra használható. $exclude="") Sresult = mysql_list_fields($database. hogy az üres celláknak nincs szegélye. $table). amelyek az Interneten használatos több tucat böngésző közt elszórva megjelennek . $select = mysql table fields($database["database" Sexclude).biztosan észrevetted. hogy a mysql_table_fields()-függvény eredményeképp kapott tömb elemeit egy sztringgé fűzzük össze az SQL select számára. $v) = each($field array)) print ("<tdxem>" . azok közül. ami megvizsgálja az outputot. $database["sql"] = "select " . $database["table"] = "person". if ( !is array($exclude) or !in^array($name. A ". akkor ezt lecseréli egy HTML nem törhető szóközre. print("<table border=\"l\">"). $result fields = mysql num fields($result). Még egy változás van: az ábrákat eddig Netscape Navigator 4. Ahhoz.10-es ábrán bemutatott elegáns formátumra. for($i = 0. mysql select db($database["database"]). " from " . {$array = Most már képes vagy átalakítani a tábla-megjelenítő kódot az 5.: JT i *■■ í- szerepel a másodikban. "-paraméter miatt a tömb elemei közé egy vesszőt és egy szóközt illeszt. fejezet MySQL és PostgreSQL l . hozzáadtam egy sort a kódhoz. $database["table"].5. $exclude) if(!isset($array) ) return($array). "realname"). hogy elkerüld ezt és számos más problémát a böngészőkkel. "</emx/td>' 156 . ". f if ( lisset($field array)) $field array = mysql result fields($result). $array[] = $name.76-tal készítettük. $v["name" } print("</tr>"). $table. mert ez a böngésző hozza előtérbe a legtöbb problémát. $exclude = array("updated". fejlécekkel és elhagyott mezőkkel. azaz &nbsp. $result = mysql_query($database["sql" ] ) . $select) . while($row = mysql_fetch_row ($result)) $database["table"].

fejezetben kifejlesztett függvények segítségével. } print("</table>"). Hogy takarékoskodjak a papírral. => "Please enter the screen name of the person:"). for($i = 0. "type" => "text".} print("<td>" . "</td>"). "type" => "text". amely adatokat fogad az űrlapból.10 ábra A person-tábla a kihagyott oszlopokkal Adatsor beillesztése Ha adatokat akarsz bevinni. => "Enter their date of birth as yyyy-mm-dd:") . => "Enter the person's reál name if their" name is fake:"). $row[$i] . egy adatforrásra van szükséged. $i < $fields. } print("</tr>"). hogy a people. ahogyan megjelennek a szkriptben. array("name" => "born".\ Gyors megoldások $fields = mysql num fields($result). " screen $question[] = "question" $question[] = array ("name" => "person". 157 . print ("<tr>") . array("name" => "comment". rendezők és producerek nevét lehet megadni. Hivatkozás: Űrlapok létrehozása függvényekkel oldal: 307 Tegyük fel. $i++) { if(!strlen($row[$i])) {$row [$i] = "&nbsp.html-oldalon színészek. \entry 'fiamé }fiom fcomment ^ ---------------------------------------------------------------------------------------1 Tom Berenger 1949-05-31 \ [2 jMimi Rogers 1956-01-27 (3 |Lorraine Bracco |4 iJerry Orbach [5 [John Rub inste in 1955-10-22 1935-10-20 1946-12-08 1937-11-30 1964-04-07 JThe world's greatest actor. ami rendszerint egy űrlap. A 9.. 6 7 11 iRidleyScott JRussell Crowe |Christopher Walken 1943-03-3l[ j 5. fejezet függvényeivel így hozható létre az űrlap: $question[] = "question" $question[] = "question" . "type" => "text". "type" => "text". röviden vázolok egy űrlapot a 9. majd úgy használom az adatokat. array("name" => "reál".".

$real . $result = mysql query($sql). Sperson . Ez a legegyszerűbb kód: mysql_select_db("movies"). Egy SQL-sztringben a mezőket sima idézőjelek határolják. ".5. ha a beszúró SQL-utasításhoz hozzáadod az updated-mezőt null értékkel. 158 . Ehhez a gyakorlathoz az alábbi adatokat fogjuk használni: $person = "Russell Crowe". born='" .11 ábrán látható.html". name='" ."1964-04-07". azaz a MySQL a következő elérhető számot rendeli hozzá. $born . " r " . hogy megelőzze egy visszaper jel. . hogy az utána következő karakter megszakítsa az SQL-utasítást. Felhívom a figyelmed az addslashes()-utasításra. így nem kell eltávolítani. A person-táblában két egyéb mező van. $born . amely visszaper jelet (\) ad a sztringhez. Az elsődleges kulcs mező egész. comment='" . A visszaper jel nincs eltá rolva az adatbázisban. mikor frissült utoljára. amit kijavíthatsz. form("people. amikor a rekord frissül. vagyis ez alapján megállapítható. És most lássuk a kódot. Sajnos a MySQL nem állít be használható értéket a timestamp -mezőnek a rekord első beillesztésekor. az oldal megkapja a színész adatait. ". ". A visszaper jel átváltási kód.11 ábra Űrlap a színészek nevének beviteléhez Mikor az űrlap kitöltője megnyomja a Elküld-gombot. Az alábbi SQL-kód illeszti be az új sort: $sql = "insert intő person set updated=null" . auto_increment-tel. Az updated nevű mező típusa timestamp. "'". ". tehát a sima idézőjeleket kell. vagyis megakadályozza. realname='" . Az 5. $comment = "The world's greatest actor. hogy néz ki az űrlap a képernyőn. Please enter the screen name of the person: Enter the person's reaJ name if their screen name is fake: Enter their date of birth as yyyy-mm-dd: Enter anv comments: Submit 5. ami beír egy új sort. addslashes($comment) . $real = "Russell Ira Crowe". mikor olvasod az adatokat. ""' .". $question). azaz a MySQL minden alkalommal frissíti ezt a mezőt. és a MySQL mindkettőt automatikusan frissíti. fejezet MySQL és PostgreSQL "questíon" => "Enter any comments:") .

majd a kapott azonosítót beillesztené az egyes filmekhez tartozó szereposztáslistába. A person-táblában van automatikusan növelt mező. mysql_error() A kód működik és ezt jeleníti meg: Success! Hogy láss egy hibát. a kapcsolat. }. A visszatérési érték az auto_increment-mező legaktuálisabb értéke az éppen futó szálban. . Képzeld el. és cseréld le az én rejtélyes üzenetemet: if($result = @mysql query($sql)) print("Success!"}. A szándékos hibának ez lett az eredménye: Error: 1054. else print("Error: " . $sql)) > * $personentry 159 . ha a táblában automatikusan növelt érték van. A mysql_errno() egy hibaszámot ad eredményül. mint a következőkben látható. " in sql: " . a name-et lecseréltem nname-re. amit a mysql_insert_id()-nak megadhatsz. ezért az utasítást közvetlenül a sikeres insert után kell helyezni. és újra lefutattam a kódot. Az egyedüli paraméter. hogy létrehozol egy oldalt.G>yors megoldások Ez az egyszerű kód durva hibaüzeneteket eredményezhet. vagyis összekapcsolhatod a filmeket és a színészeket. nname='Russell Crowe 1. Unknown column 'nname' in ' field list1 in sql: insert intő person set updated=null. born='1964-04-07'. Az oldal a csillag nevét a person-táblába írná be. a mysql_error() pedig egy hibaüzenetet. mysql_errno() . comment='The world\'s greatest actor. Kedved szerint használhatod ezeket az utasításokat. ". hogy a komment értéke sima idézőjelet tartalmaz. és ágyazd be az utasítást egy hibaellenőrző kódba. mikor új rekordot írsz be az adatbázisba: visszajelzést kérhetsz a beillesztés azonosítójáról. ezért illessz egy @-ot a mysql_query() elé. = mysql insert id() . mivel most már a kezedben van a hibaüzenetek megjelenítéséhez szükséges eljárás. vagyis a mysql_insert_id()-utasítással megkaphatod az azonosítót: $personentry = mysql insert_id().' Figyeld meg. ahol be lehet vinni egy filmcsillagot és leghíresebb filmjeit. realname='Russell Ira Crowe'. Aztán dolgozz ki valami értelmes hibaüzenetet. amit visszaper jellel láttunk el. Vagyis valahogy így: if($result = mysql_db_query(" movies". $sql). Még egy dolgot tehetsz. " . ha több aktív kapcsolatot használsz.

A mysql_error() a MySQL által legutoljára jelentett hibát adja vissza. $database["database" . és órákat tölthetsz az adatbázis félrevezető hibaüze neteinek megfejtésével. fejezet MySQL és PostgreSQL Adatbázis létrehozása Ha MySQL-ben egy új adatbázist akarsz létrehozni. és hamis ha kudarcot vall. amit nem fogadott el az operációs rendszer. ami abból fakad. else print("<p>Failed ". a következő példa a hibaüzenetet mutatja. $database["database"] . amit a következő példa mutat. mert már létezett az adatbázis: Failed to create database movies. és mindkettőre érvényesek az operációs rendszer megszorításai. a kód egy movies nevű adatbázist próbál létrehozni. ám a PostgreSQL-ben vannak táblaszerű konst- 160 . Mikor adatbázisokat és táblákat hozol létre SQL-en keresztül. milyen a mysql_error() eredménye. error: Can't create database 'movies'. mysqlerror() . Mindkét adatbázisban vannak különleges funkciók. "</p>"). egy szóköz a tábla nevében). vagy új szerverhez kapcso lódsz és nincs megfelelően konfigurálva. a PostgreSQL-ben a pg_exec()-t. if(mysql_create_db($database["database"])) print ("<p>Created database " . sikerült -e a művelet vagy sem: $database["database"] = "movies". ha nincs jogosultságod adatbá zis létrehozására. engedélyezési hiba. tehát nem lehet félreérteni. Táblák létrehozása A táblák létrehozása és egyéb SQL-művelet futtatása közt nincs sok programozási különbség. és az a kevésbé nyilvánvaló hiba. Az érvén ytelen adatbázisnév azért fordul elő. a táblából pedig fájl lesz. Egy dologról ne feledkezz el: az adatbázisból könyvtár. amely már létezik a tesztgépemen. hogy olyan névvel pró báltál adatbázist létrehozni. Könnyű elkövetni egy apró hibát (mint pl. .5. A mysql_create_db() visszatérési értéke igaz. amit azért kaptam. Database exists Egyéb hibalehetőségek: nem sikerül kapcsolódni a szerverhez. amit a fejezet első Azonnali megoldásában bemutatott kóddal tehetsz meg. Hogy hibát provokáljon (hogy hibaüzenetet láthass). könnyen megfeledkezhetsz a szerverről és az operációs rendszerről. error: " to create database " . amit használsz. mert a MySQL megpróbál az adatbázis számára egy azonos nevű új könyvtárat létrehozni. használhatod a PHP mysql_creat_db()-utasítását. ha sikerrel jár. A példa feltételezi. hogy már kapcsolódtál a MySQL-hez. A kód hiba esetén a hibaüzenet előtt egy saját megerősítő üzenetet is megjelenít. amit az operációs rendszer visszautasít. I Hogy lásd. A MySQL-ben használd a mysql_query()-t.

és van még néhány további lépés. ha az SQL-utasítás működik és hamis. $database["sql"] = "create table " . Átmeneti szálláshelyként is létrehozhatsz táblákat köztes adatok számára. és ugyanez a kód más SQL-utasításokkal is használható. bizonyos esetekben a nézet életképes alternatívája lehet az új tábla létrehozásának. ha nem. " . de nagyszámú session esetén az adatbázis-bejegyzések hatékonyabbak. "</p>"). mint pl. A kód többi része. a hibaüzenet rész és a mysql_error()-utasítás megegyezik az előző. melynek visszatérési értéke igaz. " (movieentry int (10) unsigned default '0' not null. mint a nézetek. A PHP Windows-os. Ezeket a lépéseket abban a sorrendben követjük végig. $database["table" ] . Windows 2000-es és NT-s előre lefordított verzióiban már eleve szerepel ez az opció. mysql_error() $database["table"] Most már képes vagy táblákat létrehozni egy szkriptből. A tábla létrehozását szolgáló SQL-utasítás a mysql_query()-parancs argumentumában szerepel. Adatbázisok használata session-ökhöz A PHP session-kezelése jól működik fájlokkal is. és képes vagy megtölteni a honlapodat különböző trükkös megoldásokkal. A következő példában a mysql_select_db() -utasítás az első. pl." . ". El kell végezned néhány dolgot. ha adatbázist akarsz használni a session-ökhöz. " primary key (movieentry. $database["table"] = "director". $database["table"] . Mikor a PHP-t telepíted. dinamikusan létrehozott tábla egy bolt minden termékkategóriájához. mikor a lecseréled fájlrendszert vagy az adatbázist. mint pl. if(mysql query($database["sql"])) print("<p>Created table " . drop table director-táblák törlése. mielőtt session-öket használhatnál. else { print("<p>Failed to create table . 161 ."." . Gyors megoldásokban bemutatott kóddal: $database["database"] = "movies". a PHP fordításakor meg kell adni az --enable-trans-id-paramétert annak érdekében. " directorentry int (10) unsigned default '0' not null.Gyors megoldások rukciók is. „Adatbázis létrehozása" c. ha a böngésző nem fogad cookie-kat." . hogy a PHP session-azonosítókat adhasson az URL-ekhez. mysql_select_db($database["database"]) . " personentry int (10) unsigned default '0' not null. " comment text not null. és kiválasztja az adatbázist. amelyben a webszerver és a PHP telepítésekor elvégeznéd őket. „Kapcsolódás az adatbázishoz" c." . error: " . directorentry)). Gyors megoldások megnyitott kapcsolatot használja. " updated timestamp(14) .

elvégezni a változatásokat a php. majd pedig újra betölti őket a memóriába.save_handler = user-beállítás van érvényben. Mikor egy session megkezdődik. hogy a session a böngésző bezárásáig tart. melynek az alapértelmezése 0. fejezet MySQL és PostgreSQL A php. ami a 4. mint például fogyasztói profil vagy az aktuális rendelés teljesítése. MySQL esetén időt spórolhatsz meg ezzel az SQL-utasítással: create table session ( id varchar(32) binary not null. hogy a session.cookie_lifetime-ot. akkor a PHP minden szkript futásakor beolvassa a php-ini-t.5. Ha már valami máshoz használsz cookie-kat.ini-t. A session-azonosító oldalról oldalra vándorol.ini-ben beállítod. data text not null. majd újraindítani az Apache-ot. egy új session-azonosítót kap.use_cookies = 1 beállítása révén automatikusan használod a cookie-kat.ini-ben be kell kapcsolnod két opciót: a track_vars-t. vagy cookie-k. amit mindaddig megtart. hogy biztosítani tudd a sessionkezelő rutinokat.vagy a session_start()parancsokkal. Hozz létre egy sessions nevű adatbázist és egy session nevű táblát.name = PHPSESSID. Akkor alkalmaznád az automatikus session-kezdeményezést. győződj meg róla. tehát a php. updated timestamp(14). vagy manuálisan is indíthatsz szkriptből.ini-t.0. amíg meg nem semmisül a session_destroy() által. akkor merül) el az automatikus cookie-k tanulmányozásában. A manuális használat lehetővé teszi.ini session. és akkor kezdeményeznéd manuálisan. Miközben módosítod a php.ini-ben. hogy a php. Ha a session-ök a bejelentkezéshez kapcsolódnak. A cookie-k neve session. primary key (id) 162 .ini-ben eszközölt változtatások azonnal érvényesülnek. ha nem használsz session-öket. ha a php.auto_start = 1. ha csak egy bi zonyos személy bejelentkezése esetén akarsz session-t használni. ha egy újabb szkript ugyanahhoz a session-höz kapcsolódik. hogy session. a session. hogy áthelyezhesd az adatokat a cookie-kból a session-rekordokba. ami akkor is hasznos. akkor kijelentkezéskor a session_destroy()-utasítással szüntetheted meg őket. Mivel a sessionazonosítója egyedi a honlapodon. ha a honlapod összes látogatóját követni szeretnéd. Automatikusan indíthatsz session-öket. a session_register(). vagy inkább manuálisan. hogy a PHP beolvassa a frissített php. vagy URL-ek által. ami azt jelenti. kulcsként használhatod azt a session-adatbázisban. míg ha Apache-modulként lett telepítve. Ha a PHP-t CGI-ként futtatod. Megváltoztathatod a nevet és az élettartamot. A session-adatokban lévő információkat pedig alkalmazhatod tetszőleges adatbázisokra való hivatkozásra. akkor le kell állítanod az Apache-ot. használhatod a korábbi Azonnali megoldásokat vagy előre megírt adatbáziskezelő alkalmazást.4-es verzió felett automatikusan bekapcsolódik és a register_globals-t. különös tekintettel a cookie-k használatának a session-kezeléssel történő összekötésére. Eldöntheted. vagy túl nem lépi az időkorlátját. A PHP a szkript végén a merev lemezre menti a session-információkat. hogy leellenőrizd a cookie-k működését még mielőtt látogatóid elégedetlenkedni kezdenének.

fejezetben említett adatbázishoz. "mysql_session close". A session_set_save_handler() az utasítások definiálását szolgálja. amelyeket különböző oldalakon regisztráltál egy session-ben: session_set_save_handler("mysql_session_open". mint a következő példa mutatja: if(isset($newcategory) and strlen ($newcategory)) { $category = Snewcategory.ini-ben be van kapcsolva az automatikus feldolgozás. mint ahogy megteheted. hanem a session-rekord erre rendelt mezőibe írod a változókat. akkor a session_unregister("category")-utasítással engedheted el. majd a session indítása a session_start()-utasítással vagy a session_register()-parancs első használatával. vagy a session-kód meggátolta a szkript hátralévő részét a fejléc elküldésében: 163 . pl. Mikor a session kezdetét veszi. ha az adatok egy külön adatbázismezőben vannak eltárolva. A session-ök feldolgozása a feldolgozó utasítások definiálásával kezdődik. Amikor egy változó el van te metve a PHP session-rekordjában. ezt tennéd egy fogyasztói profil változóval. Akkor tennéd azt a $category-val. és minden formok által létrehozott változót felülír. de a korábbi Gyors megoldások kódjai alapján lefordíthatóak PostgreSQL-hez vagy más. a 6. Ezt követi az utasítások regisztrációja. az adatbázisban való eltárolásához. "mysql_session_write". Ez azt jelzi. A session-rekordok készítéséhez. Ha egy formon keresztül sze retnéd egy új kategória kiválasztását biztosítani a látogatónak. akkor nevezd át a változót $categoryra és illeszd be az alábbi kódot a szkriptbe: session_register("category"). valamint a változók első használatát. hogy a szkript kezdetén törlődik. hogy a $newcategory átadja a kiválasztott kategóriát a Scategory-változónak.Gyors megoldások Jf A további példák MySQL-en alapulnak. Ha már nincs szükséged egy változóra. visszanyeréséhez és az elavult rekordok törléséhez számos utasításra van szükséged. majd a szkript kezdetén újra betölti. ha azt szeretnéd. akkor valami más nevet kell adnod a mezőnek. Ha szeretnéd lehetővé tenni a látogatóknak. hogy kivál asszanak egy kategóriát és szeretnéd ezt session-ök révén megőrizni. és megelőzi a session_start()-ot vagy az első session_register()-t. Ha a php. pl. "mysql_session_destroy". akkor a session feldolgozása a session_set_save_handler()-utasítással kezdődik. hogy a session túl későn próbálta meg elküldeni a cookie-kat. az alábbihoz hasonló hibaüzeneteket kaphatsz. és a szkript futásának végén a PHP elmenti a session-rekordba. de ne feledd. hogy nem regisztrálod. mint a következő kódban látható. hogy egy online oldal kategóriánként felsorolja az aktuális látogatók számát. Snewcategory. akkor nem használhatod úgy az SQL-t az adatok kiválasztására. "mysql_session gc"). Úgy is dönthetsz. A $category-vákozót bármikor létrehozhatod. A session-változó elmentéséhez egyszerűen regisztráld a változót a session_register() -utasítással. rendezésére vagy összegzésére. "mysql__session_read". ha az illető kijelentkezik. majd kiegészítened a szkriptet.

txt". ugyanis általában ez szükséges a fájl alapú session-ökhöz. ami megnyit egy session-t. akkor ezek az üzenetek meggátolják a szkript többi részét a fejlécek elküldésében. $session["password"] = "". beleértve az eltévedt karaktereket. közvetlenül a session kezdete után. if<$session["connection"] = @mysql pconnect($session["server"]. function mysql session open($path. fejezet MySQL és PostgreSQL Warning: Cannot send session cookie . és állandó session-t is megnyithatsz. ezért győződj meg arról. hogy minden oldalad PHP-módban indul (<?php). Mielőtt a session_set_save_handler()-t használnád. a mysql_session_open()-t. Ha a session-kódod figyelmeztető üzeneteket eredményez. amíg a session elkezdődik. amely a függvények számára egyetlen globális definícióval elérhető. de tisztább. $session["log"] = "t:\mysqlsessionlog. 164 . Ez azt jelenti. $name) { global $session. mysql_session_log("mysql_session_open"). A PHP biztosít egy utasítást. $session["user"] = "". $session["user"]/ $session["password"])) { if(!isset($session["fields"])) { $result = mysql üst fields ($session ["database"] .headers already sent by_ Warning: Cannot send session cache limiter . ha mindent a standard Ssession mezőkben tartasz: $session["database" ] = "sessions". amelynek a fájlelérési utat és egy session-nevet kell megadni. Megadhatod az adatbázis és a tábla nevét. ezért gondoskodj arról. ha egy ilyen hibaüzenetet kapsz: Fatál error: Failed to initialize session modulé A PHP-session-ök kezeléséhez szükséged van egy utasításra. és az összes többi adatbázis-tevékenység a többi adatbázis közt oszlik meg. Az alábbi MySQL példa egyszerűen megnyit egy állandó kapcsolatot a MySQL-szerverrel. ami nem a webszervereden van. mikor több szervered van. A PHP4 az egész kód szintakszisát leellenőrzi futtatás előtt. mivel a PHP session-kód szintén küld ilyen fejléceket. amelyek megakadályozzák az oldal gyorsítótárba való betöltését. A $session változó egy session-ökkel kapcsolatos információk felsorolását tartalmazó tömb. $session["host"] = "localhost". Ha ezt elmulasztod vagy elgépelsz valamit. hogy a kód rendezett vagy strukturált módszerrel egyaránt hozzáfér a $session részeihez. akkor a következő hibaüzenetet kapod. Ssession["table"] = "session".5. akkor ezeket elhagyhatjuk. definiálnod kell az általa meghívott függvényeket. és mindaddig abban marad. amelyeket esetleg észre sem veszel.headers already sent Fatál error: Failed to initialize session modulé A cookie-k HTTP-fejlécek és a HTTP-fejléceket elsőként kell elküldeni. több Apache-webszerver osztozik a session-ökhöz rendelt adatbázison. Ha a szkript olyan fejléceket küld. minden más output előtt. hogy a fejlécek elküldése az oldal tetejére kerüljön. pl. vagyis a függvényeidnek hibátlannak kell lenniük. A session-öket olyan adatbázison is tárolhatod.

észreveheted. $result_fields = mysql_num_fields($result). } mysql_session_log("Connect failed to server: " . return(falsé). $message . ha nem a saját szervereden van a honlapod). hogy csökkentsük a megnyitásokat és lezárásokat. ") . mivel mindkét utasítás akkor hajtódik végre. A MySQLkapcsolatot nem kell lezárni. A kódot a mezőnevek és mezőtípusok megállapítására írtam.(kiíró) és session close. és a mysql_session_close() pont ezt teszi a session-nel. for($i = 0. mysql_field_type($result. hogy tudd. Ez a függvény egyetlen naplóüzenetet küld el. azt egyszer le is kell zárnod. $i++) { $ s e s s i o n [ " f i e l d s " ] [ m y s q l _ f i e l d n a m e ( $r e s u l t . Ha megvizsgálod a mysql_session_open()-függvény kódját.Gyors megoldások Ssession["table"]. hogy el tudd különíteni a bejegyzéseket. mikor az oldal az utolsó adatot is elküldte a böngészőnek. $session["connection"]). amikor elkezdesz különálló mezőket hozzáadni a session táblához. amit bármikor böngészhetsz. vagyis mindkettőt használhatod a session-rekordok adatainak kezelésére szolgáló kiíró és olvasó függvényekben. Azonban ha adatbázist használsz. Az előző kódban használt és a következőben bemutatott mysql_session_log()-függvény azért készült. melyik teszt eredményezte az adott bejegyzést. $i < $result_fields. mert a session write. akkor a napló idejét lecserélheted a PHP microtime()-jára3 és a 165 . $database["server"] . plusz a mezők neveinek kinyerésére szolgáló kódból egy későbbi Gyors megoldásból. amely a kapcsolat létrehozására szolgált az első megoldásban. MySQL error: " . " a " ) ) { fwrite($file. Amit megnyitsz. "\n"). A napló tartalmaz egy dátumot és egy időt. hogy hozzáférést kapj a fájlokhoz (ami néha előfordul. $i)] = return(true). date{"Y-m-d H:i:s fclose ($file). A mysql_session_log() egy külön fájlba írja a naplóbejegyzéseket. ". mysql_error()). és minden üzenet végére odatesz egy újsor (newline) karaktert. és mivel ezek nincsenek eltemetve az Apache vagy a PHP naplóállományaiban.(lezáró) utasításokkal nem jeleníthetsz meg diagnosztikai üzeneteket a képernyőn. mikor egy szerkesztőprogramban böngészed a szövegfájlt: f un ct io n m ys ql _s es sio n _l o g( $ m es s ag e) { i f ( $ f i l e = fopen($session["log"] . hogy a korábbi gyors megoldásokból származik: pontosabban abból a kódból. nincs szükség erre a függvényre. valójában szándékosan állandó kapcsolatként volt megnyitva. nem kell az Internetszolgáltatóval küzdened. amely a tesztelés segítségére szolgál és aztán kitörölhető (ha a teljesítményt szeretnéd tesztelni a honlapodon.

A mysql_fetch_array() második paramétereként megadott MYSQL_ASSOC révén az eredményként visszaadott tömb elemeit csak kulcsszavakkal lehet elérni. $id . return (true). mely a mysql_query()-utasítást használja a „Táblák adatainak megjelenítése" címen a Gyors megoldásokban ismertetett módon. return ("") . hogy tetszőleges számú mezőt hozzáadhatsz a session táblához. hogy meg kellene változtatnod a mysql_session_read()-et: function mysql_session_read($id) { global $session. A visszatérési érték a data nevű mező tartalma lesz. } } return($row["data"] ) . // This point means there is not yet a record. mysql_select_db($session["database" ] ) .5. $session["sql"] = "select * from " . hogy egy ciklus úgy menjen végig egy soron. fejezet MySQL és PostgreSQL mysql_session_close() naplóbejegyzésének idejét tekintheted a szkript befejezésének időpontjaként): function mysql_session_close() { mysql_session_log("mysql_session_close"). $v) = each($row)) { if($k != "data") { $session[$k] = $row[$k]. $session["sql"]}. " where id='" . mysql error () 166 . A plusz kód azt jelenti. else { mysql_session_log("Session read query error: " . mysql_session_log("mysql_session_read") . mint egy tömbön. " using sql " . míg a többi mező a mezőnév szerinti indexszel a $session változóba kerül. MYSQL_ASSOC)) { while (üst ($k. $session["connection"])) ( if($row = mysql_fetch_array($result. indexszámokkal nem (az alapértelmezés szerint mindkettő használ ható). if($result = @mysql_query($session["sql"] . melynek elemeihez tartozó kulcsszavak a mezők nevei. } else { return(""). } A következő kód a mysql_session_read()-függvény. Ez a trükk lehetővé teszi. és automatikusan visszanyerheted őket anélkül. $session["table"] . és mindössze néhány új dolgot csinál.

mert ezt külön illesztjük be az SQL-be. $id . _ $session["connection"] ) ) { if(mysql_affected_rows($session["connection" ] ) ) { mysql_session_log("mysql_session_write update using sql: " . "'".= ". " ' ". ". néhányat kitörlünk a tömbből: a updated-et. if (ísession["result"] = @mysql db query(Ssession["database"]. $v) = each ( $ f ields_list) ) I if(isset(Ssession[$k])) Sfields sql . a mysql_session_write() a session-azonosítót és a session-adatot fogadja bemenő paraméterként. Sk . return (true). id='" . $fields_list = $session["fields"]. Ssession["sql"]. Ssession["table"] . unset($fields_list[ "data"] ) . mert ezt az adatbáziskezelő szoftver frissíti. a datamezőt. Mielőtt a mezők bekerülnek az SQL-be. mint korábban. Ssession["connection"])) { mysql_session_log("mysql_session_write insert using sql: " . $data) { global Ssession. else // Update failed so insert new record: Ssession["sql"] = "insert intő " . "'". " . A kód az SQL-utasítás dinamikus generálásához a mysql_session_open() által létrehozott mezó'felsorolást (Sfield_list) használja. $session["sql"]). if ($session["result"] = @mysql_query(Ssession["sql" ] . mert frissítéskor nem kell azonosítót beilleszteni: function mysql session write($id. $session["table"] . $fields_sql . "=' addslashes($session[$k] ) Ssession["sql"] = "update " . mysql_session_log("mysql_session_write"). addslashes($data) . Az SQL kezelése ugyanaz. Ssession["sql"]). mysql_select_db(Ssession["database"]). Az addslashes() révén megbízhatóan beillesztheted a szöveges adatot az SQL-en keresztül. és az azonosítót. a mysql_session_write() feltételezi. " where id='" . u ns et( $ fiel ds _list ["i d" ] ) . és megpróbál frissíteni egy létező rekordot. $session["id"] = Sid. $fields_sql = " set data='" . hogy a session most próbált először az adatbázisba írni. Ha a frissí tés nem sikerül. az id-t. unset ( $ f ields_list["updated"] ) . 167 . $fields_sql .Gyors megoldások A session-t kiíró függvény. while (üst ( $ k . $id . és beilleszt egy új rekordot.

A szemét session rekordokat jelent. "'". akik 3 hétre elutaztak. " using sql " . Ssession["sql"] = "delete from " . } else { mysql_session_log("mysql_session_write insert error: " . vagyis kitöröl heted azokat a sorokat. return(falsé). Ssession["table" ] . 1 else { mysql_session_log("mysql_session_write update error: " . " using sql " . return(falsé). Ssession["sql"]). Az öregség definícióját úgy kapod. amelyeket olyan látogatók hagytak. $id . és a bekapcsolva hagyott böngésző az állandó Internet-kapcsolaton keresztül ugyanazt az oldalt böngészi. amit az adatbáziskezelő frissít. amelyekben az updated-mező túl öreg. mysql_select_db(Ssession["database"]). mysql^error() . } A mysql_session_destroy()-függvény a mysq_query()-t használja a megadott session-azonosítóval rendelkező session-rekord törlésére. fejezet MySQL és PostgreSQL return (true). $session["sql"]).5. _ Ssession["connection"])) { return(true). Ha ez a kód véletlenül meghagy egy rekordot. akik nem jelentkeztek ki az oldalról. $session["id"] = $id. hogy a mező értékét az aktuális idő és a php. " where id = '" . Minden rekordnak van egy updated nevű mezője. vagy olyanok. mysql_session_log("mysql_session_destroy") . return(falsé). mysql_error() . akkor a következőkben bemutatott szeméteítakarító kód fogja kitörölni: function { mysql_session_destroy($id) global Ssession. Ssession["sql"]).ini-ben beállított session lifetime (élet- 168 . mysql error () A PHP session-kezelése magában foglalja egy session után fennmaradó szemét eltakarítását is. else mysql_session__log ("Session destroy error: . " using sql " . if(Ssession["result"] = @mysql_query(Ssession["sql"] .

amelyek a GMT-t. A kód megtisztítása A legegyszerűbb módon úgy foghatsz neki a MySQL vagy a PostgreSQL adminisztrálásá hoz. time() .net-en vagy a sourceforge.Gyors megoldások tartam) különbségével veted össze.net-en. Az egyedüli hibalehetőség. melyek a legfrissebb vagy legkeresettebb fogalmak. Megállapíthatod. $session["gcdate"] = date("YmdHis". és megkönnyítik az adatok más forrásokból való importálását. ahelyett. Ha van keresési lehetőséged. hogy kísérletezz. A PHP-ban vannak utasítások. $session[Msql"] = "delete from " . táblák és mezők létrehozásá hoz. amiből a date()-utasítással kapsz MySQL formátumú dátum/időt. megnézheted az ajánlásaimat a petermoulding. mysql_select_db <$session["database"]). példakódokat és példa SQL-utasításokat biztosítanak. a phpMyAdmint vagy a phpPgAdmmt. amely MySQL-lel működik de módosíthatod más adatbázisokhoz. A MySQL függvényeit is használhatnád az idő meghatározására és számítására. } else mysql_session_log("Session gc error: . Ssession["table"] . tehát a time() eredménye egyszerűen kivonható a lifetime -ból. így írhatsz egy lekérdezést. amelyek a helyi időt adják meg. amivel online megtudhatod. if(Ssession["result"] = @mysql_query($session["sql"] . hogy PHP-ban végzed a számításokat. valamint a lifetime mind másodperc alapúak. _ ?session["connection"])) { return (true). lehetőséged nyílik arra. ha a szerver helyi időhöz van állítva. 169 . vagyis módosíthatod a session-jeidet és elemezheted a rekordokat. hogy lásd az eredményt. mysql_session_log ("mysql_session__gc") . mint pl. Ssession["sql"]). Ezek segítséget nyújtanak az első adatbázisok. hogy a session-adatokból próbálnád előásni. " mysql_error() Mos már birtokában vagy a mágikus session-kódnak. ha telepítesz egy előre megírt alkalmazást. és vannak. míg a MySQL a GMT-hez vagy fordítva. $session["gcdate"] . return (falsé). A time(). honnan böngésznek és mit keresnek. kik látogatják a honlapodat. Könnyedén hozzáadhatsz egyes mezőket a session -rekordhoz. vagyis bármilyen szerverhez vagy beállításhoz alkalmazkodhatsz: function mysql_session__gc ($lifetime) { global Ssession. akkor a keresési sztringet kezeld külön mezőként a session -rekordban. Ha szeretnél ilyen al kalmazásokat találni. vagy kereshetsz a fershmeet. " ' " . de azáltal.com -on. " using sql " .$lifetime). és lehetővé teszik. " where updated < '" .és date()-függvények.

(és require-) parancsokat: include("footer.php"). Mivel egy ilyen kézi módosítást minden alkalommal el kell végezni. akár más fejlesztők kódját is finomíthatod. a phpPgAdmin. hogy kiszűrd a függvénynevek után előforduló szóközöket és el kell távolitanod ezeket. Egyszerűen cseréld ki a . szeretnéd megtisztítani a hibáktól. Mikor kódot tisztítasz. amelyeket a következőkben ismertetek: include ( "footer.(beágyazás) könyvtárához. A require()-utasítás megegyezik az includeQ-dal.php-t az include_suffix-ra. le kell cserélned erre a formára: include(". és alkalmazhatod azokat az általános változtatásokat.5.inc. mint pl.php"). mint a második sor. a requireQ és a require_once() összes előfordulását is. include_suffix).inc. hogy a helyi könyvtárból ágyazd be az include-fájlokat.php").inc. Ha a beágyazott fájlok létrehozása megfelelő volt. Ezért egy globális keresést kell futtatnod a kódon a " ("-sztringre. a következő formájú include. függetlenül attól. Még tovább fejlesztheted a kódot. így a Ford szintű kódok Mercedes színvonalra emelkednek. Az include()-ot lehet If()-fel vezérelni. és néhány Internet-szolgáltatónál könnyebb létrehozni egy kisméretű. és példának a phpPgAdmin 2./footer. Az előre megírt kódok feltételezik. és a következő formátumra cseréld a kódot. A változtatásokat bármire alkalmazhatod. hogy megbízható hozzáféréssel rendelkezel a PHP include. ne felejtsd el lecserélni az include_once(). jelszavas hozzáférésű adminisztratív alkönyvtárt. menj tovább egy lépéssel. gyakran van szükséged a függvények megkeresésére. a helyi könyvtárból kell beágyaznod a fájlokat. és felkészülhetsz arra a napra. még a feltételes állítások. nem fognak biztonsági vagy megbízhatósági problémákat okozni a böngészőben.php") . "footer. Ha már alkalmaztad ezt a javítást a kódra. ha módosítod a website konfigurációs beállításait. pl.inc.php utótagot lecseréled valami másra. if()-ek előtt. ez a rész ezzel a kérdéssel foglalkozik. de a require()-utasítás mindenképpen beilleszt egy fájlt. fejezet MySQL és PostgreSQL Ha már van kódod. hogy olyan kódot használhass. include( " f ooter. Ahhoz. mondjuk áttérsz a . hogy a kód úgy nézzen ki.inc" . de sok Internet-szolgáltató nem biztosítja a szükséges hozzáférést.3-at használja. de a legtöbb kódban keverednek az első példában bemutatott megoldások. hogy milyen kódba van beágyazva. de a PHP sokkal hamarabb feldolgozza. tehát ahhoz.inc. mikor a . mint itt látható: include(include_prefix . "footer. Az include_prefix-hez hozzáfűzöd a fájlnevet. akkor megbízhatóan rákereshetsz a függvényekre. Ha lecseréled az include()-ot. és egy mozdulattal módosíthatod az összes előfordulását: include{include_prefix .php"). mint egy saját PHP include-könyvtárat kapni. így az előtagot csak egy helyen adod meg. 170 . vagyis néhol egy szóköz szerepel az utasítás neve és a zárójel között.php5-re (ami már tervbe van véve).

inkább ki cseréltem az include-parancsokat. Az isset() nem működik konstansokkal. define("include_suffix". Én a fájl nevét plusz az _included utótagot használom. azaz az include. 171 .html").html-hez egy $include_included nevű változót használok. ". A standard definíciók beágyazásához minden PHP-oldal tetején el kell végezned egy egyszeri beillesztést. Ha a webszerver a .php3 kiterjesztésű oldalakon volt. hogy aztán újra el kelljen végezni ezt a műveletet.html nevű fájlt (vagy include.html-fájlokat). Egyszer akkor fogtam bele egy ilyen vállalkozásba.php"). Ahelyett. Az include included-ot változóként használom. de megvan a módja. hogy az egyik részt manuálisan kijavítottam volna. adj egy változót a kódhoz .mint a következő példa mutatja -. függetlenül attól. Az összes alkalmazásodban használhatod a fájlt. Bármilyen helyi konfigurációs információt megadhatsz az ínclude.html-t nem PHP-ként értelmezi. hogy más honlapokhoz is passzoljanak az oldalak.Gyors megoldások Az includeprefix-et és include_suffix-et valahol meg kell adni./"). Én minden weboldalamat PHP -módban kezdem./include. és ha rosszul van beállítva. ezt a megközelítést használd. akkor lehet. ha a webszerver nem a PHP-vel dolgozza fel a . amely követi a standard elnevezési megállapodást.html-t beágyazó include()-utasítást feltételes include-ra cserélem és requireQ helyett include()-ot használok. hogy az include-fájl beágyazása megtörtént. egy másik részükre mindenképpen szükség volt. ha a k onstans nincs definiálva: <?php $xnclude_included = "yes". hogy az include-html-fájl kompatíbilis legyen a require_once()-t és az include_once()-t nem tartalmazó PHP-verziókkal. A require_once() csak a PHP4-ben szerepel. Ahhoz. mi következik utána: <?php require^once(". amit a következő kód mutat. annak érdekében. mert a konstansok problémát okoznak. akkor . de vannak. hogy le kell cserélned a fájlnevek végződéseit egy alkalmazásban. A három soros példa bármilyen oldal kezdetéhez passzol. mert a require() nem működik az if()-utasítással. hogy lekódold a megfelelőjét PHP3-ban. . ezért hozz létre egy kis include. ahogy a következő kód mutatja: <?php define("include_prefix".php"). a defined() egy hibaüzenetet eredményez. ha egy feltételben vizsgáljuk őket. Az include. ". és azt tanácsolom. és azt jelzi. hogy tartalmazzák az include_suffix-et.phtml kiterjesztésű oldalakban szerepelt. define{"include prefix".html-ben.php-t kell használnod.html-ben. majd add meg az értékeket az include. define("include_suffix". a következőkben ezt mutatjuk be. /") . hogy illeszkedjen a másikhoz. akik HTML-módban kezdik és aztán ide-oda ugrálnak. és a konstansok hoz alkalmazható megfelelője. hogy a <?php-t ki kell cserélned <?-re. amikor a kódjaim egy része . " . ha az zal szembesülsz. a harmadik részük pedig . ".php-t.

ha a változó nem létezik: if (! isset <$short__realm) ) { $short_realm = "".php könyvtárából kimásolva. ":local". hogy a php. Mivel te bekapcsolt figyelmeztetésekkel fogod futtatni őket. mint amilyen a phpMyAdmin.iniben kikapcsolták a figyelmeztető üzeneteket. hogy a $short_realm-változó létezik. hogy a fejlesztőknek visszajelzésként elküldöd a változtatásaidat. ezért egy figyelmeztető üzenetet eredményez. és egyszerűen azt feltételezi. Ez a kód a phpPgAdmin 2.} Más figyelmeztető üzenetekre is számíthatsz. és akár a nyílt forráskód hősévé is válhatsz. Ha módosítasz egy kódot és eltemetett változót találsz. 172 . Ha egy figyelmeztető üzenetet kapsz. Az ilyen sorokat: if ( Iprintview) cseréld le erre a kiterjesztett változatra: if (!isset(printview) or íprintview) Néhány szabadon hozzáférhető kód azt feltételezi. ezért megkönnyítheted az életedet és másokét is. akkor így nyerheted ki a változót: $short_realm . akkor szentelj egy keveset az idődből arra. hogy könnyedén felfedezed a sztrin gekben eltemetett változókat. ha kiásod a változókat. $short_realm . A hiba kiküszöböléséhez beillesztettem egy sort.= $HTTP_HOST . mint a $HTTP_HOST a következő sorban. de nem minden editor képes (más színnel) kiemelni az eltemetett változókat.inc. a phpPgAdmin-t és sok hasonló kódot úgy teszteltek. Ha nyílt forráskódú alkalmazást használsz. és huzamosabb ideig használod. A phpMyAdmin-t. így a következő verzióból talán kevesebb hibát kell kitisztítani. hogy a hiányzó változók nem szükségesek. fejezet MySQL és PostgreSQL <?php if(!isset($include_included)) { include(". annyit változtathatsz. hogy az if()-ekhez hozzáadod az isset()-utasítást.5. és sok programozási trükköt kell kijavítanod. amikor a nem létező változóhoz próbál meg adatokat hozzáfűzni. egy rakás üzenetet fogsz kapni a nem definiált változók miatt. és mindenféle gépelési és logikai hibát megengednek. hogy megbízható kódot kapj. minden PHP-alkalmazás megtisztítására képes leszel./include.= "$HTTP_HOST:local". vagyis a kódok azt feltételezik.html" ) .3 lib. Ha keresztülrágod magad ezen a könyvön. amely egy üres változót hoz létre.

fejezet Adatbázisok Gyors megoldások Adatbázis elérése ODBC-vel Eredmények Hibák Mezőkkel kapcsolatos információk További utasítások Új utasítások Adatbázis elérése DBA-utasításokkal Adatbázis elérése DBM-utasításokkal Adatbázis elérése DBX-utasításokkal Ingres II elérése Időzítések kinyerése: út a teljesítményhez 192 195 199 199 200 204 205 205 206 206 208 oldal: ■iX .6.

a PostgreSQL mögött álló csapat jelenleg is dolgozik az SQL99 továbbfejlesztésén.6. akkor egy széles skáláról választhatsz. Az SQL92 a legrégebbi SQL-szabvány. és segít a megfelelő. E fejezet révén jobban megértheted. mint az első. A PHP -ban semmi nem befolyásolja közvetlenül az indexek használatát. Ez a Ford egyik takarékos modelljének egy ausztrál hirdetését juttatja eszembe: noha az ausztrál törvények szerint az ablaktörlő kötelező. Az SQL99-szabvány az SQL92-t váltotta fel. hogy SQL99-kompatíbilis adatbázist próbálj választani. egy floppylemezre felmásolható adatbázisoktól kezdve az MP3-at és filmeket tároló és lejátszó adatbázisokig. J Indexeljünk vagy ne indexeljünk A táblák indexelése növeli az olvasási teljesítményt és lelassítja a frissítést. A Microsoft SQL szervere pedig azon rendszergazdák millióiból húzott hasznot. SQL Az SQL olyan az adatbázisok számára. hogy a fejlesztők a jövőre gondolnak. nem szabványos SQL-kiterjesztéseket kell használnod. és a legtöbb adatbázis ugyanúgy támogatja. Rengeteg különleges igényt kielégítő választási lehetőség van. ami rendkívül nagy erőssége az SQL92-nek. fejezetben nem tárgyak adatbázisokról szól. nagy rendszerekre szabott adatbázis tűnik ki. ezért ahhoz. hogyan működnek az adatbázisok. hogyan értelmezi az adatbázis-kezelő szoftver az SQL-t. mi a szabvány és mi nem. a PHP által támogatott adatbázis kiválasztásában. Az Oracle. és számos nagygépes rendszeren elérhető. Az IBM DB2-je az IBM legnagyobb partnereinek kedvenc adatbázisa. a világon mindenhol használják. hogy pontosan megmondják. mint ahogyan a korai böngészők támogatták a HTML-szabványt. hogy egy átlagos alkalmazást készíts. fejezet Adatbázisok Áttekintés Számos adatbázist használhatsz a honlapsod kiszolgálására. Azt tanácsolom. és számos. a Ford az ablaktörlőt az „ingyenes ext rák" közé sorolta. akik korábban a legnagyobb számítógéprendszerek használói voltak. ám az SQL92 nem nyújt teljes körű megoldást. akik már az oviban MCSE tréningre jártak. mint pl. Mindamellett az SQL92 nem követeli meg az adatbázis-szállítóktól. A PHP-ban két dolgot tehetsz: telepíthetsz egy felhasználóbarát-adatbázis karbantartó interfészt. pl. Ha a MySQL nem igazán megfelelő' és a PostgreSQL túl bonyolult. és az egész kérdés lényegében azon múlik. jelezve. és a fejlesztők egy kis csoportja. amelyekhez képest a PostgreSQL a kezdők játékszerének tűnik. Fontos dolgok hiányoznak ebből a szabványból. kezdve a MySQL-nél sokkal kisebb adatbázistól az egészen komolyakig. Ez a fejezet az 5. a 174 . adatbázisokhoz hasonló szerkezetű fájltípus szolgál ki egyedi alkalmazásokat. mint a HTML a weboldalaknak.

Előfordulhat. amelyek lehetővé teszik. hogy újra fel használja a már létező adatbázis-kapcsolatot. Kapcsolatok . és valami meggátolja az állandó kapcsolatot. ismerkedj meg a PostgreSQL-lel és alapozd relációkra az adatbázisod. ha nincs. vagyis az eredményeid eltérhetnek a tapasztalataimtól. a jelszó és minden egyéb. a biztonsági öv bekapcsolása inulás előtt stb. mint amennyit megoldanak . az eredmény hagyományos kapcsolat lesz. Ez a fajta szoftveres biztonsági öv elengedhetetlen olyan alkalmazásokhoz. akkor felejtsd el a MySQL-t. Az alkalmazásod megbízhatóbban fog működni. hogy egy számla kitörlése maga után vonja a számla összes tételének a kitörlését. még akkor is. A relációk lehetővé teszik. és nem leszel tudatában. Boldogabb és nyugodtabb leszel. mint a kézmosás evés előtt. ha a relációk meggátolnak abban. A „Visszanyerési idők: a teljesítmény fokozása" című Gyors megoldás a visszatérési idők hatékony naplózását mutatja be. mit tettek ezek az idegenek az adataiddal. Ha két ségeid vannak. kérdezd meg a webszervered adminisztrátorát. mikor ez be következik. és még néhány egyéb tényező is közrejátszik. másrészt az SQL-lekérdezéseket microtime()-keretbe illesztve összehasonlíthatod a válaszadási időket indexekkel és azok nélkül. Az állandó kapcsolatok erőforrásokat kötnek le és sok memóriát igényelnek (ugyanakkor az újrakapcso lódás szintén erőforrás. és vagy együtt dolgozod fel őket. Állandó kapcsolatok Még nem láttam elegendő részletes kimutatást a különböző típusú adatbázisokra az állandó kapcsolatok erőforrás-megtakarítására vonatkozóan. vagy se hogy. hogy azon tűnődsz. mind a felelőtlen hibákat egyaránt nagy összegű pénzbüntetéssel vagy börtönnel büntetik. melyek technikai érveket hoznak fel az állandó kapcsolatok használata ellen és vannak emberek. és haj landó vagy lemondani a rugalmasságról.és memóriaigényes). Az állandó kapcsolatok lehetővé teszik a PHP számára. állíts be állandó kapcsolato 175 i . A PHP csak akkor használhatja az állandó kapcsolatokat. mint pl.Áttekintés phpMyAdmin vagy a phpPgAdmin.. mint a könyvelés. ha Apache-modulként fut. ha a szerver. amivel könnyen létrehozhatsz és törölhetsz indexeket. nem engedi. hogy nem állandó kapcsolatokat használsz. Ha szeretnéd jobban kézben tartani a dolgokat. vagy fordítva. Olyan szabályokat biztosítanak. ami az állandó kapcsolatok használata ellen szól.Relációk A kapcsolatok legalább annyi problémát szülnek. Miért kockáztassunk ilyesmit egy szoftver összeomlása miatt? Fejlesszük az alkalmazásainkat a kezdetektől megbízható relációkkal. hogy soha nem fedezed fel. akik minden probléma nélkül állítanak be állandó kapcsolatokat. hogy valaki töröljön egy számlát. hogy összekapcsolj sorokat. Ha állandó kapcsolatot állítasz be. nem fogsz egy reggel arra ébredni. hogy ügyes trükköket alkal mazz az adatokon. Gondolj azokra a mindennapos szabályokra. ahol mind a szán dékos csalást. a kapcsolódáshoz szükséges paraméter változatlan. a tranzakciók közti idő és az adatbázis-kezelő szoftver. a felhasználó. van-e valamilyen különösebb ok.kérdezd meg bármelyik házas ismerősödet. ha léteznek a számlához kapcsolódó tételek. és képzelj el hasonló szabályokat egy adatbázisban. Vannak je lentések.

ha a munka egyenlően van elosztva két szerver között. amelyek több tízmillió dollárt költöttek nagygépes rendszerekre. és hagyd. Tekintve. A problé ma nem sokat változott. Ha a honlapodat több különböző adatbázis szolgálja ki. hogy a modern merevlemezek élettartama 300 ezer óra és minden más hardver hosszabb életű. akkor közösen használhatnak egy olyan kapcsolatot. mint tízezer egyedi kapcsolódás. ezért egy tízezer látogatót vonzó weboldalon.. Ha állandó kapcsolatokat használsz. akkor a kezdeti magas forgalom me llett a további forgalom alacsony szintjére számíthatunk. és némely SQL 100 vagy annál is több sort nyer vissza az adatbázisból. . akkor érdemes megfontolni az ODBC használatát. hogy bizonyos szituációkban növeli a hálózati forgalmat. Néhány adatbázis API-ja még tovább rontja a helyzetet. ODBC Az Object Database Connectivity (ODBC) számos adatbázishoz leegyszerűsíti a kapcso lódást azáltal. mióta sok évvel ezelőtt először ismertettem elképzeléseimet olyan nagyvállalatok vezetőivel. és minden további hozzáféréshez egy közös adatbázis-azonosítón osztozik. Ha minden adatfeldolgozást a szerveren helyezünk el. ahol a webszerver egy képszerverró'l veszi a ké peket és a saját gyorsítótárában raktározza őket). ezek az erőforrások igen sokáig le lesznek fog lalva.ez a osztott logikájú rendszer az ábra közepén. A 6. Ha ez a tízezer látogató a saját azonosítóját csak bejelentkezésre használja.6. a középen látható kritikus vonal a hálózati forgalmat képviseli. ahogyan az egy szervert használó weboldalak működnek). Mikor a PHP-szkripted lefut egy szerveren és ODBC-kliensként kapcsolódik egy adatbázisszerverhez.) Ha egy állandó kapcsolatot indítasz és elfelejted lezárni. Az ODBC -nek az a hátránya. Azaz egyes oldalak 500 sor visszanyerését igényelhetik. Általában az a legrosszabb eset. fel tudja-e használni többször ugyanazt a kapcsolatot. vagy a szkrípt futása megszakad. mindegyik külön kapcsolattal. egyetlen szkript egyetlen oldallekérésre válaszolva hét SQL-lekérdezést is elküldhet. Ha minden lehetséges adatfeldolgozást a kliensre helyezzünk (ahogyan egy honlap működik. hogy a PHP megállapítsa. ezzel az 500 rekord 176 . és az állandó kapcsolatot pontosan erre találták ki. hogy visszavond a nyitva maradt műveleteket.1 ábra az adatfeldolgozás Shuíman/Gartner féle kliens/szerver modelljét mutatja a saját értelmezésemben. és néhány lehetősége kifejezetten hasznos a hálózaton keresztüli kapcsolódáshoz. akkor a művelethez rendelt erőforrások mindaddig foglaltak maradhatnak. Ötven állandó kapcsolat még mindig sokkal jobb.ahol mindenki a saját azonosítójával lép be és kap hozzáférést az adatbázishoz . és a kliensre alig bízunk többet a megjelenítésnél (pontosan úgy. mielőtt lezárná. hogy adatbázis-független interfészt biztosít. fejezet Adatbázisok kat. (A gyermekfolyamatok leírása bármelyik jó Apache-kézikönyvben megtalálható. mivel minden egyes adatelemhez külön lekérést igényel. akkor kis hálózati forgalmat bonyolítunk. mert a két feldolgozó egység közti kap csolat jelentős forgalmat bonyolít . ami egyáltalán nem hatékony és megbénítja a webszervert.ez tízezer állandó kapcsolatot jelent. iktass be egy PHP shotdown -utasítást. amely hatékony. Az állandó kapcsolat a felhasználói azonosítón alapszik. amíg a szervert újraindítják. A valóságban a tízezer látogató oldallekéréseit 50 gyermekfolyamat dolgozná fel.

Ha egy olyan SQL-t küldesz. vagyis az egyes adatbázisokhoz csak egy plusz kapcsolódó modult készítenek. akkoi mind az 500-ra szükséged van. Ahol nincs ODBCinterfész. ott a PHP iODBC-t használ. és a saját mterfészépítő munkájukat is minimalizálják azáltal. Minden SQL-utasításhoz egyetlen hálózati adatátvitel tartozna. A végeredmény. és az odbc_result()-paranccsal mezőnként lépkedhetsz végig a helyi gyorsítótárban lévő rekordon. distributed pressntation dsta ifnanag&nent applcakm remote presentatwn data mafagafneni distributed logic dats rcmotc data managcmcnt distnbuted datsbase raanagement ! data | roanaoeraenl managernem spolcatbn togc 1 tagc presentation l appica&cn application Jogin présen taíoo T presenEaDon pfeseotation preserrtflöon preáentaöon 6. ha az ODBC-interfész képes volna egyszerre több sort is visszanyerni. Az ODBC-interfész felépítése révén az 5000 mezőlekérés 500 sor lekérésére korlátozódik. és a rendszer közelebb állna a 6. mondjuk az első 10-re. Logikus.1 ábra „távadatkezelés" modelljéhez. akkor az adatbázisszállítók számára logikus célkitűzés. Az ODBC a hálózati forgalom visszaszorítása érdekében annyit nyújt. hogy minimalizálják az adatbázisuk ODBC-n keresztüli használatával járó nehézségeket. és az adatátvitel egységét másra változtatja. amire Egységes ODBC-ként szoktak hivatkozni. Az ODBC jobban hasonlítana az SQL-hez. amely 500 sort választ ki. hogy a PHP ODBC-utasításai közvetlenül kapcsolódnak az IBM DB2-höz vagy más adatbázisokhoz. akkor az olyan SQL-funkciókat kell használnod.1 ábra A kliens/szerver feldolgozás Schulman/Gartner-modellje 500 sor egyenként történő átküldése a hálózaton mé? mindig problémát jelent. amely kis plug177 I . mint például a LIMIT. hogy csak egy interfészt fejlesztenek: egy ODBC-interfészt. Ha az ODBC a legjobb módja sok különböző adatbázis elérésének.Áttekintés 5000 mezőlékéréssé gyarapszik. hogy illeszkedjen az SQL LIMIT és START paramétereihez. A hálózati forgalom azért növekszik. Ha csak néhány sorra van szükséged. hogy az odbc_fetch_row()-utasítás egy egész sort ad vissza. hogy az ODBC szoftvereket a fejlesztők számára is minimalizálják az egyes interfészekre fordított munkát. amely egy olyan ODBC-interfész. mivel ezek az adatbázisok szabványos ODBC-formátumú API-vel rendelkeznek. mert az ODBC megpróbálja kitalálni. Az ODBC akkor lenne tökéletes a hálózaton keresztül történő tranzakciókhoz. mire van szüksége az alkalmazásodnak. mint amit kértél. vagyis az ODBC-nek egy hálózati átvitellel kellene visszanyernie az 500 sort.

hogy ODBC-t használj minden adatbázishoz minden platformon. VSE. Az IBM DB2-t mindenhová irányelve eredményeképp az IBM az Oracle-lel fej-fej mellett vezeti a üzleti adatbázisok piacát. vagyis az ODBC hátrányai nélkül férhetsz hozzá az adatbázishoz. Néhány szoftver.vagy Egységes ODBC-adatbázissal használható. ha új komponenseket akarsz kifejleszteni és Össze akarod kapcsolni az eredményt. pl. és nemrég jelent meg a nyílt forráskódú GPL-hcence. a dátum és hasonló mezők formátuma. DB2 A DB2 az IBM korábbi nagygépes adatbázisát váltotta fel. A forráskódot a www. pl. vagy tehetsz egy lépést a nyílt forráskódú PostgreSQL. akkor választhatod a DB2-re való áttérést. HP-UX-. A PHP az Egységes ODBC-n. Noha az SAP DB jól hangzik. Ha Informix alapú rendszeren dolgozol. amelyben az adat-\ bázis saját alkalmazásfejlesztő interfésze (API) olyan. Miután a Linux kezdett elterjedni az IBM-platformokon egészen a nagyteljesítményű gépekig. aki a nagygépes rendszereket használó ügyfelek körében népszerű. és a logisztikai. ami lehetővé teszi. és az IBM nagygépes rendszereit használó nagyvállalatoknál. majd az IBM más platformjain is elterjedt. vagy talán a népszerűbb és kevésbé fejlett MySQL felé. mint az ODBC. OS/390-. A DB2 sok technológiai újítást elsőként alkalmazott az adatbázisok területén.6. Más szoftverek egy hibaüzenetet generálnak. és támogatja az olyan objektumokat. vagy nullával válaszol. egy udvarias nemmel. aki szakértője lenne a C + +-nak. Windows-. vagyis olyan rendszeren keresztül éri el a DB2-t. Senkit nem ismerek. Elérhető az ODBC-n keresztül. ami valamennyi nagy mennyiségű adat Interneten keresztüli továbbítására alkalmas operációs rendszert és szervert lefed. amely SQL alapú. amit nem egységesítettek. ami teljesen félrevezető. Hosszú távon több adatbázis fog vagy ODBCinterfésszel vagy ÍODBC plug-innel rendelkezni. fejezet Adatbázisok ineket fogad különböző adatbázisokhoz. az IBM átültette a DB2-t Linuxra is. Sun Solaris-. mint az XML vagy strukturálatlan adatok. ahogyan az adatbázisok a haladóbb funkciókat tartalmazó kérésekre válaszolnak. Néhány szoftver azonban a lehető legrosszabb dolgot teszi: egy érvényesnek tetsző választ ad. Linux-. Windows NT-. PHP-programozási szempontból a DB2-kód bármilyen ODBC. SAP DB Az SAP egy jól ismert német alkalmazásfejlesztő. hamissal.és VM-platformokon elérhető. számviteli és humán erőforrás osztályokat célozta meg. A DB2 jelenleg AIX-. AS400-. vagyis a DB2-ben feltűnhetnek az Informix technológiai megoldásai. AIX alapú webszervereken. ha olyan kéréssel szembesül amellyel nem tud mit kezdeni. bankoknál többnyire ezt használják. annak harmadát birtokolva. mivel remek többlépcsős kliens/szerver-funkciókkal rendelkezik. és az Informix számos módon fog a DB2-höz kapcsolódni.sap. Az egyetlen dolog. a forráskód látszólag C+ + Pascal és Python keveréke és az SAP fejlesztőeszközét kell használnod.com/solutions/technology/sapdb-oldalról töltheted le. és az a mód. Az IBM nemrégen megvásárolta az Informix-adatbázist. a 178 . Az SAP DB az SAP-hoz használt adatbázis. OS/2-.

hogy egy relációs adatbázis szöveges mezőiben tartanád az XML-dokumentumaidat.Áttekintés Pascalnak és a Pythonnak. vagyis az SAP DB hosszú távú fejlesztéséhez külön fejlesztőcsapatok szükségesek. Felsoroltam a PHP filePro-utasításait.-tői (www. ezúttal XML-dokumentumok tárházaként szolgál. Előfordulhat hogy dolgoznod kell valamelyikükkel. és nézd meg az új adatbázisukat. és megpróbálják elérni. Ha ODBC-n keresztül használod az SAP DB-t. amíg az IBM le nem cserélte az új gyermekével. hogy más adatbázisokkal is kompatíbilis legyen. de kódod még mindig az SAP DB lehetőségeitől fog függeni.fptech. kihalófélben lévő oldalágát képviseli. az összes Pascalt át kellene konvertálniuk C + +-ra vagy Pythonra. ahol az adatbázis készítői egy jelentéskészítőt is biztosítanak. így meg tudod ítélni. a phpMyAdmin. a DB2-vel. Ügy tűnik a Tamino. 179 . Inc. Ha már SAP-ot használsz. PostgreSQL-lel. így a PostgreSQL is értékesebbé válna az SAP DB funkcionalitása révén. és az első megfigyelésem. Véleményem szerint az SAP fejlesztőinek az összes felhasználói felületet azonnal le kellene cserélniük PHP alapú adminisztrációra. ha ODBC-n keresztül éred el őket vagy lecseréled őket PostgreSQLre vagy MySQL-re. A filePro első ránézésre az adatbázis-fejlesztés egy régi. és az SAP megspórolná az SAP DB fenntartását. az nagyobb rugalmasságot biztosít. de látogasd meg a cég honlapját. Valójában azt hiszem az SAP DB-nek meg kellene próbálnia összeolvadni a PostgreSQL-lel. hogy az fP weblapján PHP helyett JSP-t használnak. Az Adabas az IBM IMS-ével versenyzett. Ahelyett. Az XML-lel a 20. akkor jelentős kódújraírást takaríthatsz meg egy új adatbázisra való áttérésnél. fejezetben foglalkozunk. Kísérletezz más adatbázisokkal. pl.com) Adabas-a az Internet korában nagyapának számít az adatbázisok családjában. a Tamino lehetővé teszi. mint pl. és az összes Pythont C-re vagy PHP-re kellene cserélniük. vagy újra kell írni a Pascal és Python részeket valamilyen más nyelven. de nem javaslom a használatukat.com) származik. akkor az SAP DB-t nem SAP alkalmazásokhoz is használhatod adatbázisnak. hogy ezzel a világon mindent meg lehessen oldani. A filePro olvasása A filePro az fP Technologies. hosszabb távon pedig a C Gnome-hoz használt verziója felé kellene elmozdulniuk. a relációs adatbázisokat megelőző hierarchikus adatbázisok újbóli megjelenése. melyik alkalmazás igényli az SAP DB-t és melyiket lehet átírni. de ez korlátozhatja a jövőbeli rugalmasságodat. Adabas A Software AG (http://softwareag. a Taminot. de legjobb. és ha képes vagy minden kapcsolatot ODBC-n keresztül megvalósítani. hogy egy hatalmas XML alapú struktúrába rendezd őket. Az Adabas semmilyen előnyét nem tudnám megemlíteni az Oracle-lel vagy a DB2-vel szemben. Más adatbázisok A következő adatbázisok különleges funkciókat tartalmaznak és különleges igényeket elégítenek ki.

ezen túl még megnyit egy belső kapcsolatot további filePro-utasítások számára. és a MySQL sokkal jobban hangzik. hogy még nem volt alkalmam tesztelni.com-ról letölthető FrontBase még új a PHP 4. Ugyanezen okból egyéb eszközöket se használj a filePro-fájlok frissítésére.Létrehoz egy adatbázist. ezért csak az utasításokat tudom felsorolni.és a filepro_fíeldwidth()-utasításokkal kaphatsz az output formázásához szükséges információkat. a filepro_fieldtype().Visszanyeri az adatot.A mező hosszát adja. 180 1 . • filepro_fieldtype() . a FrontBase sok időt megspórolhatott volna a felhasználók számára. Miközben a ciklusod végigmegy az első sor mezőin.Bezárja a kapcsolatot. • fbsql_fetch_array() . • filepro_retrieve() . A iÍlepro_retrive() egy mezőt ad vissza a sor száma és a mező száma alapján. • fbsql_change__user() . * r l A FrontBase olvasása A www. • fbsql_close() . MySQL-be vagy PostgreSQL-be: • filepro() . a mezők számát. fejezet Adatbázisok hacsak nem arra.0.Az eredmény egy sorát egy tömbként hívja le. • fbsql_data_seek() . mint egy táblázatkezelő táblázata. pl. • fbsql_connect() . nem pedig mint egy relációs adatbázis táblája. • filepro_fieldcount() .Az adatbázisban található mezők számát adja. mert ezek elérhetőek a weboldaladról.A mező nevét adja.frontbase. • fbsql_create_db() . és információkat nyer vissza. egy weboldalon keresztüli online-frissítés veszélyes lehet. • fbsql_autocommit() . • fbsql_db_query() -Végrehajt egy lekérdezést. • fbsql_drop_db() . pl. • filepro_rowcount() . pl.6.A legutolsó hibaüzenet szövegét adja. A filepro rowcount() és a filepro_fieldcount() biztosítják azokat a számokat. Ezen a ponton talán felismered.Kitörli az adatbázist. a filepro_fieldname()-. A filepro()-utasítás argumentumában az adatbázist tartalmazó könyvtár nevét tartalmazó sztring szerepelhet. • fbsql_error() . Az utasítások olvasási joggal rendelkeznek. hogy a filePro-adatbázis úgy hangzik.A legutolsó hibaüzenet számát adja.Megnyitja a kapcsolatot egy szerverrel. Az utasítások nagyon hasonlítanak az ODBC-hez. • filepro_fieldname() .Megváltozatja a felhasználói azonosítót a kapcsolatban.Ki és bekapcsolja az autocommitot.Az előző lekérdezésben szereplő sorok számát adja vissza. • fbsql_errno() .Beolvassa és ellenőrzi az adattérképet tartalmazó fájlt. és mivel a filePro-ban nem lehet fájlokat zárolni. verziója számára annyira új.A mező típusát adja.Az eredmény pointerét a következő sorra mozgatja. amelyekkel a ciklusod végig tud lépkedni az adatbázis sorain és mezőin. hogy átkonvertáld az adataidat valami modern adatbázisba. Úgy tűnik. parancssorból futtatható programokat. ha az API-jét ODBC-kompatíbilissá teszi: • fbsql_affected_rows() . működik-e az adatbázis.Az adatbázisban található sorok számát adja. Megvizsgálja.6. • filepro_fieldwidth() .

Az eredményadatokat adja.Az eredmény egy mezőjének nevét adja. 1 fbsql_result() . fbsql_field_seek() . fbsql_list_dbs() . talán egy XML-kompatyíbihs adatbázist. Bármilyen azonosító információt hozzáadhatsz. fbsql_field_type() . Manapság automatikusan XML-t használnál. mint a Tamino. fbsql_insert_id() .Az eredmény egy sorát egy asszociatív tömbként adja vissza.Felsorolja az adatbázison elérhető adatbázisokat.A mező indikátorait adja vissza. fbsql_field_table() .Felsorolja egy adatbázis tábláit. és a Hyperwave (www.Az eredmény mezőinek hosszát adja.Egy állandó kapcsolatot nyit egy szerverrel. 1 fbsql_pconnect() . fbsql_fetch_object() . fbsql_field_name() . 1 fbsql_tablename() . 1 fbsql_warnings() . fbsql_fetch_row() . fbsql_list_fields() . A PHP-ben vannak utasítások a Hyperwave-hez. 1 fbsql_num_fields() . ahol a szöveget hosszú sztringekben tárolod.Az eredmény egy sorát egy objektumként hívja le. vagy a szöveg egy meghatározott területén. és az információt tárolhatod a szöveghez kapcsolva.hiperwave.Kiválaszt egy adatbázist.Az eredményben szereplő mezők számát adja.Az eredmény egy mezőjének típusát adja. Hyperwave A Hyperwave-et eredetileg az Institute for Information Processing and Computer Supported New Media (www. plusz az SQL-t használva kiválaszthatod az összes olyan oldalt.Be. majd beolvasnád a dokumentumot PHP-ba a PHP vagy a DOM XML-utasításait használva. a tag-eket pedig kapcsolódó táblákban. fbsql_free_result() .Egy mezőhöz tartozó tábla nevét adja.Felsorolja az eredmény mezőit.Áttekintés fbsql_fetch_assoc() . fbsql_field_len() .Egy oszlop információit egy objektumként adja. fbsql_query() . Akkoriban.iicm.Az eredmény egy sorát egy tömbként adja.Az eredményben szereplő sorok számát adja. Képzelj el egy átlagos weblapot.Egy mező hosszát adja.edu) fejlesztette ki.com) csinált belőle üzleti terméket. és az azonosítókat hagyományos relációs adatként tárolnád (és PostgreSQL-re váltanál. fbsql_num_rows() . A Hyperwave lényegében a weblapokban tárolt meta-információkhoz hasonló azonosító információkkal tárolja a dokumentumokat.Felszabadítja az eredmény által lefoglalt memóriát. 1 fbsql_select_db() .Egy mezőt tartalmazó tábla nevét adja. vagy egyszerűen a szövegben hagynád az XML tag-eket egy hosszú szöveges mezőben. amelynek a címében szerepel a hal szó.Elküld egy lekérdezést. hogy kihasználd a relációkat). fbsql_fetch_field() . fbsql_list_tables() . Az információt felhasználva újra összeállíthatod a weblapot. és nem sok előnyét látom új alkalmazásokhoz.Az előző beillesztés azonosítóját adja. fbsql_field_flags() . mikor az XML elődjének tekinthető 181 . de a Hyperwave pénzbe kerül. fbsql_fetch_lengths() .Az eredménymutatót egy mezőofszetre állítja.és kikapcsolja a figyelmezető üzeneteket.

Azonban ma már visszalépést jelent a saját tulajdonú szoftverek felé.com címen.htm) elérhető. Ingres II Az Ingres egy másik adatbázis. a modern Ingres II pedig a Computer Associates-től (www.6. Ha Informix utasításokat kell használnod. és a weboldalad látogatói csak a PHP által generált oldalakat látják. akkor küldj egy e-mailt az informix@petermoulding. és van egy külön weboldala a www. Informix Az IBM megvásárolta az Informix-adatbázist.com/products/ingres. Az InterBase-nek más furcsaságai is vannak: a create table stock (brand varchar(60))-utasítás egy BRAND nevű mezőt hoz létre. a PHP XML-támogatása és a nyílt forráskódú adatbázisok messze voltak attól. A neve az Interactive Graphics Retrival System rövidítése. Van egy régi. de a Sybase és az InterBase a "Ted's great adventure"-sztringet fogja keresni. vagyis nem kell különleges utasításokat használnod a hozzáféréshez. amely a Berkeley-ből származik. mikor dokumentálták. A PHP fejlesztői jó munkát végeztek. 182 . Ezen túl jelen könyv írásakor a PHP Informix 7-hez tartozó függvényeit kifejlesztő programozók éppen a 9-es verzióhoz való utasításokon dolgoztak. lapozd fel az „Ingres II elérése" Gyors megoldást. Ha szeretnél példákat látni az Ingres II használatára. Az InterBase Sybase-stílusú aposztrófot használ karakterek kihagyására az SQL-ben (a Sybase-t a fejezet későbbi részében tárgyaljuk). mire a tinta megszárad. vagyis az Informix-adatbázis jövője bizonytalan. mindenki által hozzáférhető nyílt forráskódú változat. InterBase Az InterBase a Borland (www. milyen verziójú Informix-ot használsz és egy friss Gyors megoldást írok az általad használt Informix-verzióhoz a PHP legfrissebb Informix-utasításait használva.cai. ha eleve egy Hyperwave-adatbázisban kapod a dokumentumokat és a Hyperwave hosszú távon is jó választás lenne. ha a fejlesztői nyílt szabványú formátumra helyeznék és időszerű technológiával látnák el. Az InterBase ODBC-interfésszel rendelkezik. hogyan illeszthető a Hyperwave-szerver az Apache-hoz. Szükséged lehet a Hyperwave használatára.interbase. hogy dokumentumtárolásra alkalmas megoldást nyújtsanak. A Hyperwave átlátszóvá válik.(Ted nagyszerű kalandja) sztringet így értelmezi "Ted\'s great adventure". A legtöbb adatbázisban az SQL a "Ted's great adventure". amelyek nem illeszkednek egy kis fe)lesztőkörnyezethez.borland.com) adatbázisa. fejezet Adatbázisok Hyperwave-et tervezték. az alábbiakban pedig áttekintjük a PHP-utasításokat. írd meg. mivel legalább két adatbázis ismeretét és fenntartását igénylik. az elavult lenne.com-címre. viszont a create table stock ("brand" varchar(60))-utasítás egy brand nevű mezőt hoz létre. vagyis a Hyperwave eló'relépés volt. ha el akarod érni ezt a mezőt. és BRAND-et kell begépelned. Ha felsorolnám az Informix-utasításokat és paramétereiket.

az Access-ben csak egy felhasználó frissítheti és csak kis számú felhasználó olvashatja az adatokat. sima munkaállomások számára valószínűleg a világ legjobb adatbázisa. hogy a MS Access ne szorítsa ki a MS SQL-szervert a kis intranetek piacáról. Microsoft Access A MS Access az egy felhasználós. hogy az 5. akkor az ibase_free_result()-utasítással tudod felszabadítani az eredményhalmazhoz rendelt memóriát. fejezetben található MySQL-példákba beillesztheted az InterBase függvényeket. Az adatbázis képén néhány egérkattintással létrehozhatod a relációkat. és állandó kapcsolatokhoz nem használatos. és a mezők egy hagyományos tömbjét adja vissza. és ugyanazt a kódot.Az ibase_connect() és az ibase_pconnect() más adatbázisok azonos utasításaihoz hasonló an sima és állandó kapcsolatot hoz létre egy adatbázissal. amelyekre nincs szükség egy teszt környezetben. hogy elérjék ugyanazt a szintű funkcionalitást. akkor az Íbase_trans()-szel indíthatsz tranzakciót. Az ibase_num_fields() egy eredményhalmaz mezőinek számát adja vissza. Az Access könnyedén elérhető a PHP-val ODBC-n keresztül. ugyanúgy. A MySQL-hez hasonlóan az InterBase is 0-val kezdó'dően számozza meg a mezőket. Annak érdekében. akkor a MySQL helyett PostgreSQL-t (vagy valamely megfelelőjét) kell választanod. és át szeretnél térni egy nagyobb számú frissítési joggal rendelkező felhasználót támogató adatbázisra. Az ibase_timefmt() beállítja a mező formátumát a dátum. akik hatalmas adatbázisokat modelleznek Access-ben. Olyan sok egyéb közös vonása van a MySQL-lel. ha ugyanazt a lekérdezést változó értékekkel többször akarod lefuttatni. tehát demonstrációs célra használhatod az Access-t. Ha az Access minden funkcióját kihasználod. és akkor használhatóak. Az ibase_free_query() felszabadítja az ibase_prepare() által a lekérdezés számára allokált memóriát. mint a mysql_fetch_row(). Az ibase_prepare() és az ibase_execute() hasonlóan működnek ODBC-megfelelőikhez. ha elvégezted a feladatot. Az elérési út hálózati előtagokat is tartalmaz hat más gépeken található adatbázisok elérésére. jelszó és egyéb opcionális paraméterek. Az ibase_query() argumentumában egy kapcsolatazonosító és egy SQL-parancs szerepel. Ha fejdolgoztad az eredményeket. és az opcionális felhasználói név. Ismerek néhány embert. és az ibase_rollback()-paranccsal vonhatod azt vissza. Az ibase_fetch_row() paramétere a lekérdezés azonosítója. az ibase_fetch_object() pedig objektumként adja vissza a tömböt. akkor az ibase_errmsg()-utasítás adja vissza az InterBase legutolsó hibaüzenetét. aztán az „életnagyságú" adatbázissal kínlódnak. az idő és az időbélyegző alapján. amelyeken egy for()-ciklussal mehetsz végig. Ha e lekérdezés egy hibát eredményez. Ha a lekérdezésedhez tranzakciókra van szükség. és azonnal végrehajtja a lekérdezést. A PostgreSQL esetében erőteljesebb fejlesztésekre számíthatsz a jövőben. és a mezőkről szolgál információkkal. és ezek közül a TCP/IP protokollhoz használt hostname: forma a legfontosabb. ODBC beállítást és SQLt alkalmazhatod egy másik adatbázisra. hí- 183 . az ibase_commit()-tal hajthatsz végre frissítést a tranzakció végén. Az ibase_close() bezárja a kapcsolatot. A paramétereik az adatbázis elérési útvonala. Az ibase_field_info() paraméterei az eredmény azonosítója és a mező száma. tehát a mező nevétől vagy típusától függően dolgozhatod fel az adatokat.

lapozzanak az „Adatbázisok elérése ODBC-vel" című Gyors megoldáshoz. a MS SQL Servernek vannak előnyei. de ez alatt a határ alatt tökéletes. de még mindig nagyon kidolgozatlan a MS Access-hez képest. A két adatbázis bizonyos mértékben még mmdig kompatíbilis. még akkor is. ha az SQL Serveren hoztam volna létre az adatbázist. Eddig még nem használtam mSQL-t. alapvető üzleti alkalmazásokat futtató Microsoft SQL Serverrel támogatott weblap számára készítettem adminisztrációs alkalmazásokat. mSQL Az mSQL-t vagy miniSQL-t a Hughes Technologies Pty Ltd (www.com. i Microsoft SQL Server Ha még nem hallottál volna a Microsoftról. mint a MySQL egy kisebb. és ha adatbázist szeretnék cserélni. vagyis használhatod a Sybase Unixos komponenseit. 184 . mert úgy találták. és azért döntöttek egy új adatbázis írása mellett.com). olcsó PC-n mindössze egy óra alatt futott le a napi naplózást és bizonyos elemzéseket elvégző' program. ha a webszervered Windows NT-n fut. Ha relációkat akarsz használni és Windows-on szeretnél maradni. de sokkal egyszerűbb és megbízhatóbb ODBC-t használni..sybase. A MySQL fejlesztői tulajdonképpen az mSQL-bó'l indultak ki.6. a MS SQL Server egyedül a Windows NT-re korlátozódik. lassú. Valójában a PHP MS SQL Server utasításainál is egyszerűbb és megbízhatóbb a PHP ODBC utasításait használni.hughes. fejezet Adatbázisok szén a PostgreSQL kezelőfelülete igen visszamaradott. és az összes többi lehetőség sokkal nehézkesebben telepíthető és adminisztrálható. Nos. ha Apache-csal és PHP4-gyel használt MySQL-re váltasz.au) fejleszti. és a phpMyAdmin-nal végzed a kezdeti adminisztrációt. akik a Windows-t írták. mert a MySQL minden általam használt platformon elérhető. amelyet a Windows-ból és Windows NT-ből ismerhetünk. majd megkapta Bili Gates speciális kezelését. könnyedebb verzióját. akkor a MySQL kiesett. Mikor egy nagyméretű. és a legjobban úgy lehetne jellemezni. Egy felesleges. ők azok. A MS Access 2 GB fölött meghal (a Microsoft programozási módszere miatt). a gyorsaság és a megbízhatóság tekintetében az a legjobb. Éppen ezért átugrottam az MS SQL Server-utasításokat és az MS SQL Server használóknak azt tanácsolom.hogy az mSQL nem növelhető a kívánt mértékben. Noha a Sybase-t minden fontos webszerver-platformra kifejlesztették. vagyis az ő SQL-szerverüknek nagyszerűen kellene működnie Windows alatt. ha Unix alól éred el a MS SQL Servert. de hasonlóan komoly hátrányosságaí is vannak. A MySQL a nyílt forráskódú GPL-licenc alatt használható. A MS SQL Server a Sybase-re alapszik (www. akkor valószínűleg a magasabb szintű funkcionalitást biztosító PostgreSQL irányába mozdulnék. (A phpPgAdmin megkönnyíti ugyan a PostgreSQL használatát. MS Access-t használtam. de ugyanez négy órát igényelt az összes többi alkalmazást futtató és a tranzakciók zárolásával hátráltatott SQL Serveren. Ha eléred a 2GB-os határt az Access-ben. mert napokat megtakarítottam ahhoz képest.

Az ODBC-interfész működésre bírása már nem jelent különös nehézséget Linuxon. Az Oracle többször tudta magáénak a világ legnagyobb. és a számítástechnikai osztályokat nagygépes rendszerekkel kiszolgáló Unix-szállítók többnyire ezt választották. A PHP ora_ előtagú utasításokat biztosít az Oracle Corporation (http://oracle. tárolt eljárásokat támogató alternatívája a nyílt forráskódú PostgreSQL. és egyéb platformokon valahol a kettő között van. az Oraclelel osztják meg az adatokat az alkalmazások között. ha különböző platformokat használsz. és megnehezítették volna saját maguk számára. Az IBM DB2-je és az NCR Teradatája vezet a téradatok területén. fejezetben olvashatsz a MySQL-ről. és újabb. mert a nagyvállalatok minden alkalmazásuk mögé Oracle-t tesznek.Áttekintés Ha mSQL-ed van és PHP-t szeretnél használni hozzá. akkor az adatbázishoz láncolták volna magukat. pl.com) régebbi Oracle-verzióihoz. Ha az adatfeldolgozást tárolt eljárásokba zárod az adatbázisodban. és csak úgy tudták kijavítani a kódot. Az Oracle volt az első több platformon széles körben elérhető üzleti adatbázis. A probléma annyiban összetettebb. Azon nehézségek alapján. Oracle Az Oracle-adatbázist egy sor üzleti alkalmazás. a mód. amelyek lehetővé teszik nagy adatbázisok több 185 . Előfordulhat. Noha az SAP-nek megvan a saját adatbázisa. de Unix-platformon még viszonylag újnak számít. az Oracle-adatbázison alapuló ügyviteli szoftverek mellett az Oracle vállalat készíti. és ahelyett. hogy a jövőben egy nyílt forráskódú adatbázisra váltsanak. de az a néhány különbség könnyen kideríthető a PHP mSQL-utasításokat leíró dokumentációjából. csak be kell helyettesítened a MySQLutasítások helyére az mSQL-utasítások nevét. amely két számjegyben tárolja a négy jegyű évszámokat. oci8_ kezdetű utasításokat az Oracle 7-es és 8-as verzióihoz. egy olyan eljárás írásával próbálkozott. akkor a PHP mSQL parancsait is meg kell változtatni. Ha sikerült volna megírniuk a dátumkonvertáló tárolt eljárást. az SAP mögött is találkozhatsz Oracle-lel. és használhatod az ott szereplő kódot. Végül is a tárolt eljárásuk megbízhatatlan volt. és az IBM saját platformjain többnyire a DB2 nyújtja a legjobb teljesítményt. befolyásolja a jövőbeli lehetőségeidet. Az Oracle legszélesebb körben hozzáférhető. akkor tárolt eljárásokkal rendelkező adatbázisokra korlátozod magad. A Hughes Technologies. ahogyan ezt teszed. hogy a Hughes Technologies éppen most készül piacra dobni egy új verziót. különösen. és ha ez valódi eló'relépést jelent. hogy Oracle-projekten kell dolgoznod. akkor az 5. hogy megvásárolta volna a négy számjegyet támogató frissítést a legújabb verzióhoz. leggyorsabb vagy legnagyobb adatforgalmat bonyolító aktív üzleti adatbázisának címét. hogy megvásárolták a frissítést a legújabb verzióhoz. amely az mSQL-t értékesíti. Egy ügyfél az adatbázisában két számjegyben tárolta az évszámokat. Ha szokatlan dolgokat csinálsz az adataiddal. amelyekről az Oracle saját utasításaival kapcsolatban hallottam. úgy találom. hogy ODBC-interfészt érdemes használni. Az Oracle nagyszerű választás. egy könyvet is árul az mSQL-ró'l. fej fej mellett az IBM DB2-jével. A legfrissebb Oracle nagyszerű funkciókkal rendelkezik. Windows NT-n még egyszerűbb. de nem fogod az Oracle saját API-jét használni. Az Oracle az üzleti adatbázisok piacának harmadát birtokolja. ha eltérő Unix-változatokat.

de ne írj olyan kódot. de OK) vagy tárolt eljárásokban (általában rossz) képesek megoldani. működjenek. ovrimos_ előtaggal. vagy a PHP ODBC-utasításaival a SESAM-hoz használt ODBC-kiterjesztésen keresztül. vagy HTML-űrlapot egyszerű ábrázolási formában adhatsz hozzá az adatbázishoz és adhatsz át másik adatforrásnak.ö. A Ovrimos kicsi és gyors. akkor bármilyen adatforrás.fujitsu-siemens. fejezet MySQL-példakódjait. ami korábban előnyhöz juttatta a MySQL-lel szemben. egyszerűen ugorj a fejezet ODBC részéhez. hogy az interfészt használd a különleges feldolgozáshoz.gr) Ovrimos SQL Sérvére az egyetlen görög termék ebben a fejezetben. amely megakadályozza. (www. és inkább a MySQL-lel versenyez. ha a saját webszerveredet Apache MySQL-kombinációval valósítod meg. mintha távoli adatbázis lenne . Az Ovrimos támogatja a tranzakciókat. és kétségtelenül ez a legrosszabb választás. hogy az adatbázis túléli az egyes szerverek leállását. A teljes Ovrimos Web Server alkalmazás egy webszerver és egy adatbázis kombinációja. hogy kisebb és kevésbé erőforrás-igényes. Az Ovrimos-ban a legújabb MySQL-hez hasonlóan vannak tranzakciók. és egy másik vállalat szállítja. vagyis lehet. mint a PostgreSQL-lel. az Ovrimos-utasításokat behelyettesítve. Az Ovrimos-hoz van egy ODBC-imerfész.egy ilyen szituációban többnyire az ODBC a legjobb választás. ezért jobban jársz. és a SESAM-ot a PHP SESAM-utasításaival is elérheted. Azt nem tudom. Az Ovrimost néhány webes alkalmazásban előre konfigurált módon használják. a kisebb rendszerektől kezdve a nagygépekig. akkor a SESAM miatt akadtál el. a Fujitsu Siemens egyik üzleti partnere. és szinte megegyeznek a MySQL-utasításokkal. A SESAM-hoz való ODBC-kiterjesztésért külön kell fizetni. mint az ODBC-parancsok. és az Ovrimos commit-utasítása ugyanúgy néz ki.ovrimos. hogy a nagy weblapok hasonló kihívásainak megfelelj. Az Oracle erejét arra használd. de sokkal többen értenek az Apache-hoz és a MySQL-hez. I Ovrimos SQL Server Az Ovrimos S. rejezet Adatbázisok szerver közötti elosztását oly módon. és az összes különleges adatfeldolgozást PHP-ban (egy jó dolog). hogy felér-e egy Apache MySQL kombinációval. mint a Microsoft IIS és SQL Sérvére. mint az ODBC commit-ja . hogy a kisebb honlapok olcsóbb adatbázissal . A BS2000 ma már számos különböző Fujitsu-komputeren elérhető. hogy ODBC-t használ). és az adatbázist a szerveren úgy kell elérned. SQL-ben (nem olyan jó. A PHP-ban vannak külön utasítások is az Ovrimos-hoz. . 1 Ha az összes nem megszokott adatfeldolgozást PHP-ban oldod meg és egyszerű adatábrázolást használsz. ami igen erős korlátozó körülmény (az Oracle használatára korlátozza a lehetőségeidet).A. azaz semmilyen különleges PHP-utasítást vagy telepítési beállítást nem kell használnod. adatbázisfájlt.még egy ok arra. 4 1 SESAM/SQL-Server A Fujitsu Siemens Computers (www. Az ora-utasítások ugyanúgy működnek.com) SESAM/SQL-Servere BS2000 operációs rendszerére írt SQL alapú adatbázisa. vagyis használhatod az 5. Az újabb oci8-utasítások lehetővé teszik. Ha elakadtál a BS2000-rel.

186 .

(http://sybase.és bármely más adatbázis közt. és az ODBCutasítások választéka és képességei folyamatosan gyarapodnak. Solid A Solid Information Technology (www. Ha egy SQL-utasítással sok adatot választasz ki és a kurzoron belül keresel. Sybase A Sybase.solidtech. de nem olyan jellegű hozzáféréssel. akkor erőforrásokat takarítasz meg. amelyik a hordozható eszközökhöz illeszkedik. Mivel a SESAM-hoz van ODBC-interfész. de egyiket sem nevezném fontosnak. míg nem kérted le őket. hogy egyszer lépkedj végig a kurzoron. kereséseket végezz és mindenféle egyéb dolgot. és előnyeiként említhető. az ODBC-t javaslom a SESAM saját. Egy napon lehet. A SESAM-utasítások majdnem megegyeznek az ODBC-parancsokkal. és találsz valakit. A görgethető kurzorok legtöbb értelmes felhasználása a weblapokat megelőző online rendszerekhez kapcsolódott. akkor semmilyen különbséget nem fogsz tapasztalni a Solid. de ha ODBC-vel éred el az adatbázist.szokatlan megközelítés. és ha vissza kell lépned. az első gyors. amit elég nehéz működésre bírni. A Sybase saját PHP-utasításai számos olyan. akkor valószínűleg eldobhatod őket. A görgethető kurzorok lehetővé teszik. mint amit a mai weblapokhoz használnak. és sok év fejlesztő munkája áll a hátterében. és váltsd ki őket jobb SQL-utasításokkal vagy PHP-tömbökbe betöltött adatokkal. a PHP sesam_-eló'taggal ellátott utasításaival használható interfészével szemben. hogy PHP-t. Alaposan vizsgáld meg a görgethető kurzorokat. hogy addig nem nyeri vissza a sorokat. egy kivétellel: a sesam_diagnostic() egy állapottömböt ad eredményül. mint a Nokia vagy a Nortel. aki konfigurálja a SESAM-ot Apache alatt. a második rugalmas. a fő részt az Apache-ba telepíted. hogy olyan weblapot kell írnod. Ha hosszú listákhoz szekvenciális kurzort használsz. még mindig le tudod menteni az adatokat egy PHPtömbbe. A honlapján olyan ügyfeleket sorol fel. 187 . amit az ODBC-kapcsolat nem. Inc. egy ODBC-kapcsolattal rendelkezik. hogy a kurzor körül ugrálj. A szekvenciális kurzorok lehetővé teszik. A SESAM-interfész támogatja a szekvenciális és a görgethető kurzorokat. akkor nem sikerült hatékonyan használnod az SQL-t. vagyis a termékei illeszkednek a telefonokhoz és a routerekhez. hogy sok platformon fut. a PHP-ba pedig egy kis linket teszel .com) Sybase adatbázisa hasonló az MS SQL Sérvedhez (mivel az MS SQL Server a Sybase-en alapszik).com) a beágyazott rendszerekhez alkalmazott szoftverekre koncentrál. valamint az esetleges hibaüzeneteket és egyéb információkat. és lehet. és az első kapcsolódáskor lassú. melyeket semmi értelme a kurzorral végezni. főleg hibakezeléssel kapcsolatos dolgot megengednek. hogy megvásárolod a kiegészítő szoftvert a SESAM ODBC-interfészéhez. amely a kurzorban található sorok számát tartalmazza. de a további kapcsolatok során már gyors lesz. akkor használd a PHP SESAM-utasításait. Ez alighanem tovább csökkenti az erőforrások igénybevételét azáltal. Apache 2-t és Solid adatbázist fogsz használni. és ha végigmentél az adatokon.Áttekintés Mikor a SESAM saját interfészét installálod. De ha nem teheted meg.

hogy pontosan meghatározd.Kitöröl egy kulccsal meghatározott adatelemet.Szinkronizálja az adatbázist. dba_firstkey() .6. dba_replace() . dba_insert() . Mivel meg kell ne188 .(egy szerver a University of Illinois at Chicago Matematika. amit az alapjukat képező adatbázis megenged és olyan kérések továbbítását is lehetővé teszik.html.yp. és további paramétereket is hozzáadhatsz. dba_nextkey() . dba_exists() . A PHP több adatbázis absztrakciós réteget tartalmaz.Az első kulcsot adja vissza az adatbázisból. dba_sync() .to/cdb. amelyek átadásra kerülnek a fájlkezelőnek.A következő kulcsot adja vissza az adatbázisból. A gyakorlatban az adatbázis-absztrakciós rétegek abba a nehézségbe ütköznek. Az adatbázisok csoportja magában foglalja a Sleepycat Software (www. dba_fetch{) . dba_popen() . Statisztika és Számítástudomány tanszékéről) oldalról letölthető cdb-adatbázist.Ellenőrzi. • dba_delete() . a második egy hozzáférési mód: az r olvasási hozzáférést jelent. és különböző módokon kezelik az olyan funkciókat. A harmadik paraméter az aktuális fájlkezelő modul neve. DBA-utasítások A PHP adatbázis absztrakciós rétege (DBA) utasításai révén az adatbázisok egy csoportjához egy utasításcsoporttal férhetsz hozzá: • dba_close() . mivel a programozók több csoportja próbálja megoldani ugyanazt a problémát.Megnyitja az adatbázist állandó kapcsolattal.Kicserél egy rekordot. dba_open() .sleepycat.A nem használt terület eltávolításával optimalizálja az adatbázist. hogy egy külső szoftver technikai igényei helyett az alkalmazásod logikájára és az adataidra koncentrálj. Az első paramétere egy elérési útvonal. hogy az adatbázisoknak megvan a saját mezőformátumuk. hogy egy kulcs létezik-e az adatbázisban. csonkításához és írási/olvasási jog biztosításához. A dba_open() félúton van az adatbázishoz kapcsolódó és a fájlkezelő utasítások között.Bezárja az adatbázist. dba_optimize() . fejezet Adatbázisok Adatbázis-absztrakciós rétegek Az absztrakciós szintek elválasztják az adatbázisodat a kódodtól és lehetővé teszik.Beilleszt egy új rekordot. az n pedig adatbázis létrehozásához. valamint a http://cr. mint az autoincrement-mezők. vagy w írási hozzáférést. A következő részben ismertetett DBM-utasítások hasonlóak és a Sleepycat Berkeley DB termékeihez használhatók (A DBM a Berkeley DB elődjének neve).Megnyitja az adatbázist. a saját SQL-változatuk. hogy elolvasd a dokumentációt és elvégezz néhány tesztet. A PHP-utasítások mindent megengednek. a c az adatbázis létrehozásához és írási/olvasási jog biztosításához használatos. de nem kapcsolódik az IBM DB2-jéhez). amelyeket esetleg az nem támogat az adatbázis.com) Berkeley DB-adatbázisát (A Berkeley DB-t korábban DB2-nek hívták. Rajtad múlik.Egy kulcs által meghatározott rekordot ad vissza. mit csinál az adatbázis szoftver a kéréseddel.

lapozz vissza az odbc_pconnect()-hez. és bizonyos jellegű optimalizálást hajt végre az adatbázison. ha nem sikerül a csere. Kicseréli a kulcs által hivatkozott rekordot és siker esetén igazat. majd egy másik szkriptet futtatsz. amely egy rekordra mutató kulcsot és egy adatbáziskezelőt tartalmaz. például a dba_close()-ban.Kitöröl egy rekordot. abban az esetben pedig. dbmexists() . Beilleszti a rekordot és siker esetén igazat. A dba_exists() egy rekordra mutató kulcsot tartalmazó sztringet. A dba replace() egy rekordra mutató kulcsot és egy. tehát naponta egyszer vagy minden ezredik törlés után érdemes ütemezni. dbmdelete() . amely kiolvassa a beírt adatot. Ha a rekord visszanyerése előtt kulcs szerint szeretnél keresni az adatbázisban. a dba_firstkey() és a dba_nextkey() az adatbázis-kezelő alapján az első és a rákövetkező kulcsot adják vissza. Tesztelheted az adatbázisodat. hamisat ad eredményül. és bezárja az adatbázist. dbmfetch() . amit el kell végezned. Feltételezem. hiba esetén hamis. hamisat ad eredményül. dbmnextkeyO . A dba_fetch() paramétere egy sztring. ha nem találja. amely a dba_sync() nélkül ír az adatbázisba.Áttekintés vezned a fájlkezelőt. Megvizsgálja. és az összes puffereit rekord merevlemezre való kiírását kényszeríti. hogy a minimum eltávolítja a törlések és eltérő méretű frissítések következtében keletkezett üres helyet. A dba_close() argumentumában a dba_open() vagy a dba_popen() által visszaadott kezelő szerepel. hamisat ad eredményül. amely hasonló a fájlkezelőhöz vagy az adatbázis-kapcsolathoz. A dba_insert() egy rekordra mutató kulcsot tartalmazó sztringet. mint a Sleepycat DB2-je. hogy a kulcs létezik -e az adatbázisban. A dba_popen() a dba_open() állandó változatát biztosítja.Az adatbázis első kulcsát nyeri vissza. ha pedig a kulcs már szerepel az adatbázisban.A használatban lévő DBM-könyvtárat írja le. és más dba-utasításokban használható. egy a rekordot tartalmazó sztringet és egy adatbázis-kezelőt fogad el paraméterként. ha egy olyan szkriptet futtatsz. és ha létezik igazat. ha nem találja a kulcsot. . A dba_delete() egy rekordra mutató kulcsot tartalmazó sztringet és az adatbázis-kezelőt fogadja.Bezárja az adatbázist.Ellenőrzi.A következő kulcsot nyeri vissza az adatbázisból. és az adatbázis-kezelőt fogadja. ha egy olyan adatbázisba írsz. dbmcloseQ .Visszanyer egy sort az adatbázisból. A dba_open() az adatbázis kezelőt adja vissza. a rekordot tartalmazó sztringet valamint az adatbázis-kezelőt fogadja. Kitörli a kulcshoz kapcsolt rekordot és siker esetén igazat. A dba_optimize() egy adatbázis-kezelőt fogad. dbmfirstkey() . A dba_sync() paramétere az adatbázis-kezelő. Ha többet szeretnél olvasni az állandó kapcsolatokról. abban az esetben pedig.Beilleszt egy rekordot. hogy létezik-e a kulcs. hamisat ad eredményül. Visszanyeri a kulcshoz kapcsolt rekordot. DBM-utasítások A DBM utasításokkal az adatbázisok egy csoportjához egy utasításcsoporttal férhetsz hozzá: • • • • • • • • dblist() . dbmínsert() . és visszatérési értéke a siker esetén a rekord. ■■ 189 . a dba-utasítások kezdenek eltávolodni az igazi adatbázis-absztrakciótól.

hiba esetén hamis. fejezet Adatbázisok • dbmopen() . abban az esetben pedig. Az adatbázisok közt szerepel a MySQL és a PostgreSQL. A dbmreplace()-é egy adatbáziskezelő. a c az adatbázis létrehozásához és írási/olvasási jog biztosításához használatos. amelyeket a háttérben álló adat bázis nem támogat. A PHP-utasítások olyan műveleteket is lehetővé tesznek. Megvizsgálja. ezért olvasd el a dokumentációt. A dbmopenQ első paramétere egy elérési útvonal. mint pl. A dbminsertQ paraméterei egy adatbáziskezelő. és siker esetén igaz at. hamisat ad eredményül.sleepycat. A dbmexists() paraméterei egy adatbáziskezelő és egy rekordra mutató kulcsot tartalmazó sztring. Kitörli a kulcshoz kapcsolt rekordot. Ha kulcs szerint szeretnél keresni az adatbázisban. Beilleszti a rekordot. Ahol az adatbázis mind a DBA-. és az utasításai egyszerű összeköttetést tesznek lehetővé az adatbázisok egy csoportjával. végezz teszteket. hamisat ad eredményül. és bezárja az adatbázist. Kicseréli a kulcs által hivatkozott rekordot. és siker esetén igazat.com) Berkeley DBadatbázisa és a GNU (www.org/directory/gdbm. mind a DBM-utasításokat elfogadja. és visszatérési értéke a siker esetén a rekord. és ha létezik. hogy létezik-e a kulcs.6. egy rekordra mutató kulcsot tartalmazó sztring. hogy megbizonyosodj. csonkolásához és írási/olvasási jog biztosításához. Az adatbázisok között szerepel a Sleepycat Software (www.Kicserél egy rekordot. igazat. mert az IBM DB2-je már Unixon is elérhető és a PHP-dokumentáció egy kissé lassan követi a névváltozásokat. az utasítás valóban úgy működik az adatbázisoddal. és siker esetén igazat. ha nem sikerül a csere.gnu.html) gdbm-je is. A „DBA utasítások" részben leírt DBA-utasítások ezekhez hasonlóak. a dbmnextkey() pedig a rákövetkező kulcsot. ha nem találja a kulcsot. hamisat ad vissza. valamint egy rekordra mutató kulcsot és egy rekordot tartalmazó sztring. a második pedig egy hozzáférési mód: az r olvasási hozzáférést jelent vagy w írási hozzáférést.guidence. ha pedig a kulcs már szerepel az adatbázisban. ahogy feltételezed. • dbmreplaceQ . Visszanyeri a kulcshoz kapcsolt rekordot. ami a Berkeley DB egy régebbi neve (semmi köze az IBM DB2jéhez).Megnyitja az adatbázist. ha nem találja. DBX-utasítások A DBX a www. az n pedig adatbázis létrehozásához. a gdbm. A dbmdelete()-é egy adatbáziskezelő és egy rekordra mutató kulcsot tartalmazó sztring. a dbmfirstkey() az adatbáziskezelő alapján az első kulcsot adja vissza. A dbmcíose() a dbmopenQ által visszaadott kezelőt fogadja el paraméterként. melyikre van szükséged. teszteld mindkét interfészt. A dblist() kilistázza a DBM-utasításokhoz használt DBM-könyvtár tartalmát.nl/php/dbx/doc/-oldalon dokumentált. valamint más ODBC alapú adatbázisok. hogyan adhatsz hozzá további adatbázisokat (ha tudsz C-ben programozni): 190 . és a leírás szerint „a Sleepycat DB2 termékéhez használhatók". Gyanítom. A dbmfetch() paramétere egy adatbázis kezelő és egy rekordra mutató kulcsot tartalmazó sztring. és egy rekordot tartalmazó sztring. akkor hamisat ad eredményül. és a dokumentáció útmutatást tartalmaz arra vonatkozóan. abban az esetben pedig. és pontosan határozd meg. hogy a Sleepycat azért cserélte le a DB2 nevet.

valamint a sorokkal és az oszlopokkal (mezőkkel) kapcsolatos információkat. fejezetben tárgyalt MySQL-. SQL-állítás és opcionális jelzők. A dbx_close() a dbx_connect() által visszaadott adatbázis-kezelőt fogadja paraméterként. vagyis a DBX rendező utasításait nem használhatod olyan sokféleképpen. és lezárja a kapcsolatot az adatbázissal. vagy group byklauzuláját alkalmazod. • dbx_cmp_asc() . és egy olyan objektumot ad vissza eredményül. attól függően. egy kicsit olyan. A modulnév mssql. akkor szükségszerűen az eredményhalmaz létrehozása előtt rendezel. A MySQL-utasításokat könnyen és egyszerűen használhatónak találtam. felhasználói név. ahogyan az SQL rendezését. Valójában ha az SQL limit-. mint a mysql_connect() és a mysql_select_db() összegyúrva. • dbx_query() . hogy visszanyerés előtt rendezd az eredményt.és dbx_cmp_desc()-parancsok lehetővé teszik. • dbx_connect() . • dbx_sort() . amely kiegészíti a fenti utasításcsoportot. amely tartalmazza a sorokat. Végrehajtja a lekérdezést.A legutolsó hibaüzenetet adja. de ennek semmi előnyét nem látom. hogy mi van telepítve.net-en. az adatbázis-kezelőt azonosító információkat és további opcionális. visszatérési értéke pedig egy kezelő az adatbázis-kapcsolathoz. • dbx_cmp_desc() . hogy van-e olyan frissítés a php.Összehasonlítja a sorokat csökkenő sorba rendezéshez. szervernév. amíg megközelítik vagy a MySQL-. vagyis mielőtt üzleti alkalmazásban használnád ezeket az utasításokat. • dbx_error() . 191 . adatbázis. jelszó és egy változatlanságjelző.Megnyitja a kapcsolatot az adatbázissal. vagy pgsql lehet. és a legutolsó hibaüzenetet adja vissza. A dbx_connect() paraméterei egy modulnév. A dbx_sort()-. amelyeket túl bonyolult volna itt bemutatni. a jelzőktől függő információkat is.Áttekintés • dbx_close{) . Ezek a PHP-utasítások primitívnek tűnnek az 5. start-.Lezárja a kapcsolatot az adatbázissal. odbc.Végrehajt egy lekérdezést. mikor az SQL is tartalmazhat sorba rendezést. ellenőrizd. mysql. dbx_cmp_asc(). ezért én várnék a dbx-utasítások használatával. vagy az ODBCutasításokat.Rendezi a lekérdezés eredményét. az ODBC-vel néhány finom fogást is alkalmazni lehetett a távoli adatbázisokra. A dbx_error() argumentumában az adatbáziskezelő szerepel. PostgreSQLés ODBC-utasításokhoz képest. A dbx_query() paraméterei egy adatbázis-kezelő. kinyeri abból a sorokat.Összehasonlítja a sorokat növekvő sorba rendezéshez.

defaultlrl and uodbc. (Az állandó linkek maximális száma.defaultbinmode (Bináris adatok kezelése. Returns number of bytes to variables.) odbc.5 php. Solid. -1 means no limit. vagy azokban az esetekben. és az iODBC-plug-in-ek lehetővé teszik. IBM DB2-. ami rendkívül hasznos. és mindegyik különböző beállításokat igényel: [ODBC] .odbc. hogy .ini-fájlja a következő példában bemutatott ODBC-opciókat tartalmazza. A bájtok számát adja vissza a változóknak.defaultbinmode = 1 192 .) odbc.a kapcsolat még érvényben van-e az újbóli felhasználás előtt.ö.) odbc. (Engedélyezi vagy gátolja az állandó linkeket. (A 0 passthru-t jelent. 2 convert to char. (A linkek maximális száma (állandó + nem állandó).) 0 means passthru.max_links = -1 Handling of LONG fields. 0 means passthru. odbc.0.defaultlrl és az odbc. A www.defaultbinmode magyarázatához nézd meg az odbc_binmode-hoz és az odbc_longreadlen-hez tartozó dokumentációt. amelyek saját API-je úgy van megírva. (Ellenőrzi. Az uodbc. Check that a connection is still valid before reuse.) (A -1 azt jelenti. hogy emulálja az ODBC-t. mikor különböző típusú adatbázisokat érsz el. a 2 pedig char formátumra alakítást. valamint olyan adatbázisok is elérhetők általuk.) odbc .default_db = Not yet implemented (Jelenleg még nincs megvalósítva) .defaultlrl = 4096 Handling of binary data. ha az Internet-szolgáltató nem biztosít hozzáférést a php.ini-hez. See the documentation on odbc_binmode and odbc_longreadlen for an explanation of uodbc.max_persistent = -1 . Maximum number of links (persistent + non-persistent). def ault_jpw = Not yet implemented . Maximum number of persistent links. fejezet Adatbázisok Gyors megoldások Adatbázis elérése ODBC-vel A PHP ODBC-parancsai számos adatbázishoz biztosítanak kapcsolatot a hagyományos ODBC-mechanizmuson keresztül. allow_jpersistent = On . hogy nincs korlátozás. -1 means no limit.) odbc.) odbc.) (A -1 azt jelenti. mint az Adabas-. (A LONG mezők kezelése. hogy nincs korlátozás.check_persistent = On .iodbc. hogy további adatbázisokat is elérj. A 0 passthru-t jelent. Néhány beállítást felülbírálhatnak a PHP ODBC-utasításai. 1 return as is. Allow or prevent persistent links.és Sybase-. A PHP 4.default_user = Not yet implemented . az 1 változtatás nélkült.org oldalról letölthető iODBC és a PHP ODBC-utasításai összekapcsolhatóak.odbc.

a commit. Ha az első lekérdezésedre valamilyen furcsa hibát kapsz. akkor ne usert vagy file-t. hogy van „csomagolva". glass (üveg). Az odbc_pconnect() állandó kapcsolatot hoz létre. ahol sokan tinnie-nek . harmadiktól hatodikig terjedő példákban mutatjuk be. Ugyanazokat a paramétereket igényli. ha a mennyiség nem egy pint. akkor hogyan várhatjuk.és a rollback-utasításokhoz használatos kapcsolat azonosítót adja vissza. amely takarékosabban bánik az erőforrásokkal. Ha egy dátum mezőt ÉEÉÉ-HH formátumra állítasz be és az SQL-ben is EÉÉÉ-HH-formátumot használsz. felhasználó és jelszó. és az ODBC-szoftverhez biztosított dokumentáció alapján használd a többi kurzort. Az ausztrálok tetszés szerint keverik a beér (sör). hát olvasd el a szoftver dokumentációját. és csak akkor működik. de az MS Access-ben kettőskeresztet (#) (amit néhány ember pound-nak . hogy az adatbázis-készítők megegyezzenek? A Microsoft néhány szoftverben aposztrófot (') használ a dátumok körül. Ha sörivók nem tudnak megegyezni egy általánosan elfogadott terminológiában. hanem SYSTEM típust használj. A négy típust a következő. amit a következő példakód mutat. ha a kapcsolat megszakadt. ha CGI-ként. és függetlenül attól. és mindegyik más adatbázist használ. mint ahogy itt látható . mint az odbc_connect(). milyen kapcsolódási sztringet kell megadni néhány ODBC-szoftvernek: 193 . A második sor a MS Access date()-formátumát mutatja: $sq± = "select * from stock where updated >= #2002-04-20 0 0 : 0 0 : 0 0 # " . A következő' példák különböző kapcsolatokat mutatnak. akkor nem.font . a kisüvegesre a stuhbie kifejezést használják. míg másoknak belső formátumban. és a lekérdezésekhez. A dsn tetszőleges azonosító lehet. Az odbc_connect() kapcsolódik az adatbázisszerverhez. igen hasonlóan a mysql_connect()-hez és a pg_connect()-hez. scbooner (korsó) és a pint kifejezéseket.hívják a dobozos sört). mert a webszerver systemként (rendszer) fut. akkor próbálkozz a teljes dátumformátum mal. Az utolsó példa azt mutatja. amelyek mind egy üveg sörre vonatkoznak.hív). Az első a minimális paramétereket használja: dsn. amit az ODBC-szoftvered megenged. Az odbc_connect() lehetővé teszi. és az SQL különös hibaüzeneteket küld a dátummal kapcsolatban. még akkor is. például friss hírekkel vagy aukciókkal ellátott portál alkalmazásai más szállítóktól származnak. de nem sok adatbázis beszél tiszta SQL-t. hogy meghatározd az ODBC-hez használt kurzor típusát. és nem fogja látni az user vagy file ODBC definíciókat.lehet hogy az adatbázis a saját belső formátumával megegyező teljes formátumot szeretné megkapni az ODBC SQL-jétől. $formatted_date = date("Y-m-d H : i : s " ) . míg a dobozos sört canneW (doboz) hívják (kivéve Sydneyt. mikor egy mindenféle funkcióval. akkor próbáld meg az SQL_CUR_USE_ODBC-kurzortípust. Kapcsolódás az adatbázishoz 142 Ötlet: Ha Windows-os ODBC-t használsz. ha a PHP Apache-modulként fut. A britek a közepes méretű sört pintnek hívják.Gyors megoldások Az SQL az ODBC szabványos nyelve. Az odbc_close() hamisat (nullát) ad vissza.bádogdoboz . Tovább fokozza az SQL gyötrelmeit. hogy néhány adatbázisnak a megjelenítés formátumában kell megadni a mezőket. A kidolgozott példák tipikus esetei annak.

így az egyes odbc_execute()-utasítások egy kicsit gyorsabban futnak le. $ c o n ne c t io n [ "s t o le n g o o ds " ] = o db c _ co nn e c t (" a u ct i o ns i t e" . $sql = "select * from prices where item = ? and price < ? " . míg a odbc_rollbac() az összesét törli. " b i li " . "geo rge w". és visszaállítja a változtatásokat (feltéve. valamint egy rejtett csapdát nem számítva ugyanazt végzik el. 5 0 " ) . ha minden műveietet visszavont. $selection = arrayC'C". item. Sconnec tio n ["mu sic "] = odbc _co nne ct( "nap st er". $sql_result = odbc_prepare(Sconnection["vitamins"]. "p ete r". $selection = array("bl2". mint az odbc_exec(). $conne cti on[ "e roti ca" ] = odbc _co nne ct( "eve ry wher e".P WD=b lb 6bl2 "). " " ) . Az is előfordulat. Az odbc_commit() végrehajtja a kapcsolatban az összes tranzakciót. A következő' példakódban az odbc_exec() futtatja a megadott SQL-lekérdezést. " " . az odbc_do() paraméterei a kapcsolatazonosító és a lekérdezés. " z z 15 z z ") . " p e te r " . ha valami nem sikerült: 194 . Sselection). és egy árnyalatnyi különbséget. Sconnection["vitamins"] = odbc_connect( "DSN =ch emi cal fact or y. "Over21". " 5 . ami időt takarít meg. Valóban hasznos-e tehát az SQL-t előre lefordítani? Ha a szknpted kötegelt adatfeldolgozást végez és minden bemenő rekordhoz lefuttatja a lekérdezést. 11 z z 1 5 z 2 " . és az odbc_execute() a kérdőjeleknek megfelelő paramétereket tartalmazó tömböt ad át az ODBC-nek. $result = odbc_execute($sql_result. -! H. vagy hamis. vagy a dokumentáció szerint az adatbázis nem alkalmaz előre lefordítást. Az odbc_prepare() és az odbc_execute() együttműködnek. ha egy nézetként beilleszted őket az adatbázisba. Az odbc_prepare() által átadott SQL-kérdőjeleket (?) tartalmazhat az értékek helyén. SQL_CUR_USE_DRIVER). ha a lekérdezést nem sikerült végrehajtani. ha a szkript ugyanazt az SQL-t futtatja változtatott értékekkel: $sql = "select brand. $result = odbc_execute($sql_result. Sconn ect i on[" nuc lea r w eapo ns "] = od bc_ con nect (" NSAs erv er" . és az eredmény azonosítóját adja vissza. visszatérési értéke pedig az eredmény azonosítója. Néhány adatbázisszoftver a hatékonyabb erőforrás-kihasználás érdekében előre lefordítja az SQL-t. hogy az adatbázis képes rollback elvégzésére). akkor az odbc_prepare() és az odbc_execute() kombinációja valószínűleg lassabb lesz. hogy az adatbázisod nem fogadja el az odbc_prepare()-t. " 3 . SQL_CUR_USE_ODBC). Az odbc_exec() és a szinonimája. Az odbc_rollbac() eredménye igaz. price from prices where item = $result = odbc_exec($connection["vitamins"]. SQL_CUR_USE_IP_NEEDED). 0 0 " ) . $ s q l ) . $sql). vagy ha az adatbázishoz biztosított speciális előfordítót használod.UI S=p ete r. "p ete r". akkor 300 ezer inputrekordot és műveletenként 1 tizedmásodpercet feltételezve a teljes megtakarítás 8 óra 20 percet tesz ki. mint a odbc_exec().6. és hamis. Ha ugyanezt a lekérdezést online futtatod oldalanként egy lekérdezéssel. SQL_CUR_DEFAULT ) . Néhány adatbázisban a gyakran használt SQL-műveletek gyorsabbá tehetők. 'bl2'". $ c o nn e c t io n [ "s t o le n go od s " ] = o d b c _c o n ne c t (" a u ct i o n s i te " . Sselection). fejezet Adatbázisok Sconnection["vitamins"] = odbc_connect{"vitamins" . "blb6bl2". "w".

továbbá. Hiba esetén -1 a visszatérési értéke (mivel 0 értelmes eredményt is jelenthet). $result = odbc_exec($connection["vitamins" ]. mivel az odbc_fetch_row() hamisat ad hiba esetén. de még nem nyerted vissza az eredményt. if(odbc_fetch_row($result. amelyek mindig -1et adnak. Eredmények Ezen a ponton rendelkezésedre állnak egy kapcsolat megnyitásához és bezárásához. kivéve azokat. delete-. hogy gazdaságosabban használd az erőforrásokat. valamint egy lekérdezés futtatásához szükséges kódok. Itt a vitamins-szerverrel zárjuk a kapcsolatot: odbc_ciose{Sconnection["vitamins"]). hogyan lehet végiglépkedni a kurzoron az odbc_num_rows() (feltéve. hogy működik az adatbázishoz) és az odbc_fetch_row() segítségével. // else // Insert error message Process result with odbc_result() here Mikor az odbc_fetch_row() visszanyer egy sort. hogy a második paraméter. for($r = 1. és update-utasítások valamelyike által módosított sorok számát adja. Az odbc_num_rows() paramétere az eredmény azonosítója. Beszámoltak olyan adatbázisokról. $r++) $r)) $sql). Nem zárja le a kapcsolatot.Gyors megoldások Sstatus = odbc_commit{Sconnection["vitamins"]). vagy az insert-. Az odbc_fetch_row()-hoz whileQ-ciklust is használhatsz. odbc_close_all(). amelyeknek még nyitott műveletük van. valószínűleg az adatbázisszoftver hibájából kifolyólag. $rows = odbc_num_rows($result). és a sor pointerét a következő sorra viszi a következő adatkinyerés- 195 . A következő kód bemutatja. Az odbc_close_all() az összes ODBC-kapcsolatot egy mozdulattal bezárja. Sstatus = odbc_rollback(Sconnection["vitamins"]). és egy select-utasítás eredményéhez kapcsolódó kurzor sorainak számát. ezért ez a rész teljes egészében az eredményről szól. $r <= $rows. A sorok számozása 1-gyel kezdődik. és ehhez az odbc_connect() eredményéül kapott kapcsolatazonosítóra van szüksége. a sor indexe kimaradt. Figyeld meg. Az odbc_fetch_row() alapértelmezés szerint az aktuális sort olvassa. az adatbázisszerver a hálózaton keresztül átküldi a sort az ODBC helyi memóriájába. egy hibakezelő részt is adtam a programhoz: $sql = "select * from prices". ahol az odbc_result()-utasítással férhetünk hozzá. Az odbc_close() lezárja az adatbázis-kapcsolatot a szerverrel. ha még aktív műveletek vannak. ezért a for()-ciklust 1-től indítjuk. A while()-ciklust a következő példa mutatja.

" stock. $sql). mint az 5. akkor rendelj egy alternatív nevet a kérdéses név második és további előfordulásaihoz. sor mutatja.item = prices. akkor hagyd ki a gyanús mezőket. fejezet Adatbázisok hez. Végtelen sok beszámoló foglalkozik azokkal az ODBC-problémákkal. valamint egy opcionális formázó sztringet. és lépésről lépésre add hozzá a mezőket. ahogyan az each()-utasítás kezeli a tömböket (a magyarázatot lásd a 2. quantity. Jobban járnál. price from prices where t y p e = ' D ' " . igen hasonlóan ahhoz. mint a következőkben látható: $sql = "select brand. Ha kétségeid vannak egy mezővel kapcsolatban. Esetleg kezdd nulláról a minimális SQL-lel. és kinyomtatja a kurzor tartalmát.updated. vagy szokatlan típusú. és egy mezőt ad vissza az eredménykurzorból. 1-gyel kezdődően. price: " . azaz próbáld csak a fontos mezőket kiválasztani. 1) . " p r i c e " ) ) . ahol egy mező túl hosszú. o d b c _r es ult($r es ult. $ r e s ult = o d b c _ e x e c( $ c o n n e c ti o n [ " v it a m i n s "] . így a hálózatot sem terheled feleslegesen. így név szerint is azonosíthatod őket az SQL-ben. item. $result = odbc_exec($connection["vitamins"]. ami a 6.item"."select brand. Az odbc_result_all() egy lekérdezés eredményazonosítóját fogadja paraméterként. akkor hagyd ki. és olvasd el az adatbázis dokumentációjából. amíg nem működik. de ezzel nagyon leterhelnéd a hálózatot. és ezen mennél végig többször. price. prices. odbc_result($result.6. stock where stock. // Process result with odbc_result() } else { // Insert error message here Az odbc_fetch_row()-t arra is használhatnád. " . vagy az eredmény túl sok mezőt tartalmaz. A kurzor tartal - 196 . ha beolvasnád a kurzort egy PHP-tömbbe. w h i l e ( o d b c _ f et c h _ r o w ( $ r e s u l t ) ) { $sql). Ha egyszerre több táblából nyersz ki mezőket és több különböző táblában ugyanolyan nevű mezőid vannak." . Ha problémáid vannak egy SQL-lekérdezéssel. A mezőazonosító lehet a mező száma. sorban látható: $sql . " from prices. V Az odbc_result() paramétere az odbc_fetch_row() által megadott eredményazonosító és j egy mezőazonosító. és addig próbálkozz. fejezetben): $sql = "select * from prices". hogy többször végiglépkedj az eredmény kurzoron. hogyan adja át az adatbázis a nagyon hosszú mezőket az ODBC-nek. vagy lehet a mező neve. while(odbc_fetch_row($result)) { pri nt(" < br > Bra n d: " .updated as datestockchecked" .

3 ábra Price-táblázat megjelenítése az odbc_result_all()-lal és egy formázó sztringgel Vannak helyzetek. $result = odbc_exec($connection["vitamins " ] . közvetlenül egy korábbi példából származó odbc_exec()-parancs után: $sql .2 ábrán látható. $result = odbc_exec($connection["vitamins' $result_all = odbc_result„all($result) ."select * from stock". A táblázat celláit vagy a cellák tartalmát nem lehet formázni.9500 2002-04-21 00:00:00 00:00:00 38. Az első kód eredménye a 6. A következő példában az odbc_num_fileds() használat a látható. $number_of_fields = odbc_num_fields($result) . A következő példák a stock. az eredmény a mezők számának ismerete nélkül is feldolgozható.9500 12002-04-19 00:00:00 Í2002-04-19 29. vagyis az odbc_result_all() tesztelési és hibakeresési feladatokra korlátozott.9500 S 6. $sql).Gyors megoldások mát egy HTML-táblázatba illeszti.2 ábra Stock-táblázat megjelenítése az odbc_result_all()-lal TD\ brand s pili s pili s pili s item 1 igeneric jgeneric price | npdated 2.9500 pJÖÖZ^Ö4-2TÖÖ:00:00 [6 ^NatureVpílís bl2~782^5000 2ÖÖ2-Ö4-21 00:00:00 2. $result_all = odbc_result_all($result. és nem az eredményt akarod feldolgozni. $sql = "seiect * from stock".3 ábrán. A formázó sztring bármi lehet. mikor csak a mezők számára vagy kíváncsi. $sql) $sql = "select * from prices". $result = odbc_exec($connection["vitamins"]. A megjelenítés azonnali. 197 . Mivel a legtöbb szkript a sorokat tömbként kapja meg. a prices-táblából származó eredmény a 6. az outputot nem helyezheted el egy sztringben. amit szeretnél hozzáadni a <table> tag-hez. "border=\"5\" ED 1 2 3 4 5 6 braiid item quantity A C A B C bl2 2 5 1 4 3 7 updated 2002-04-19 2002-04-19 2002-04-21 2002-04-21 2002-04-21 2002-04-21 00:00:0 00:00:0 0 0 00:00:0 0 00:00:0 0 00:00:0 0 00:00:0 0 generic generic Naíure's pili Naíure's Naíure's Naíure's 6. $sql).9500 2002-04-21 00:00:00 13 Nature's pilis'A fi Nature's pilis B J5~JNature's pilis jc (35. mikor szeretnéd tudni a mezők (vagyis oszlopok) számát az odbc_exec()-ből származó eredményben: ekkor az odbc_num_fileds() adja meg a választ. ezért felteszem.és dump-teszttáblákat jelenítik meg. hogy sokkal inkább azokban az esetekben fogod használni ezt a számot.

akkor a sor pointerét növelve végiglépked a sorok egy halmazán. hogy felülírja a tömböt. és a változót tömbbé konvertálja. de nem állítja vissza a tömb belső pointerét. egy pár árnyalatnyi eltérés magyarázatra szorul.5 Win32 verziójában használtam.0. és egy tömb. mint a következő' kódban látható.4. else print("<br>No result" A példa eredménye a 6. while($result_all = odbc_fetch_into($result.4 ábra Stock-táblázaí megjelenítése az odbc_fetch_into()-val Mikor az odbc_fetch_into()-parancsot a PHP 4. } print("</table>" ). Az utasításnak meg kell adnod a sor indexét. és egy sort ad vissza az eredményhalmazból. az t tapasztaltam. print("<tr>" ). Noha az utasítás olyannak tűnik. minden korábbi tartalmat törölve. $array)) { reset($array). while( l i s t ( $ k . $v . ha pedig nullát adsz meg. ábrán látható. fejezet Adatbázisok Az odbc_fetch_into() paraméterei az eredmény azonosítója. if ( Sre s ult) $sql). Ahelyett. mint a következő példában látható: $sql = "select * from stock". $result = odbc_exec($connection| "vitamins"]. az odbc_fetch_into() a tömbben elhelyezett mezők számát adja vissza. 0. hogy más sorvisszanyerő utasításokhoz hasonlóan egy tömböt adna vissza. ha nem ilyen formátumú volt. vagyis bármelyik sort visszanyerheted. ha nem nyert vissza semmit. vagyis az odbc_fetch_into() egyszerűen beírja a tartalmat a tömbbe. vagy hamisat. egy sor index.6. és a 198 . $v) = each($array)) print("<td>" . A tömb hivatkozás szerint kerül átadásra.$array = "" . } print("</tr>" ). [Tjgeneric JA~~[2 [2002-04-19 00:00:00 2002-04-19 00:00:00 pilis A T 2Ö02-Ő4^2Í 00:00:00 4 ÍNaíure's pilis B 4 2002-04-21 00:00:00 [5 JNature's pilis jcT~ (3 [2ŐŐ2ÍI4-2100:ÖÖÍÖO |?|Nature's pilis [bÍ2!7 J 6. mint néhány másik sorvisszanyerő parancs. print ("<table border=\ "3 \ ">" ) .

Az MS Access több embernek lehetővé teszi. az odbc_errormsg() pedig egy hibaüzenetet. ezért itt MS Access-t használtam egyrészt a saját problémáinak illusztrálására. és szeretnéd úgy módosítani a feldolgozást. először olvasd el a PHP-dokumentációt. a php. hogy megnézze az adatokat. Ezután szedd össze a bátorságodat. SQL state S1000 in SQLConnect (Figyelem: SQL-hiba: [Microsoft][ODBC Microsoft Access Driver]-t nem lehet megnyitni (ismeretlen). másrészt hogy megmutassak néhány dolgot. a hosszukról és egyéb információkról. hogy illeszkedjen hozzá. Mindkettő egy üres sztringet ad. ezért küldtem egy beszámolót a rendellenességről a php. és ekkor az összes kapcsolatban legutoljára felmerült hibát adják vissza. és mindent tökéletesen kinyomtatott. Mielőtt elküldenél egy hibáról egy beszámolót. Ha akkor próbálod meg elérni az adatbázist. de egy adott pillanatban mindössze egy személy frissítheti őket. Az egyetlen különbség az ODBC-verziók és más adatbázisok hasonló kódja közt.) Mezőkkel kapcsolatos információk Mikor visszanyered az eredményt. hogy az index nem 0-val. message: " . Mindkét utasításhoz meg adhatsz egy kapcsolatazonosítót. Megjegyzés: Ha gyanúsnak találod egy PHP-utasítás működését. a fájl már használatban van. } Az MS Access olyan viselkedést mutat. ha van egy listád a mezőnevekről. file already in u s e . i f ( ! $ r e s u l t = odbc_exec($connection["vitamins"]. és a tömb elejére állítja a pointert. A kód valamennyi. hogyan jelenítheted meg a hibainformációkat a lekérdezés után: $sql = "select brand. ". A segítséged javíthat a PHP kódján vagy dokumentációján. . alaposan tanulmányozd át a hibajelentéseket. A következő példakód azt mutatja.net/bugs. amire más adatbázisoknál is érdemes figyelni. Beillesztettem a tesztkódba a reset($array) -utasítást. Hibák Mi történik.php-oldalon. azaz minden mezőt pontosan a saját igényeidnek megfelelően dolgozhatsz fel. és jelentsd a hibát. nézd meg a hibákról szóló beszámolókat a http://PHP.net-re. amely tipikus bizonyos adatbázisokra. hanem l-gyel kezdődik. odbc_error(Sconnection["vitamins"]) . $ s q l ) ) { print("<br>ODBC error number " . odbc_errormsg($connection["vitamins" ])). és készíts olyan átfogó tesztkódot. price from prices where type= ' bl2 ' " . A következő program az összes információt visszanyeri az eredmény valamennyi mezőjéről. akkor a következőhöz hasonló hibaüzenetet fogsz kapni: Warning: SQL error: [Microsoft][ODBC Microsoft Access Driver] Could not use '(unknown)'. ha nem volt hiba. akkor jól jön. vagy létrehoz egy ú) tömböt. A legtöbb tömbfüggvény vagy a tömb végéhez adja a sort. mikor az meg van nyitva frissítésre. és a megadott kapcsolat utolsó hibájáról fognak információkat adni.net FAQ-jait. a mezők infor- 199 . ha egy hiba van az ODBC-ben vagy az adatbázisban? Az odbc_error{) egy hatjegyű hibakódot tartalmazó sztringet ad eredményül. amely minden lehetséges variációt megmutat még a hiba jelentése előtt. de kapcsolatazonosító nélkül is használhatod őket.Gyors megoldások tesztkód csak egy sort jelenített meg. item.

$i). fejezet Adatbázisok mációinak begyűjtésére használatos ODBC-utasítást bemutatja: function odbc_fields($result) $number_of_fields = odbc_num_fields(Sresult}. Az odbc_field_precision() az odbc_filed_len() szinonimája. falsé). Az első paramétere az eredményhalmaz azo nosítója. Az odbc_binmode()-utasítással beállíthatod. Az autocommit kikapcsolása egy tranzakciót indít. a második pedig a következő példakódban bemutatott három választási lehetőség. 5 Az odbc_field_name() az oszlop indexhez tartozó mezőnevet. $i). // Sarray[$i] ["length"] = odbc_field_precision($result. a harmadik pedig kikapcsolja az autocommit-ot: $status = odbc_autocommit($connection["vitamins " ] ) . az ODBC_BINMODE_RETURN hatására abban a formában kapod meg az adatokat. vagyis az előző kód csak szemléletesen állítja be a Sarray[$Í] ["column"] értékét az odbc_field_num() utasítással. vagy újra bekapcsolja. További utasítások Az odbc_autocommit() az alapbeállítás szerint bekapcsolt autocommit beállítást kapcsolja ki. ha szükséges. az odbc_field_num() pedig a megadott nevű mező indexét adja vissza. ezért csak megjegyzésként szerepel az előző kódban. hogy az ODBC-n keresztülhaladó bináris adatokat karakteres ábrázolásban kapd meg. Sstatus = odbc_autocommit($connection["vitamins"]. Sarray[$i]["name"]). Sarray[$i] ["length"] = odbc_field_len($result. amelyet az odbc_commit()-. for($i = 1. mivel a szám már ismert volt. $i++) $array[$i]["name"J = odbc_field_name($result. Sresult = odbc_exec(Sconnection["vitamins"]. ODBC_BINMODE_CONVERT pedig a hexadecimális 200 . Sarray[$i] [ "type"] = odbc_field_type(Sresult. Az odbc_field_scale() a lebegőpontos számok tartományát adja meg. {Sarray = falsé.6. Az ODBC_BINMODE_PASSTHRU változtatás nélkül adja át a bináris adatokat. true). if <$result) $fields = odbc_fields($result). $i). ahogyan az adatbázisban szerepeltek. $i <= $num_of_fields. Sarray[$i] ["column"] = odbc_field_num(Sresult. $i) if(!isset($array) return($array). $status = odbc_autocommit($connection["vitamins " ] ."select * from stock". A következő mintakód első sora a jelenlegi állapotot adja vissza. vagy az odbc_rollback()-utasításokkal lehet lezárni. $sql . $sql). a második sor be-. Sarray[$i]["scale"] = odbc_field_scale($result.

és olyan szkriptekben lehet hasznos. $ s q l ) . A 6. price from prices $result . hogy a kurzort közvetlenül beolvasod egy tömbbe. aki otthagyta lassú honlapodat és inkább a versenytársad oldalán vásárol (hacsak a konkurencia nem kezeli még hanyagabbul a tranzakciók végrehajtását és az erőforrások felszabadítását). Az odbc_free_results() felszabadítja az erőforrásokat. Ha az eredményhalmaz létrehozása előtt szeretnéd visszaállítani a bináris mód alapértékét. Minden nyitva hagyott kurzor. vagy az odbc_rollback()-utasítások valamelyikét. amelyek hosszú kurzorokat olvasnak. A következő példában az eredmény feldolgozása után felszabadítjuk az eredményhalmazt (a feldolgozást a tömörség érdekében kihagytam). érde mes fontolóra venni azt a lehetőséget. ezáltal felszabadítod a kurzort. annál nagyobb mértékű a megtakarítás: $sqi = "select brand. akkor az eredmény azonosítóját ál lítsd nullára az odbc_binmode()-utasításban. etch_rov. Az odbc_cursor() paramétere az eredményhalmaz azonosítója.Gyors megoldások sztnng ábrázolási módba konvertálja a bináns adatokat.6 ábra a PostgreSQL-adattípusokat mutatja. ODBC_BINMODE_CONVERT).5 ábrán látható táblázatot kaptuk a MS Access-ből. majd egy tranzakciót kezdeményezel és kiadod az odbc_free_result()-parancsot. A felszabadított erőforrások mennyisége változó: minél hosszabb a kurzor vagy a szknpt. ( $result) ) // process result in here where t y p e = ' D ' " . és a kurzor nevét adja vissza. aki vásárolhat a boltban. Az eredmény jelentős eltéréseket mutat az MS Access-hez képest. A következő mintakóddal a 6. Egy online vásárlásra szolgáló weblapon gyakran egy sok alkalmazást és felhasználót kiszolgáló központi adatbázisszerver a szűk keresztmetszet . amely a forrásadatbázis összes elérhető adat típusát és az egyes adattípusok tulajdonságait tartalmazza. akkor a tranzakció törlődik. Ne feledd. vagyis légy határozott. melyek sok kurzort hoznak létre. ezek közül néhány csak egy adattípusra vonatkozott. amelyeknek 14 tulajdonságoszlopa volt. és az adatfeldolgozást a tömbből végezd. Az odbc_gettypeinfo() egy kurzort ad vissza. lásd a következő kódot: print("<br>Current cursor: odbc_cursor($result["vitamins"]. Az olyan szkriptekben. az ODBC által nem kezelt különbségeket: 201 .tehát minden felszabadított kurzor egy további vásárlót jelent. while (odbc_f odbc_free_result($result). item. Ha kikapcsolod az autocommit -ot.odbc_exec($connection["vitamins"]. amelynek 18 tulajdonságoszlopa volt. különösen a végre nem hajtott tranzakciókhoz kapcsolódó. és az adatbázisok közötti különbséget hivatott szemléltetni. és először használd az odbc_commit()-. Néhány adatbázisnál egy nyitva hagyott frissítési tranzakció gátolhatja vagy súlyosan lelassíthatja az olvasási tranzakciókat. vagy nagyon hosszú kurzorokat használnak. különösen az adatformátumok közötti. hogy a beállításaidat az odbc_longreadlen()-utasítás is befolyásolja (amit a következó' részben tárgyalunk): $status = odbc_binmode($result["vitamins"] $status .odbc_binmode($result["vitamins"] $status = odbc_binmode($result["vitamins"] ODBC_BINMODE_PAS STHRU) ODBC_BINMODE_RETURN). olyan vásárlót jelent.

......... : _ J L .1? ..1000 15 15 10 ■4 1 char char dalé numeric float8 float8 iní4 ... _.... fejezet Adatbázisok TYPE NAME DAT A GUID -11 BTT !|-7 LONGBINARY....................... 10 _ ..._ 1............ _______ .. I |3 11073741823 jOx Ox "BYTE -6 ....... JL ...LONGCHAR CHAR CURRENCY 2 INTEGER 4 ! COUNTER 4 SMALLJNT i 5 REÁL ! 7 DOUBLE j|8 1255 _______________ 10 ! 10 i 5 7 | 15 1255 19 ...... 1 254 ..6 ábra Típusinformáció PostgreSQL-ből ODBC-vel és odbc_gettypeinfo()-val $result = odbc_gettypeinfo($connection["vitamins"])............ _........ il . _ .......... • • ! i J ' 1 -4 ........ ............... ....... „ ![ _________ . if($result) .5 ábra Típusinformáció MS Accessből ODBC-vel és odbc_gettypeinfo()-val | T YPE JVAMÉ IDATA TYPE PRECISION LITERALPREÍTX LITERAL SUFFTX ■1-5 iintS -7 1 9 3 8 ! « 4 J... text numeric floaí4 \ iní2 time datetime int2 19 ! .. _J 8190 1000 7 \ 5 8 19 ___ j 5 i 1 ....... ...... _ .........lo .. ... ........ . 12 254 254 bytea varchar -3 ' ___________ _ 6. -í 2 7 5 ...6............_JL ............... L _ _ jJ255~ BINARY 1-2 ... ...' __ DATETIME VARCHAR U J 6._ .......-4 TYPE COHJMN_SEE jLTTERALPREFIX^ITERALSUrnX 1 ll |36 fi ....... 10 11 -6 ............ ......................... 9 1 __ ........._ 1 il .....

{ $result_all = odbc_result_all($result. "border=\"3\"": 202 4 .

az eredmény pedig a 6. a második pedig a maximális hossz bármely mező számára. a _ pedig egyet. Más szoftverekkel lehet hogy nem működik. "bor der = \" 3 \ " " ) . 60). odbc_longreadlen($result.) A kódot. "TABLE_VIEW ". 0. és egy hatalmas acélkalapácsot helyeznél a vattapamacsok mellé: vagyis ne használd. owner. amit a táblák felsorolására használtam. 200)) while(odbc_fetch_row(Sresult)) Az odbc_setoption()-parancs valami olyasmi. a második értéke 1 a kapcsolatopciókhoz és 2 az eredményekhez. Az odbc_setoption() lehetővé teszi. a MS Access-ben a memo és bármilyen long.Gyors megoldások Az odbc_longreadlen() az odbc_binmode()-utasítással együttműködve a hosszú mezők kezelésének beállítására szolgál. amely az adatbázis összes tábláját tartalmaz za. long binary vagy blob nevű mező. végzetes lehet valaki más számára. 2. hogy egy végzetes értéket állít be egy másik paraméternek: odbc_setoption($result. ha nem tetszik neki. de az eredménye megbízhatatlan. (Például a PostgreSQL támogatja a nézeteket. mint pl. amely 200 karakterre korlátozza a hosszú mezők méretét: $sql = "select * prices". de az adatbázis bármelyik opciót figyelmen kívül hagyhatja. Ami számodra működik. illetve az is lehet. $sql). csak üres sorokat adott vissza. amíg nem tudod pontosan. A types-paramétertípusok vesszővel elválasztott felsorolását tartalmazhatja. a negyedik pedig az opció értéke. mivel a lehetséges beállítások adatbázisonként és az adatbázisszoftverek verzióiként változnak. megjósolhatatlan és alkalmanként kifejezetten antiszociális. mintha kinyitnád egy szalagtisztító készletedet. hogy mit is csinál. Legalább a kapcsolatot meg kell adni.7 ábrán látható: $result = odbc_tables($connection["vitamins"]). de amikor nézeteket akartam. 203 . A nulla érték jelentése. A következő példa néhány ODBC-szoftvernél és adatbázisnál 60 másodpercre állítja az időtúllépési korlátot. if($result) { $r esul t _al l = odbc_r esul t _al l ( $r esult . a következő példa mutatja. $result = odbc_exec($connection["vitamins" ] . hogy a hosszú mezők csonkítás nélkül kerülnek átadásra. amit az ODBC-szoftvered dokumentációjából tudhatsz meg. Az odbc_tables() egy kurzort ad eredményül. Az első paraméter az eredmény azonosítója. mint ahogyan néhány adatbázisban a text. a harmadik az opció száma. A következő példában egy korábbi kód eredményt kiolvasó részébe.vagy az eredményazonosító. valamint számos opcionális paraméter megadható. amit átad az adatbázis. A % nulla vagy több karaktert helyettesíthet. aki a te kódodat próbálja használni. név szerint: qualifier. name és types. az odbc_exec()-parancs után beillesztettük az odbc_longreadlen()-t. hogy opciókat állíts be a kapcsolathoz és az SQL-utasítások végrehajtáshoz. Az owner és a name SQL-stílusú keresési minták használatát teszi lehetővé. Az első paramétere a kapcsolat.

amely azon mezők (oszlopok) azonosítását szolgálja. Ugyanazokat a paramétereket kell megadni. lehet hogy nem. tudnod kell. Az odbc_primarykeys() meghatározza az elsődleges kulcsot a táblában. és hogy milyen gyakran tömörítsd az adatbázist. a PHP-ban van két új függvény: az odbc_procedures() felsorolja a tárolt eljárásokat. amelyek dinamikusan frissítik a táblákat. hogy mely mezők szerepelnek az elsődleges kulcsban. hogy bizonyos lekérdezéseket optimalizáljanak. Néhány csak akkor készít statisztikákat. akkor ki kell hagynod az automatikusan növelt értékű mezőket a felhasználó által frissített mezők közül és a frissítő SQL-parancsból. majd az eredményt összevonni az odbc_tableprivilages() eredményével. és ugyanolyan outputot állít elő. hiszen úgy készítették el őket. Az odbc_tableprivileges() csak a kitüntetett táblákat sorolja fel. fejezet Adatbázisok TABLE QUALIÍTER TABLE OWNER iREMARKS ipnces stock TABLEJNAMEITABLE TYPE JTABLE fTABLE i I 6. amelyek az általam ODBC-vel tesztelt adatbázisokkal nem működtek. melyek egyértelműen meghatároznak egy táblát. Új utasítások Ebben a részben új. akkor először az odbc_tables()-t kell futtatnod. vagyis ha az összes tábláról szeretnél egy felsorolást. hogy az adatbázis nem biztosítja a megfelelő adatokat ODBC-n keresztül. ha dinamikusan akarsz hozzáférést adni egy táblához. az odbc_foreignkeys() pedig a táblában lévő idegen kulcsokat vagy a tábla elsődleges kulcsára mutató idegen kulcsokat más táblákban. ha dinamikusan akarod kiválasztani. A statisztikák alapján meghatározhatod. hogy melyik tárolt eljárást igényli a feladat. hogy van-e frissített dokumentáció ezekhez a parancsokhoz. tönkreteheted a táblák közötti relációkat. az odbc_procedurecolumns() pedig segít azonosítani a tárolt eljárásokban használt oszlopokat (mezőket). de nem minden adatbázis gyűjt statisz tikákat. hogy hozzáadj-e egy indexet egy mezőhöz. Kevés adatbázis támogatja a tárolt eljárásokat. 204 . Az odbc_specialcolumns() egy másik új utasítás. amely külön megjelöli a kitüntetett táblákat. Mindkettő fontos. Ha az adatbázisod támogatja a tárolt eljárásokat. Ha mégis ilyenre bukkansz. Az adatbázis dokumentációját is nézd meg. számos tárolt eljárás ugyanazokat a mezőket éri el némileg különböző stratégiával. hasznos ODBC-utasításokat sorolok fel.net-en. vagy eltávolíts-e egy meglévő indexet. mert lehet. a táblákhoz kapcsolódó előjogot. Akkor lehet szükséged ezekre az utasításokra. Ha egy frissítési oldalt hozol létre. nézd meg a php.6. mint az odbc_tables()-utasításhoz. ha olyan szkripteket készítesz. és azok. hogy kötelezővé tehesd ezen mezők megadását. ha speciális segédprogramokat futtatsz.7 ábra A PostgreSQL-táblázatok listája odbc_tables()-el megjelenítve Az odbc_tableprivileges() felsorol minden. lehet hogy használják azokat a lekérdezések optimalizálásához. Ha egy adatbeviteli képernyőt a táblainformációk alapján készítesz el. Az odbc_statistics() statisztikát készít egy tábláról. Akkor használhatod. vagy az értékük automatikusan növelt. amelyek statisztikákat készítenek. és ha hibásan kezeled őket.

"íí r ¥. .

amely lehetővé teszi az adatbázis létrehozását. amely engedélyezi az adatbázis létrehozását abban az esetben. A fájlnév perjeleket (/) tartalmaz. hogy fejezze be a ciklust. amelynek semmi nincs az argumentumában. mert a kód Windows NT-n íródott. hogy a DBM-utasítások szinte teljesen megegyeznek a DBA-parancsokkal. " eat a deal of protein and are eaten by somé humans. 205 . while($key != $search and $key = dba_firstkey($db) If{$key == $search) if(dba_replace($key."). ha a csere nem sikerülne. $db = dba_open("t:/test/db.dbm". $new_value = "Frogs are small.. amely a DBM-utasításokat használja. hogy rákeres egy kulcsra."). $db)) print("<br>Replace worked. ha a csere nem sikerül. de semmilyen más hiba esetén nem ad hibaüzenetet."." . $new_value = "Dogs are small. és a kapcsolódó rekordot egy új értékre cseréli. a Ssearch-re. } dba_close($db). Figyeld meg a while-ciklust. "gdbm"). Ha megnézted az előző Gyors megoldást. míg a Windowsvisszaper jelet igényel. és egy $new_value-változót használ. de más hiba esetén nem ad hibaüzenetet. Van benne egy hibaüzenet. és van benne egy hibaüzenet. "c". Az NT-n a / szimbólum vagy a visszaperjel (\) egyaránt használható.Gyors megoldások Adatbázis elérése DBA-utasításokkal A következő' kód egy egyszerű frissítést végez gdbm-adatbázisban. "gdbm").br>Replace failed. ha az nem létezik." . Az egyetlen követelmény. Az adatbázis megnyitásához a c-paramétert használja. . Egy $search keresési kulcsot. $key = dba_firstkey($db). vagy ha vége a fájlnak: $search = "frog". wet and somé have fat juicy legs" . ha az nem létezne. Svalue. A ciklus a dba_firstkey()-t használva megy végig a kulcsokon. amely a megtalált és lecserélendő rekord új értékét tartalmazza. Annyit csinál. .dbm". Az adatbázis megnyitásához a c-paramétert használja. amit a $new_value tartalmaz. Unix vagy Linux alatt perjelet kell használni. " that are a great source of protein for birds and somé humans. Adatbázis elérése DBM-utasításokkal A következő kód egy mintafnssítés gdbm használatával. else print ("<. ha egyezést talál. azt láthatod. "c". $db = dbbopen("t:/test/db. have wet noses and fást legs. tehát a kód nagyon hasonló: $search = "dog". $key = dbmf irstkey ($db) .

for($c = 0. dbx_close($connection). vagyis bizonyos alkalmazásokhoz nem használhatod. $c++) print("<td>" .6. akkor ellenőrizd az Ingres-támogatást a php.com/products/ingres. $result = dbx_query(Sconnection. és használd a következő utasításokat. hogy inkább PostgreSQL-t válassz."). $result->data[$r][Se] print("</tr>").ini-ben. "xxOOyyy"). print("<tr>") . $key. 206 . print("<table border=\" 3 \ " > " ). Egy egyszerű lekérdezést tartalmaz. $r++) "food"."). amelyek az Ingres-adatbázis vásárlása mellett szóltak. Se < $result->cols.cai. de ma az Ingres egy olyan vállalat (a Computer Associates tulajdonában van). és néhányat nem fejlesztett tovább. for($r = 0. Korábban voltak érvek. print("</table>"). else print("<br>Replace failed. dba_close($db). és megjeleníti az eredmény első mezőjét: Ssql = "select * from frui t". $value)) print("<br>Replace worked. Ingres II elérése Az Ingres Il-ről a www. Az Ingres továbbá kapcsolatonként egy lekérdezésre vagy egy tranzakcióra korlátozott. amely számos adatbázist megvásárolt. fejezet Adatbázisok while($key != $search and $key = dbmfirstkey($db) If($key == Ssearch) if(dbmreplace($db. $sql).htm oldalon olvashatsz. Ha mégis szeretnéd elérni az Ingres-t. $connection = dbx_connect("mysql". "peter". talán éppen egy másik adatbázisba való konverzió érdekében. " " . $r < $result ->rows. Adatbázis elérése DBX-utasításokkal A következő kód egy egyszerű frissítés MySQL-adatbázis használatával. ami még egy ok arra.

Az ingres_fetch_row() siker esetén az eredmény sorait nyeri vissza. vagyis vagy alaposan teszteld ezeket az utasításokat. 207 . Azonban a híresztelések alapján az ingres_num_rows() bezárja a lekérdezés kurzorát. A sorok eredményben történő megmutatásához egyszerűen illeszd be valamelyik kinyerő utasítást egy while()-ciklusba. és egy kapcsolatazonosítót vagy kudarc esetén hamisat ad vissza. amelynek az aktuális kapcsolat az alapértéke. if(ingres_connect("database". mind az ingres_rollback() elfogad egy opcionális kapcsolatazonosító paramétert. kudarc esetén hamis a visszatérési értéke. Az ingres_autocommit() argumentumában egy opcionális kapcsolatazonosító szerepel. hacsak nem használsz több kapcsolatot. Az ingres_query() a lekérdezést automatikusan egy létező tranzakcióhoz adja. mint az ingres_connect(). és elvégzik. az ingres_fetch_array() egy asszociatív tömbként.ini beállításai határozzák meg. nincs megfeleló'je. Az ingres_query() paramétere egy SQL-lekérdezést tartalmazó sztnng és egy opcionális kapcsolatazonosító. } print("</table>"). hogy minden tranzakció automatikusan végrehajtódjék. Az ingres_pconnect() állandó kapcsolatot biztosít. $v "</td>"). vagyis nem kell megadnod a kapcsolatazonosítót. és bekapcsolja az autocommit-ot (vagy kikapcsolja.Gyors megoldások Az ingres_connect() paraméterei az adatbázis neve. de a mysql_error()-utasításnak. vagy egy új tranzakciót indít. mint ahogy azt a következő kód is mutatja. ha az autocommit már be volt kapcsolva). és ugyanazokat a paramétereket igényli. illetve az ingres_autocommit()-utasítással elérheted. vagy visszavonják a függőben lévő frissítéseket. a felhasználói azonosító és a jelszó. A következő példában a ingres_fetch_row()-t használjuk: $sql = "select * from vegetables" . while( l i s t ( $ k . A tranzakciót az ingres_commit(). i f ( ingres_query($sql)) { "username". és siker esetén igaz. vagy kerüld a használatukat. Az ingres_close() bezárja az aktuális kapcsolatot. és a MySQL-hez hasonlóan nem kell meghatároznod a kapcsolat azonosítóját. és eredmények nélkül hagy téged.vagy az ingres_rollback()-panmcsokkal fejezheted be. A sorok és oszlopok számát az eredményben rendre az ingres_num_j*ows() és az ingres_num_fields()-parancsok adják. az ingres_fetch_object() pedig objektumként. amely kudarc esetén egy hibaüzenetet ad. Az ingres_fetch_row() hagyományos tömbként nyer vissza egy sort. "password")) { print{"<table border=\" 3 \ " > " ). mindhárom paraméter alapértékét a php. A kapcsolatazonosító alapértéke minden további Ingres-utasításban a legutoljára használt kapcsolat. Mind az ingres_commit(). $v) = each($row)) print("<td> "} pr int( " </tr >"). Ha nincsenek megadva. while($ro w = i ngre s_fetch _ro w()) { p r i n t ( " < t r > " ) .

SQL-utasítások és adatbázison végzett változtatások mint pl. Ez a megközelítés azt feltételezi. Az első ránézésre nagyjából megegyeznek a megfelelő ODBCparancsokkal .0. vagy bármit. $mícroséconds) = explode(" ". indexek hozzáadása közötti apró eltérések . mivel ezek csupán a teljes idő egy részét képviselik.52291300 I Ezek után az időmérő keretbe kell illeszteni egy adatbázis-utasításokból álló függvényt. Ezek sok ezer oldalletöltés esetén jelentős megtakarításokká adódhatnak össze. de semmit sem fog elárulni az egyes adatbázis-hozzáférések részleteiről.időzítéséről szól. Csak a mező indexét kell megadnod nekik. } Egy lekérdezés eredményében szereplő mezőkről a következő utasítások valamelyikével kaphatsz információkat. ha több kapcsolatot használsz. és megjelenítik az eredményt. hogy módosításokat javasoljanak. hogy nem értem. 2001-05-14 06:38:07. mint ahogy az IBM tette a DB2-vel: ingres_field_name() ingres_field_type() ingres_field_nullable() ingres_field_length() ingres_field_precísion() ingres_field_scale() Időzítések kinyerése: út a teljesítményhez Ez a megoldás különböző parancsok. de jelen pillanatban mindössze a következő kódra van szükséged. substr($microseconds. 1). hogy az SQL-utasítások futását nem adatbázis-segédprogramokkal időzíted. ami egy Unix-formátumú idősztringet ad vissza. a további sorok pedig azt mutatják. $seconds) $display_time = date("Y-m-d H:i:s . vagy pedig hogy az adatbázis-finomhangoló eszközöket arra használod. az 208 .6. hogyan formázd ezt a sztringet megjelenítés céljára valamilyen olvasható dátum/idő formátumba. Mindenekelőtt olvass utána a 2. a Computer Associates miért nem tette ODBC-kompatibihssé az interfészt.52291300 989829487 list($seconds.annyira hasonlítanak. valamint egy opcionális kapcsolatazonosítót is megadhatsz. Az első sor a microtime() használatának legegyszerűbb módját mutatja. ami nagyszerűen használható ugyan a szkriptek finomhangolásának más területein. fejezet Adatbázisok ingres_close(). a második sorban látható a létrehozott sztring. amelyhez hozzáfűz egy néhány (többnyire hat) számjegyből álló mikroszekundum értéket. amit a szerver biztosít a nagy pontosságú időméréshez. mert minden. amely 1-től kezdődik. Mérheted egy oldal válaszidejét egy böngészőben. $microtime). Az utolsó sor az eredményt mutatja: $microtime = microtime () . lehetőleg valamilyen értelmes módon. a függvény feldarabolását kerülve. fejezetben leírt microtimeQ-utasításnak. amelyeket aztán ellenőrizhetsz a szknptedben.

a későbbi feldolgozást pedig a tömbből végzed: if($result) 209 . $event[] = array("description" => "odbc_connect vitamins". Ennek a sornak a hatására a $query_start értéke az állítás további részének az értékével lesz egyenlő. $event[] = array("description" => "odbc_exec " . a kód a visszanyert sorokat későbbi feldolgozás céljára egy tömbbe menti. hogy megadunk még egy időt. majd az időket egy tömbbe teszi. "start" => $micro_start. amelyet a lekérdezés teljes feldolgozásának mérésére használunk. $micro_stop = microtime( ) . Az első Gyors megoldások ODBC-példáiból vettem a kódpéldákat. hogy egy lekérdezés végrehajtását ágyazzuk időmérő keretbe. kezdjük a kapcsolódási kóddal: $micro_start = microtime ( ) . ami a $micro_start-változóhoz rendelt érték: $sql . $sql). $micro„stop = microtime( ) . " " . $event[] = arrayf"description" => "microtime overhead ". és későbbre halasztja az időmérés kezelésének költségeit. $event[] = array("description" => "odbc_connect vitamins". hogyan teszi lehetővé a PHP. ""). ha a kurzor tartalmát azonnal egy tömbbe olvasod. hogy a kód egyszerűen elmenti az időt a memóriába az odbc_connect()-utasítás előtt és után. "end" => $micro_extra). "end" => $micro_ stop). "start" => $micro_start. "end" => $micro_stop) . A kapcsolódáshoz szükséges idő és az időmérés többletideje közötti arány megállapításához még egy időmérést kell hozzáadni. $sql. ami a microtime() többlet időfelhasználását adja meg. $connection["vitamins"] = odbc_connect("vitamins".Gyors megoldások időmérésből fakadó pótlólagos időráfordítás csökkenti az időmérés pontosságát. a $query_start értékét. $connection["vitamins"] = odbc_connect("vitamins". Az egyedüli különbség. hogy egy sorban több változónak megadd ugyanazt az értéket. "start" => $micro_stop. $result = odbc_exec($connection["vitamins"]. akkor csökkentheted a szerver terhelését. a ciklus első lefutásához tartozó kezdeti időt közvetlenül a while()-utasítás előtt kell beállítani."select * from stock". " " . Figyeld meg. $query_start = $micro_start = microtime( ) . $micro_extra = microtime( ) . és az odbc_free_result()-paranccsal felszabadítod a kurzort. Figyeld meg.- A következő példa a sorvisszanyerő kód beágyazását mutatja. Mivel a visszanyerés egy while()-utasításban található. és fűzi hozzá a tömbhöz: $micro_start = microtime( ) . a további lefutások kezdeti idejét pedig majd közvetlenül a while()-ciklus végén kell újra beállítani. ""). $micro_stop = microtime( ) . "end" => $micro_stop). Annak érdekében. hogy minimalizáljuk a többlet időráfordítást a visszanyerés közben. A következő lépés. Ez a módszer minimalizálja az adatbázis eseményméréséből fakadó többlet időfelhasználást. Ha az adatbázisod alaposan fel van töltve adatokkal és sok hosszú nyitott kurzorod van. "start" => $micro_start. mint a következő példa mutatja.

és létrehoz egy könnyen olvasható formázott táblázatot. Figyeld meg. majd felszabadítja a kurzort. 1).enable-bcmath-paraméterrel kell befordítani a PHP-t: print("<table border=\"3\">" . "end" => $micro_stop). "<tr><td><em>description</em></td><td><em>time</em></tdx/tr>" ) . Miután a lekérdezés befejeződött. $start_time = $start_seconds . $micro_stop = microtime( ) . substr($end_microseconds. $start_time. while($row = odbc_fetch_into($result. tehát a következő kód a teljes lekérdezés idejét rögzíti. nem biztos. fejezet Adatbázisok $array = "". o d bc _ f re e _ r es u l t( $ r e su l t) . hogy egy rövid szkript végén akarod manuálisan felszabadítani őket. mivel a PHP egész számokra vonatkozó műveletei nem kezelik a nagy számokat. "end" $micro_start = microtime( ) . ha GMP van telepítve .6. Sevent[] = array("description" => "start" => $micro„start. és rögzíti a kurzort felszabadító utasítás lefutásának idejét.array("description" => "start" => $query_start. list($end_microseconds. $end_seconds) = explode(" ". hogy az egyedüli számítást az időkkel a BCMath bcsub() utasításával végezzük el. $v [ "description" ] . hogy ezt valahol egy hosszú. print ("<trxtd>" . vagy több lekérdezést tartalmazó szkript elején teszed meg: $micro_stop .vagy GMP. "end" -> "whole query: " => $sql. és a más oldalak által mért időket is befolyásolja. "</td>" . $micro_start = microtimef). $micro_start = microtime( ) . $rows[] = $row. A BCMath . $array)) $micro_stop = microtime(). $v["start"]). while(list($k. $time = bcsub($end_time.egyszerűen kezeli a nagy számokat. Sokkal valószínűbb. "odbc_free_result". $start_seconds) = explodef" ". vagy későbbi elemzés céljából kiírhatod egy fájlba a merevlemezre. $v["end"]). a Unix-verziókhoz pedig az . 1). Mivel az erőforrások a szkript feldolgozása után szabadulnak fel. $micro_stop). A következő példakód végiglépked a lementett idők tömbjén. $event[] . 210 . megjelenítheted az időmérés eredményeit. és a lebegőpontos számok műveletei nehezen olvasható jelöléssel adják meg az eredményt. "</tdx/tr>" ) . print("</table>" ). A lekérdezés készen van. substr($start_inicroseconds. $v) = each($event)) { list($start_microseconds. 0. $end_time = $end_seconds . Naplózhatod egy adatbázis elérési időit. $time . 8). de ez lelassítja az adatbázist. A BCMath benne van a PHP Win32 bináris állományában. $event[] = array("description" => "odbc_fetch_into" "start" => $micro_start. $micro_stop).microtime().

hogy fontolóra veheted az adatbázisod áthelyezését egy külön partícióra. Vannak olyan változások. az NTFS és a Reiser naplózza a frissítéseket. ion "descripti íme description ||0. amelyen minden lehetséges adatbázis-módosítást el lehet végezni. a PostgreSQL-t. ábra két teszt mérési eredményeit mutatja.00036100 whole query: select * from stock[Ö. ez vajon a merevlemez-blokkok memóriába való betöltésének eredménye-e (ami arra utal. Az állandó kapcsolat nem mindig lehetséges. és van néhány. hogy lásd. Az odbc_exec()-utasítást szétvághatod az odbc_prepare(). mennyire konzisztensek a visszanyerési idők.Gyors megoldások A 6.00008300 [0.00692000 odbcfreeresult ~" JÖ.00009800 imicrotime overhead jmicrotime overhead odbc exec select * from stock odbcexec select * from stock odbc fetch intő odbc fetch intő pme 0. Ez néhány adatbázist lelassít.00567400 odbc fetch intő odbc free result Í0.000390001 6. mennyire használható az SQL előkészítő funkciója. pl. vagy lelassíthatnak bizonyos típusú frissítéseket. amelyeket nyilvánvalóan figyelembe kell venned. A teljes lekérdezés egy kicsit gyorsabban futott le a második alkalommal. és összehasonlíthatod az adott hálózati kapcsolaton tapasztalt forgalommal.és odbc_execute()-utasításokra.00018700 odbc fetchinto odbc_fetch_into odbc fetch intő ÍÖT00014200 odbc fetch intő ijO. A legtöbb időt egy olyan tesztoldalon spórolhatnád meg. A kapcsolódási idő 5 százalékot változott a két mérés között.8 ábra ODBC-visszakeresési idők A legtöbb időt a kapcsolódás emésztette fel.01920600 odbc connect vitamins odbc connect vitamins ___ [Ö.00012500 odbc fetch intő odbc fetch intő [ÖÖ0021100 [oTöoöiToöo (0T00010200 '(ÖÍÖ0ÖÖ9600 10. egy másik fájlrendszerre. . Ha az adatbázis egy másik szerveren van. milyen gyorsan működik a lekérdezés. tehát érdemes volna összehasonlítani egy állandó kapcsolattal. akkor megvizsgálhatod. amely meglepetést jelent. tehát a hasonló mérések közötti eltéréseket is megfigyelheted. Ebben a példában az időmegtakarítás nem volna számottevő egy sok lekérdezést tartalmazó oldalon.00439200 0.8. az egyes sorok visszanyerése pedig több mmt 100 százalékos eltérést mutat. hogy kiderüljön. Néhány fájlrendszer. mivel maga is elvégzi a naplózást.00027500 odbc fetch intő odbc fetch intő [0. hogy az adatbázisszoftver vagy a fájlrendszer jól használja a memóriát) ? Próbáld meg elvégezni a tesztet egy frissítő lekérdezéssel is.00009600 odbcfetchinto J0. hogy megvizsgáld. mint az XFS. A nagy gyorsítótárat használó és fejlett fájlrendszerek oly mértékben felgyorsíthatják az olvasást.00025500 [Ö700535100 1|aÖ00236ÖÖ fl.00012500 whole query: select* from stock|0. és néhány adatbázisnál nem takarít meg időt. a microtimeQ többlet időráfordítása 18 százalékot változott. hogy egy esetleges összeomlás esetén helyre tudja állítani a változtatásokat. hogy lehetővé tegye a rollback-utasítással a tranzakciók visszavonását.01837900 0. tehát megérné többször lefuttatni a tesztet.

és microtime() oldal: 62 211 . srand().Hivatkozás: rand().

7. fejezet Környezet Gyors megoldások A régi fájlok eltávolítása Külső programok végrehajtása Word-dokumentumok Rtf-formátumba konvertálása COM segítségével HTTP hitelesítés példa Hogyan igazítsuk a kódot a környezethez? Hibanaplózás Menekülő látogatók Szkript időtúllépés Az adatbázis kiválasztása Böngésző-alapú kódok Utasítások ellenőrzése Ellenőrzés a fejlécek elküldése előtt APHP ellenőrzése A memória ellenőrzése Szokatlan formátumok megjelenítése Képek biztonságos megjelenítése oldal: 229 233 236 239 241 241 243 243 244 245 246 246 247 247 248 248 .

amely értelmezi ezeket. feltéve. illetve a gyengébb. egy részüket továbbadja a PHP-nak. hogy a felsorolás pontatlan. akkor az Apache megosztott memóriáját kell használnod. így a felhasználók egy áttekinthető és felhasználóbarát weboldalt kapnak. Az Accept után található a böngésző által fogadott fájlok felsorolása. Az egyszerű. az eredeti fejléceket pedig a getallheaders()-paranccsal lehet beolvasni. hogy telepítve vannak a rendszereden. hogy egy szkript futása közben az egyik modul egy másikkal kommunikáljon. fejezet Környezet Áttekintés Érezted valaha. Ha azt szeretnéd. A szkripten belül a fejlécből származó információk nagy részéhez a környezeti változókon keresztül férhetsz hozzá. Az Apache ezen túl a különleges változók széles választékát kínálja. hogy egy képet elküldhetsz-e Flash-formátumban. amelyek túlmutatnak a weboldalakon. ha speciális például Flash . ugyanakkor egyszerűbb . hogy legszívesebben megragadnád a számítógépedet. Ezért. Apache Az Apache egy nagyszerű webszerver. Ez alapján eldöntheted. Más webszerverek is tartalmaznak hasonló változókat. ASCII és EBCDIC közti konverzióra. a */* operátor azt jelzi. például hordozható eszközökön használt böngészőkre. Saj nos előfordul. holott a böngésző valójában nem képes bármilyen formátum megjelenítésére. hogy egy többszörösen meghívott modul különböző előfordulásai kommunikáljanak egymással. amelynek lehetőségeit szkriptek segítségével még jobban kihasználhatod. hogy felébredjen végre. és azt tegye. Az első fejezetben példákat láthattunk az apache_lookup_uri()-paranccsal történő URI lekérdezésére. megkerülik a webszervert. vagy tekintettel a régebbi. a JPEG formátumot kell használnod.formátumban jeleníted meg a tartalmat. valamint nem PHP alapú oldalak használatára az Apache CGIinterfészén keresztül a virtual()-paranccsal. parancssorból futtatható programokhoz PHP-szkriptből történő meghívással kulturált kezelőfelületet készíthetsz. A fejléc ugyanezen mezője a PHP $HTTP_ACCEPT környezeti változójával érhető el. amit szeretnél? E fejezet olyan eszközöket ad a kezedbe. amit ebben a fejezetben tárgyalunk részletesen. és sebészi pontossággal avatkoznak be a rendszer makacskodó részében. az Apaehe-modulok közti kommunikációra az apache_note{)-parancs segítségével.7. Az Apache nyújtotta különleges lehetőségeket számos módon kiaknázhatod. és tartalmaz egy "'/"'-operátort. ami futtatja a szkrípted. A webszerver által kínált biztonsági megoldásoknál sokkal kifinomultabbak is elérhetővé válnak. Az Apache note-rendszere lehetővé teszi. Mikor egy böngésző lekéri ez egyik oldaladat. hogy a böngésző megpróbál valamit megjeleníteni. egy sor HTTP-fejlécet küld a webszervernek. a számítógép mélyére hatolnak. és jól megráznád. de nem feltétlenül ilyen széles skálán.1 ábra néhány tipikus fejlécet mutat.például I 214 . ezzel is fokozva a PHP-szkript hatékonyságát. A 7. az összes HTTP-fejléc lekérésére a getallheadersQ-paranccsal.

*/* Accept-Charset Accept-Encoding gzip j^ccept-Language jen _______________________ 'Authorizaíion Basic cDV0ZXIfakeZYMAG3 Keep-Alive Connection IJHost [petermoulding. Az Accept-Langauge en azt jelenti.html ÍMozilla/4. ezáltal minden kimenő adatot tömörítve kap az erre alkalmas böngésző. A Gzip-tömörítés az Apache-szerver által is meghívható. mintha egy böngésző lenne. vagyis a PHP gzip-utasítását (lásd 16. ezért jelen esetben nem túlzottan érdekes. azonban ezt kis számú felhasználó esetén rendszerint a webszerver kezeli. Ugyanez a mező a PHP $HTTP_ACCEPT_ENCODING környezeti változójával érhető el. noha ez lehet más program is. Ha minden oldalad PHP alapú. akkor a szkriptjeinkben már nem érdemes másodlagos tömörítést alkalmazni. Accept image/png. hogy megállapítsák. milyen böngészővel látogatják éppen az oldaladat.Áttekintés JPEG . Néhányan arra használják az Agent-mezŐt. Az Authorization-mező a bejelentkezéskor használt biztonsági megoldás típusát jelzi. Header Vaiue |image/gif. U) ~ 7. Ha az Apache úgy lett konfigurálva. a böngészőt úgy állították be.formátum is rendelkezésre áll.1 ábra által visszaadott HTTP-fejrészek getallheaders() Az Accept-Encoding gzip arra utal. mint például cookie-k fogadása. Ez ideális megközelítés abban az esetben. azonban megfeledkeznek arról. ezért megint csak nem kell ismerned az azonosítás típusát. arra az esetre. fejezetben tárgyaljuk. az egyszerűbb formátumra mutató linket. hogy alkalmazza a gzipet. Vedd észre. hogy a felhasználó kiválaszthassa. com Referer User-Agent "Cl http://petermoulding. a böngésző támogat-e bizonyos opciókat.77 [en] (WinNT. A nyelv és egyéb nemzetközi kérdések kezelésére vonatkozó különböző megközelítéseket a 12. melyik verziót kívánja megtekinteni. Amennyiben saját biztonsági megoldás programozására vállal kozol. A nyelv a $HTTP_ACCEPT_LANGUAGE változón keresztül is elérhető. image/pjpeg. akkor a nyelvet kezelheted a PHP-n belül is. ha a weblapod PHP alapú oldalakat is tartalmaz más oldalakkal keverve. Az Apache konfigurálásakor be lehet állítani. amely úgy viselkedik. hogy angol nyelvű oldalakat kérjen le. programod valószínűleg szintén a webszervertől kapja a felhasználói azonosítót és a jelszót. illetve az alapértelmezésben angol nyelvű oldalakat fogad. például egy kereső motor. akkor célszerű az összetettebb tartalom mellé be tenni egy. hogy a szerver a nyelvtől függően különböző oldalakat küldjön. hogy módosítottam a hitelesítő sztringet. image/jpeg. hogy a böngésző tömörített fájlokat is fogad. ezáltal csökkentve az átviteli időt. ha egy hacker megpróbálná feltörni az oldalt. A User-Agent-mezŐ vagy a $HTTP_USER_AGENT-változó értékéből megtudhatod. hogy számos böngészőben ezeket a 215 . image/x-xbitmap. fejezet) használva betömörítheted a fájlokat és a weblapokat.coni/phpblackbook/enviroranental/index.

Mások zárolhatóak. A megjelenített adatok egy része hasznos a hackerek számára. és összegyűjti a Microsofttal kapcsolatban megjelent legújabb híreket. amely tartalmazza a <?php phpinfo()?>-kódot. ezért ne tedd nyilvánossá ezt a képernyőt. hogyan működik mindez. de néha előfordul.T iso-8859-1. olvasásra optimalizált szerverről közvetít. ezeket nem lehet szkriptből felülírni. A 7.SERVER.VARSfHTTP. Ha létrehozol egy weblapot. ahogy az alábbi példa mutatja: dl("php_mssql.utf-8 HTTP_SERVER_VARSrHTTP_ACCEPT_ENCODING"] gzip HTTP_SERVER_VARS["HTTP_ACCEPT_LANGUAGE"] en 7. az oldalnak átadott környezeti változót.htrn! 12974 Value 1064996159 C \WINNTteystem32\cmd exe i:/he!pnet/web/root image/gif. így jobban gazdálkodhatsz a szerver erőforrásaival. amely minden hírt egy gyors. A phpinfo()-utasítás közvetlenül a képernyőre ír. Miért tartanád a php_mssql. image/png.2 ábra A phpinfoQ által visszaadott képernyő része 216 . image/x-xbitmap. image/pjpeg. hogy nem mindegyikről. PHPVariables Variable PHP_SELF HTTP_GET_VARS['V] HTTP_COOKIE_VARSfcookie"] HTTP_SERVER_VARS["COMSPEC"] HTTP_$ERVER_VARSrOOCUMENT_ROOT"] HTTP. akkor egy böngészővel meg is nézheted. így bár egyes oldalakról módosíthatóak. A phpinfo()-utasítás megjeleníti az összes PHP-vel és Apache-csal kapcsolatos információt: verziószámokat.*.ini-ben lehet beállítani. Bizonyos dolgokat csak a php. konfigurációs beállításokat és az összes.2 ábrán láthatunk egy példát. azért nincs értelme mutatós képernyő-elrendezést készítened. A következő részben néhány szkriptből módosítható beállítást ismertetünk. Tegyük fel.dll-modult egész nap betöltve./. hogy bizonyos speciális feladatokat ellátó szkriptek számára módosítanod kell ezeket a beállításokat.ACCEPT11] HTTP_SERVER_VARS["HTTP_ACCEPT_CHARSET"] /admin/phpinfo. ezáltal az Agent-mező szinte teljességgel használhatatlan erre a célra.dll"). hogy írsz egy új szkriptet. image/jpeg. fejezet Környezet beállításokat a felhasználók módosíthatják. Képzelj el egy híreket szolgáltató szervert. A PHP konfigurálása A PHP a php. amely naponta egyszer kapcsolódik egy Microsoft SQL-szerverhez.ini-fájlon keresztül konfigurálható. Kiterjesztések Egyes kiterjesztéseket szkriptből is betölthetsz. ha naponta csak egy percig használod? A dl()-utasítás révén egy modult a szkriptből is betölthetsz. lehet.

hacsak nem állítod az időkorlátot 0-ra.ini bármely paramétere szerepelhet. azaz nem kapsz 60 másodperces korlátot. és visszaállítja a php. majd ahogyan a következőkben látható.miben eredetileg szereplő értéket. a változás csak az adott szkriptre vonatkozik. megjeleníti a változást.ini-ben a hibák naplózása az alapbeállítástól eltérően volt kapcsolva. Ssetting). print("<br>" . amikor a kódban végrehajtódik az ezt beállító sor. tehát ha a szkript ezt megelőzően már 5 másodperce futott. ezt módosíthatod. vagy azt. hogy a szkriptek tetszőlegesen hosszú ideig fussanak.A php. Az időkorlátok nem kumulatívak.ini egy beállítását. Az ini_get()-utasítás argumentumában a php. hogy az adott opció be van kapcsolva. Minden bizonnyal nem akarod. Ssetting). Az időkorlátot onnantól kell számítani. és eredményül a paraméter éppen aktuális érékét adja. 0 ) . Az alábbi példában látható. akkor összesen 25 másodpercig futhat. ini_set("log_errors ". ahol a php. ha három egymás után következő sorban 20 másodperces korlátot állítasz be. ini_restore("log_errors"). ami lehetővé teszi.ini beállításai Az ini_get()-utasítással beolvashatod a php. végül visszaállíthatod a php. tehát régebbi kódokban esetleg találkozhatunk az ini_alter()-utasítással is. print("<br>" . Ssetting = ini_get{"log_errors") . Az ini_alter() az ini_set() egy alternatív neve. A példa kikapcsolja a hibák naplózását. ezért érdemes körültekintően eljárni ezzel a beállítással. mégpedig a változtatás elvégzésének pillanatától kezdve. hogy az éppen egy ciklusban lévő szknptjeid a végtelenségig fussanak. Ssetting = ini_get("log_errors") . A következő példában a 0 a hamisat jelenti. Az ini_restore() argumentumában szintén a paraméter neve szerepel. és értékes CPU-időt fogyasszanak. ahol a set_time_limit{)utasítással 20 másodperces korlátot határozunk meg: set_time_limit(20) . Ssetting). Ha megváltoztatsz egy beállítást. A következő eredményt kaptuk: 1 0 1 Időkorlát Szknptjeid futása egy bizonyos idő után megszakad. az 1 az igazat. print("<br>" . 217 .ini eredeti beállításait. Az ini_set()-utasítás argumentumában a paraméter neve és a paraméter új értéke szerepel. A kód egy olyan szerveren volt lefuttatva. hogyan kell beállítani az időkorlátot. majd visszakapcsolja a hibák naplózását és ismét megjeleníti az eredményt: Ssetting = ini_get("log_errors") .

így megállapíthatjuk. amely létrehoz egy lassú hálózati kapcsolatot. Tehát az 1. ha a ciklus előtt beállítunk egy 100 másodperces tesztkorlátot. a hálózat és a beérkező HTTP-fej lécek. hogy a PHP csak a kezdeti tesztelés céljára fusson CGIként. soha ne állítsd be az időkorlátot egy cikluson belül. Képzelj el egy szkriptet. majd áttérünk egy Apache-modulra. Jobban járunk. hogyan lehet a fájljaidtól távoltartani a besurranókat. nem pedig CGI-ként. és a cikluson belül számoljuk a letöltött adatelemeket. hogy egy utálatos kis 14 éves kölyök betörjön a rendszeredbe és beleirkáljon a fájljaidba. akik a PHP-t CGI-ként használják. fejezet Környezet Ahhoz. Mire való akkor a putenv()-utasítás? Mikor egy külső programot hívsz meg az execQ. Mindannak. HTTP-hitelesítés A HTTP-hitelesítés akkor érhető el. ami a getenv()-utasítás révén elérhető. és a hálózati kapcsolat 9 másodpercet vesz igénybe. hogy egy adminisztrációs könyvtárat elzárjunk a jogosulatlan felhasználók elől. a következő szkript számára pedig minden visszaállításra kerül.7. Biztonság A munkád minden bizonnyal nagy fontosságú és értékes adataid vannak. hogy elérjük. de ez semmilyen célt nem szolgál az éppen aktuális szkript számára. a putenvQ-utasítással pedig értéket adhatunk a változóknak.és . meddig jutott a folyamat. a szkript 9000 másodpercig. valamint 1000 különböző' adatot akarunk letöltetni. a csalókat és a nyíltan támadó kétbalkezeseket. köztük a getenvQ-utasítás segítségével.im-ben a track_vars-paraméter be van állítva: $q = getenv("QUERY_STRING"). nagy része előre definiált változóként is hozzáférhető. A környezeti változókat a putenvQ-utasítással is megadhatod. így ezeket a változókat egy meghatározott értékkel adhatod át a külső programoknak. hogy elkerüld a végtelen ciklust. Az alábbiakban megtudhatod. A következő példában a getenv()-utasítással kapjuk meg az URL lekérdező sztring értékét. Ezért nem szeretnénk. hogy újabb adatokat szerezzen. csak az Apache . Az Apache biztonsági eszközeit megtarthatjuk arra a célra.vagy a systemQ-utasításokkal. ezek a programok olvashatják a környezeti változókat. ha a php. Környezeti változók A PHP környezeti változók értékeinek számos forrása van: a PHP. bizonyos műveleteket végez a letöltött adatokon. Feltéve. az Apache. azaz 2. mielőtt megszakadt volna. majd visszatér a ciklus elejére.htpasswd-fájljait használhatják biztonsági célokra. A változókat több különböző módon elérhetjük.htaccess.5 óráig futna. és a felhasználók egyéni bejelentkezését kezelhetjük PHP HTTP hitelesítésével. hogy a haladóbb lehetőségeket is kihasználhassuk kereskedelmi célú weboldalainkon. 218 . Azok. ha a PHP-t Apache-modulként futtatod. fejezetben említett támadási terv azzal kezdődik. hogy egy 10 másodperces korlátot állítunk be a cikluson belül.

miért kényszerítenéd magad egy speciális nyelv felidézésére. Az eredmény a 7. amelynek hatására a böngészőben előugrik egy felhasználói nevet és jelszót kérő ablak.php 219 . valamint meghatározd egy fájl tulajdonosát. hogy a parancs a PHP CGI-ként futtatható részére mutasson. fejezetben részletesen ismertetett chmodQ-.php Ezt a PHP bármely telepítésére alkalmazhatod. Az utasítások Windows vagy NT alatt nem. de miért korlátoznád hozzáértésed és tudásod weboldalakra? Sőt. A Win32-es telepítő alapbeállításként mind a modul-. Más operációs rendszerek alatt egy külső program láthatja el a biztonsági feladatokat. és a PHP-t mindenre használhatod? A következő néhány trükk révén a PHP-t nemcsak böngészőből hasznosíthatod. A header()-utasítás egy tartományt (reatm) igényel. majd egy 40l-es fejlécet küld el. Ez azt jelenti. amely megváltoztathatja az adott fájl hozzáférési jogait. A felhasználói név a $PHP_AUTH_USER-. a hitelesítéshez kapcsolt név.org/Protocols/rfc2616/rfc2616. A 7. PHP kötegelt módban A weboldalak nem lebecsülendők. amelyek a sajátjai. chgrpQ. csak Unix alatt működnek. saját könyvtárral és kizárólagos hozzáféréssel. A hitelesítés a header()-utasítással kezdődik. a telepítési útmutatások alapján fordíthatod le CGI-ként. Ha a PHP-d csak egy modulként van lefordítva. a jelszó pedig a $PHP_AUTH_PW-változóba kerül. hogy különböző oldalakon különböző bejelentkezéseket használhatsz. amely egy. amely egy "Authentication Required" (Hitelesítés Szükséges).Áttekintés Megjegyzés: Ha további információt szeretnél a HTTP-ről és a fejlécekről. tehát nincs szükség fordításra. mindössze arra van szükség. hanem egy parancssor-konzolból is. és egy PHP-oldal lefutását eredményezi. CHMOD A 8. mind a CGI-verziót tartalmazza.w3. vagy ahol a PHP egy olyan csoport tagja.3 ábrán látható. ha mindössze batch-programokat szeretnél írni. olvasd el az alábbi dokumentumot: www.és chown()-utasítások lehetővé teszik. Az alábbi kód Windows NT parancssor-konzoljából futtatható. hogy egyéni és csoportos jogosultságokat biztosíts. vagy a felhasználói adatokat egy adatbázisban tárolva az adatbázis biztonsági megoldásaira hagyatkozva szabályozhatod a hozzáféréseket. A PHP azokhoz a fájlokhoz módosíthatja a jogosultságokat. ahol beállíthatsz új felhasználót. ha egy -q-operátort adunk a parancshoz.3 ábrán látható fejléc első három sora elhagyható. mint a következő sor mutatja: " c : /program files/php/php" -q i:/petermoulding/web/root/test/test. A hitelesítés során a tartomány is megjelenik a bejelentkező képernyőn. "c:/program files/php/php" i:/petermoulding/web/root/test/test.

továbbá az outputokat szintén irányítsd fájlokba. Apache-hez kapcsolódó kódot is. és ezeket könnyen olvashatóvá kell tenned.7. amelyeket egy weboldalról lehet frissíteni. így a naplóállományokat és az eredményeket kényelmesen megnézheted otthonról egy 220 I .cwru.html). A readline()-parancshoz egy sor kiegészítő parancs tartozik. hogy óránként egyszer. csak az új fájlokat veszi fel az A-ba.vagy más ütemező program segítségével beállíthatod. Hogyan lehet adatokat felhasználni a parancsban? Mindent fájlokban adok meg. ahol a kód egy általában az Apache által létrehozott környezeti változót próbál felhasználni. Azt javaslom. Ahhoz. hogy mindent MySQL-táblákban tárolj az 5. readline_list_history(). readline_completion_function().cns. Ezeknek a parancsoknak az ismertetése megtalálható a PHP dokumentációjában. akkor készíthetsz egy A könyvtárat a fájlok fogdására valamint egy B háttérkönyvtárat és a cron. így azok nem vesznek el a parancssorablakban. akkor ütemezheted a feladatot. mondjuk fájlok egy csoportját. fejezetben bemutatott módon. readline_clear_history().0.edu/~chet/readline/rltop. hogy megfelelő időközönként lefusson a feladat. vagyis elhagyhatjuk az összes. így nem kell begépelni a parancssorba. A program az eredeti fájlokat az A könyvtárban találja.5 tlindow-target: _top Content-type: text/htnl <br> <b>Warning</b>: Undefined uariable: HTTP HŐST 7. próbálkozz a readline()-paranccsal. egész éjszaka vagy tetszőleges időben kerüljön végrehajtásra. míg a feldolgozott fájlokat a B könyvtárban tárolja. helyezd az összes input információt fájlokba. mint pl.3 ábra PHP-oldal parancssorból futtatva A parancsként futtatható oldalakból az összes HTML-t érdemes elhagyni. Mikor a feladat lefut. Ha egy olyan feladatot akarsz futtatni. rögzítened kell a dátumokat. hogy az adatok hányszor kerültek beolvasásra. fejezet Környezet ^Command Prompt X-Powered-By: PHP/4. A PHP-lap futtatás eredményének utolsó sori egy hibát mutat. readline_read_history() és readline_write_history(). readline_info(). továbbá azt. ami letölthető a PHP-val. és amelyeket a parancs a szokásos fájlműveletekkel olvas. Ha nem szeretnéd hajnali háromkor végignézni a feladat lefutását. A PHP ütemezése Ha egy PHP-oldalad már parancssorból futtatható. a \n. amely a GNU readline-projekt-jétől függ (cnswww. amely bemeneti adatokat gyűjt. egyedüli hasznos formázás az újsor-(newline-) karakter. tehát tetszőlegesen gyakran futtathatod a feladatot.: readline_add_history(). hogy minden futásról használható és pontos feljegyzésekkel rendelkezz. és még egy halom információt. Ha Unixot használsz.

Ehhez azonban teljes és naprakész dokumentációra lesz szükséged a célalkalmazás objektumainak eljárásairól és tulajdonságairól. és az ODBC mellett egy másik divatos technológia. ezeknek a kedvenc programoknak és az általuk előállított dokumentumoknak a 90 százaléka szintén Windows alapú. akkor látod a képernyőn az előugró hibaüzeneteket. mint az ODBC. ha régebbi COM alapú alkalmazásokkal dolgozol: sok alkalmazás készítői nem gondoltak arra. hogy e három alkalmazás esetében ez egy egyszerű. hogy mit tehetsz meg az alkalmazásban közvetlenül a billentyűzettel. 221 . és egyes programokat mindenki gyakrabban használ. mert szeretne megjeleníteni egy előugró hibaüzenet ablakot. Azonban más alkalmazásokhoz nehézséget okozhat megbízható és friss dokumentáció beszerzése és azoknak az apró különbségeknek a kifürkészése. A COM mint interfész a Microsoft régebbi Dynamic Data Exchange-jének (DDE) utódja. és mi engedélyezett egy COM-interfészen keresztül. majd RTF-formátumban elmentjük. hogy tetszőleges célra felhasználd a programok e 90 százalékát és a hozzájuk kapcsolódó adatokat. hogy bárki reagálna a hibaüzeneteire) Ha Windowsban programozod ezeket az alkalmazásokat COM-technológiát használva. Ha igazi szabadságra vágysz. ElM í weblapon keresztül.Áttekintés 1 II. fejezetben tárgyaljuk. platformfüggetlen for mátumba történő konvertálását. mint pl. először DDE-. Mikor ezek az alkalmazások egy Windows NT-webszerver szolgáltatásaként futnak. az OLE (object linking and embedding) és az ActiveX. A COM lehetővé teszi. de ezt nem teheti meg. Régebben dolgoztam Microsoft Access-szel. és ennek alapján hasonló COM alapú alkalmazásokat készíthetsz. vagy pedig végtelen türelmet igénylő tesztelésre. a „Word dokumentumok RTF-formátumba konvertálása COM segítségével" címen egy egyszerű példát találsz a COM alkalmazására. hogy a program valaha szerver módban fog futni (magára hagyva. A Microsoft számos COM-variációt kidolgozott. ami a COM-fejlesztéseket elég zavarossá teszi a tiszta. majd COM-technológiával. nem tudják hová küldeni a hibaüzeneteiket. vagyis hajnali háromkor kellemes társaságban kávét kortyolgatva egy menő Internetkávézóból átkonfigurálhatod a feladatot. könnyen használható megközelítés. a lefutást befolyásoló paraméterek beállítását megoldhatod egy biztonságos weblapon keresztül.) Az Gyors megoldások közt. Könnyen úgy járhatsz. mint másokat. hogy az alkalmazás érthetetlen módon leáll. (Az ODBC az adatbázisoknál használatos és a 6. és ennek alapján kijavíthatod a COM-kódot. Érdemes úgy megírni a programot. anélkül. így otthonról is beavatkozhatsz és kijavíthatod a hibát. hogy a Unix-felhasználók számára is hozzáférhetővé váljon. Egy dologra kell odafigyelni. Excellel és Worddel. mindhármat más programokból vezérelve. átlátható ODBC-vel szemben. de nem olyan tiszta. A fejezetben található példában Worddel megnyitunk egy Microsoft Word-dokumentumot. Ezért van szükséged a Microsoft Component Object Model (COM) technológiájára. hogy hiba esetén e-mailben értesítsen. és úgy találtam. beleértve az adatok zárt. COM Mindenkinek vannak kedvenc programjai (én imádom az Excelt). saját tulajdonú formátumból nyitott. Mivel az emberek 90 százaléka Windows alapú számítógépeken dolgozik.

ezért kérlek. és ha a fájlnevek számodra mély és egyedi értelemmel bírnak. de néhány operációs rendszer még mindig nem fogja megtalálni a fájlt. amelyeket ők és a komputereik is tudnak értelmezni. Az a probléma. "s20010106". vagy kérj pénzvisszafizetéses próbaidőt. hogy a PHP hasonló fájlnevet produkáljon a mai dátummal. de nem biztos. mint pl. ám még nem használtam BeOS-t és néhány hordozható eszközt. Ha azt szeretnéd. hogy olyan jó számítógépekkel rendelkeznek.és nagybetűket vegyesen tartalmazó neveket. Az "sO 1062002" vagy valami hasonló könnyen begépelhető nevet használsz nyilván. ti Linux és Unix A Unix-szal az a legnagyobb gond. A problémák a saját konfigurációs beállításainkból és a saját kódjainkból származhatnak. a fejlesztők imádják a kis. fejezetet: $file_name = " s ' date("Ymd" Hagyd ki a szóközöket. -jét jelent. Amennyiben egy drága upgrade-et ajánlanak neked. és minden platform fel tudja dolgozni őket. -ával végződő hetére". mivel az ÉÉÉÉHHNN-formátumot mindenki felismeri. akkor próbálkozz az alábbi kóddal. tehát ha dátumokkal dolgozol. ha áttérsz egy újabb verzióra. mint te. hogy beküldesz egy kárigényt tartalmazó fájlt a következő névvel: „Kárigény bejelentés 2002.és nagybetűket és nincsenek megfelelő eszközei a kis. és ne használj aláhúzást helyettesítésre. bizonyos helyzetekben az aláhúzás elvész. lapozd fel a 2. A fájlokat sokkal könnyebb átnevezni a végső felhasználás előtt. és azt küldöd el a felhasználónak. válassz egyértelmű formátumot.és fájlnevek Az emberek szeretnének hozzáférni a fájljaidhoz.) karakterek biztonságosak minden általam használt operációs rendszerben. A Microsoft 120 napos próbaidővel forgalmazza a legújabb Office-termékeit. hogy egy másik gépen bemutatott demonstráció eredményei nem reprodukálhatóak a saját rendszerünkön. június 1. A Kárigénybejelentés könnyen olvasható. ha valaki kárigénybejelentés-re keres. és ha többet szeretnél tudni a dátumokról. hogy képtelen felismerni a kis. de könnyen lehetnek félreérthetó'en rejtélyesek.és nagybetűk megkülönböztetése nélküli fájlkeresésre.Ékezet nélkül!) elnevezésnél. segítsd az egyszerű földi halandókat. és használj olyan neveket. amely nem tartalmaz olyan karaktereket. és ez bőven elegendő idő a COM-technológiából fakadó problémák számbavételére. például. amelyek összezavarják az operációs rendszereket. tehát maradjunk a nemzetközileg is biztonságos kárigénybejelentés (karigenybejelentes '. január 6. fejezet Környezet Bizonyos esetekben a megoldás a dokumentáció mélyreható vizsgálata és az alapos tesztelés. és in222 . hogyan fut a szoftver újabb kiadása a COMtechnológiával. kérd annak a bemutatását. A rövid nevek könnyen kezelhetők. ha valaki egy linkről vagy aláhúzással kiemelt fejlécről másolja le a fájlnevet. Úgy tűnik. a korábbi konfigurációt használva. és senki nem használ ÉÉÉÉNNHH-ot. Könyvtár.7. ezért könnyen lehet. Képzeld el. A kötőjel (-) és pont (. hogy "s01062002" a világ jelentős részén 2002. Noha a Kárigény bejelentésből adódik a Kárigényjbejelentés. amit átnevezel. készíthetsz róluk egy másolatot. Más esetekben jobban jársz.

mint az operációs rendszerek közötti kapcsolatok ODBC-je (ha még nem használtál ODBC-t. jogosultsá- I! 223 . Szerencsére az Apple a régi Macintosh OS-t felváltotta a Unix-szal. és a posíx_getuid() -utasítással megkapod a folyamatod által használt valódi felhasználói azonosító numerikus azonosítóját. Macintosh A régi Macintosh operációs rendszer olyan fájlneveket is elfogadott. a neve vagy a titkosított jelszava. Bízom benne. ezért maradjunk meg a kisbetűknél és a számoknál. A posix_getpwuid()-parancs argumentumában a numerikus felhasználói azonosító szerepel. a posix_kill()-utasítással pl. Én azt tanácsolom. mint pl. POSIX A Portable Operating System Interface (POSIX) a legmegbízhatóbb megoldást kínálja a különböző platformokon futtatott alkalmazások és különböző operációs rendszerek közötti kommunikációra. és erre tette rá a Macintosh grafikus felhasználói felületet. a fő Apache-folyamatot ez nem zavarja. A POSIX úgy is felfogható. mint ha operációsrendszer-specifikus parancsokat használnánk. ezzel beavatkozhatsz egy folyamat életébe. Minden Unix alatt futó program egy folyamat és az Apache alatt minden weblaphoz tarto zó folyamatnak van egy szülő folyamata. Az elvetemültebbek használhatják a posix_getppid()-parancsot. mindenütt ragaszkodjunk a kisbetűkhöz. Mikor valaki bejelentkezik. lásd a 6. a posix_geteuid()-utasítás az effektív felhasználói azonosítóhoz tartozó numerikus azonosítót adja meg. és a posix_setuid() az effektív azonosítót állítja be. és semmilyen jogosultsággal nem rendelkezik. megölhetsz egy folyamatot. Az Apache alatt a PHP rendszerint nobody felhasználói azonosítóval fut. amely megszerzi a szülő folyamat azonosítóját és azonnal megöli.Áttekintés konzisztensek a saját fájljaikon belül. ami más platformok számára értelmezhetetlen karaktereket tartalmazott. A fájlok mindkét néven elérhetőek. egy belsőt és egy másikat megjelenítés céljára. amely a felhasználóval kapcsolatos információkat tartalmazza. fejezetet). A folyamatokhoz hozzárendelhetsz egy effektív felhasználói azonosítót. mint pl. és egy tömböt ad eredményül. hogy sikerül minden fájlt és hordozható médiát. sajnos nem fogad el bármit válaszképpen. Windows NT A Windows NT-platformon bármit begépelhetünk egy fájlnévbe. mivel az két nevet használ. Noha nem minden operációs rendszer támogatja a POSIX-et vagy nem mindegyik rendelkezik a POSIX funkciói által igényelt eszközökkel. például a PHP külső program interfészén keresztül. Noha az NT bármit bárhonnan elfogad. Az Apple a tetszetős Unix-ot OS X-nek nevezte el. A biztonságot a felhasználói azonosítók és csoportok ellenőrzik. szakadatlanul új folyamatokat indít az új weblapok számára. Ha egy szoftver elszáll és megöli a folyamatunkat. Zip-lemezt Unix-formátumra megformázni. mégis ezek a funkciók nagyobb eséllyel működnek együtt egy új operációs rendszerrel. A posix_getpid()-utasítással hozzáférhetsz egy folyamat azonosítójához.

ha szeretnéd közölni minden weboldalaidon futó programmal az andorrai frank . valójában bármely fájl bármely frissítése minden fájl minden hozzáférését lassítja. A MySQL jó olvasási hozzáférési 224 . és ekkor használhatóvá válnak ezek az utasítások. A PostgreSQL-fejlesztők a Cygwint használják arra. a posix_getrlimit() pedig a rendszer számára rendelkezésre álló erőforrások felsorolását adja. hogy PHP-ből futtassuk a fájlt. A PHP szolgálhat felhasználói felületként! Gondoljunk bele a lehetőségbe! Vegyünk egy Unix alapú programot. PHP-t és Apache-ot használva működési környezetként. és ha szinkronizálni kell a frissítést.com/cygwin). ami valami különlegeset tud. és ha minden alkalmazás ugyanazt a fájlt szeretné olvasni. hogy Windows NT-n felállítsanak és karban tartsanak egy PostgreSQL-szervert.posix. akkor használhatsz szemaforokat.20 verziója előre felinstallált Cygwin-interfészt foglal magában. Az Apache Windows-os 1. A fájlrendszerek akkor lassulnak le. A programok kommunikációjának elősegítése Mit teszel. Azonban számos terméknek problémát jelenthet a Windows-interfész és számos Windows-felhasználónak a Cygwin/Unix-interfész. Ezért ha az oldalunkon sok fájl gyakran frissül. mennyire használható ez a kombináció. A posix_getgid().és posix_getegid()-függvények egy folyamat csoportját adják meg. A Cygwin használatával elvileg számtalan Unix-kódot vihetsz át Windows NT-re. a posix_uname() a rendszer nevét.3.malawi kwacha keresztárfolyamot? Egy fájlt használnál. Az erőforrások területén a posix_times() az eddig elhasznált időt. fejezet Környezet gokat kap az Apache biztonsági rendszerétől. és a PHP külső fájlokat kezelő funkciói lehetővé teszik. és nem minden adatbázis képes cache-ben tárolni a gyakran lekért információt. akkor az operációs rendszer eltárolja a memóriában. Az árfolyam-adatbázis jól hangzik. a posix_setgid() a csoport azonosítóját állítja be. a posix_getgroups() pedig az aktuális fo lyamathoz hozzárendelt csoportokat sorolja fel.redhat. és alig várom hogy teszteljem és kiderítsem. adatbázist vagy valami gyorsabbat? A megosztott memória a leggyorsabb megoldás. ha a fájl frissítésére kerül sor. hogy lefordítsuk a programot Windows alá.php. A posix_getlogin() a felhasználó login nevét adja meg és a posix_getpwnam() a név alapján szolgáltat információkat egy felhasználóról. A PostgreSQL a Cygwin segítségével ülteti át a Unixos kódját Windows NT-re. azért nem kell a Unix teljes grafikus kezelői felületét átpakolni Windows-ra.php címen található meg. Ha Windows NT-t használsz és szeretnéd kiterjeszteni a POSIX-szal való együttműködési készségét. ahonnan a hozzáférés gyakorlatilag azonnali. akkor nem a legjobb választás egy fájlban eltárolni az árfolyamot. cseréljük le a felhasználói felületet PHP-ra és HTML-formokra és adjuk közre a programot Windows-on. akkor a RedHatnek van egy Cygwin nevű terméke számodra (http://sources. de az adatbázisok időigényesek. A kis fájlokhoz való hozzáférés rendszerint gyors. Néhány további POSIX utasítás leírása a www.7. A Cygwin lehetővé teszi.net/manual/en/ref.

és megjelöli a szegmenst mint törölhető memóriát. A méret 0. egy nullától számított kezdőértékre. akkor meg kell nyitnod. ha minden felhasználó lezárta a hozzáférését. frissítené és törölné a megosztottmemória-szegmenst. az összes többi felhasználó olvasná. Az árfolyam példájánál maradva. Mit tehetsz egy megnyitott szegmenssel? Megvizsgálhatod a méretét a shmop_síze()-utasítással. hogy nem csak frissíthetik az adatokat. A shmop_close() argumentumában a shmop_open() által eredményül adott megosztott memóriaszegmens-azonosító szerepel és lezárja de nem törli a szegmenst. így ez lehet véletlenszerűen generált. Az shmop_open()-utasítás argumentumában egy kulcs. egy felhasználó hozná létre. ha létrehozzuk.072 bájt közt van. míg visszatérési értéke a megosztott memóriaszegmens azonosítója. A megosztott memória a Unix-rendszerek V-jéből származik. írhatsz bele a shmop_write()-tal és olvashatsz belőle a shmop_read()-del. és 0. majd bezárnod. mikor korábban létrehozott memóriához szeretnél hozzáférni. mint egy fájlazonosító. amikor létre akarod hozni a megosztott memóriát. és az olvasásra kerülő tartomány hosszára (0 mindent elolvas és a 225 . és a. egy hozzáférés/létrehozás indikátor. Ha végül szeretnéd törölni a szegmenst. hogy a szkripted nem fogja érteni. A hozzáférés módja leggyakrabban 0755 vagy valami hasonló. hogyan skálázzunk Mount Everest-nyi számítást anélkül. Perl. és valahol 1 és 131. és a shmop_delete()-parancsot kell kiadnod. Maga a törlés akkor kerül végrehajtásra. A hozzáférés/létrehozás indikátor értéke c. A hozzáférés kulcsa egy 8 bájt méretű egész szám. ami pont olyan. A szegmenst csak a tulajdonosa vagy egy root jogokkal rendelkező felhasználó tudja kitörölni. vagy valaki nem zárná le a hozzáférését.0. hogy megcsúsznánk a jégen. úgy. A shmop_delete() argumentumában a szegmens azonosítója szerepel. A shmop_read()-utasításnak a szegmens azonosítójára van szüksége.és más programok számára is elérhető. mikor létrehozzuk. Az alábbiakban röviden körvonalazzuk. hogy bármely szkripted tudja olvasni és módosítani az adatokat. A PHP 4. akkor még mindig sok CPU-időt pazarolunk el.5-ös verzió óta pedig az shmop_ -előtag. vagy a megosztott memória valamely más területén tárolt kulcsszámláló eggyel megnövelt értéke. a megbízhatósági problémák (rehabihty problems) és a bővítéskorlátozások (expansion limitations) mellett. Ettől a ponttól kezdve semmilyen más folyamat nem tudja megnyitni a szegmenst. mint chmod használata esetén) és egy méret szerepel. A szegmens örökké a memóriában maradna. de véletlenszerűen át is strukturálhatják oly módon. tehát alaposan tesztelt. ezen túl rendkívül jól mutat a szakterületek felsorolásában az önéletrajzban az egyenlő részek biztonsági rései (equal parts secunty holes).idővel és különleges adattáblákkal rendelkezik. A megosztott memória C-. mikor hozzáfé rünk a megosztott memóriához. egy oktális hozzáférési mód (ugyanaz. Megosztott memória A megosztott memória növeli a rendszer teljesítményét és alkalmazkodóképességét. mikor használjuk a már létrehozott memóriát.0. a 4. de a megosztott memóriához való korlátlan hozzáférés azt jelenti. de ha nem használjuk ki maximálisan az adatbázis lehetőségeit. ha nem törölnénk ki.3 feletti verzióiban a megosztottmemória-utasításokat az shp_ -tag előzte meg.

melyik a megfelelő és megbízható. A „Külső programok futtatása" című Gyors megoldásokban megtalálható passthru(). ezt a következő bekezdésben tárgyaljuk. A következő rövid részben néhány egyszerű lépést végigkövetve temérdek új paranccsal ismerkedhetünk meg. Az escapeshellarg()-parancs az argumentumában szereplő sztring köré félidézőjelet tesz. A sem_get() argumentumában először meghatározhatod a kulcsot. míg a létező folyamatok elengedik a szemafoft. megvédhetők a kitörléstől és a felülírástól. Külső programok És most felnyitjuk Pandora szelencéjét. amit a parancssorba gépelünk be -. ezért körültekintően kell megtervezni és használni a memóriában található adattáblákat. amely a szegmens azonosítóján alapul.shmop_size()-zal megtudhatjuk a méretét. Mint a következőkben látható. Ha a megszokott visszatérési státust szeretnéd. Szemaforok A szemaforok révén ellenőrizhetjük a megosztott memória szegmenseinek frissítését. amely hozzáfér megfelelő szegmenshez).és system()-parancsok az exec() alternatív nevei. ez lehetővé teszi az exec()-hez hasonló utasításokban a paraméterként használt sztnng formázását. és arra nézve is útmutatást kapunk.igen hasonló ahhoz. mint pl. hogy hozzáférjenek a szemaforhoz. vagy esetleg mindenkit bámulatba ejtsünk tökéletes programozói tudásunkkal. A többszörös frissítés védelmét a szemaforok biztosítják. a szegmensek száma és az egy folyamat által megnyi tott szegmensek száma korlátozott. a beírandó sztringet. akkor harmadik paraméterként meg kell adnod még egy változót. a sem_get()-utasítással kérhetsz egy szemafor azonosítót. add ki a sem_aquire()-utasítást> amely meggátolja az új folyamatokat abban. majd egy l-es használati korlát következik (tehát a folyamatod lesz az egyetlen. végül a chmod-ból ismert oktális mód. Ha más folyamatok birtokában vannak a szemafornak. valamint egy opcionális tömbnév és egy opcionális változó. de nem lehet megbízhatóan frissíteni őket. Ha a teljes outputra szükséged van. ahonnan elkezd írni. hogyan válasszuk ki közülük. hogy a benne található titkos rendszerparancsokkal tönkretegyük a webszerverünket. Az exec()-utasítás argumentumában egy szöveges parancs szerepel . és egy viszonyítási pontot. ami megakadályoz másokat a szegmens frissítésében. visszatérési értékül a parancs outputjának utolsó sorát adja. Ha megengeded a felhasználók- 226 . Mielőtt frissítésre megnyitsz egy szegmenst. és ezt a változót kell ellenőrizni (ez az utasítás nyilvánvalóan nem illeszkedik a standard PHP 4 utasítások formájához). majd a frissítés elvégezése után a sem_release()-utasítással engedheted el a változót. amelyben az eredmények eltárolhatok. nehogy elárasszuk a megosztott memóriát. amelyek megoszthatók.) A shmop_write()-nak a szegmens azonosítóját kell megadni. majd várjuk meg. Miután a parancs végrehajtása megtörtént. amit a MySQL-ben használhatunk. akkor ezt a második paraméterként megadott tömb révén érheted el. valamint a sztnngben szerelő félidézőjelekhez és speciális karakterekhez is félidézőjelet vagy visszaperjelet ad. A megosztott memória mérete. Most már tehát birtokában vagyunk a fájlok megfelelőinek a memóriában.

hogy a sztring egy egyedülálló sztringként kerül feldolgozásra. (A szoftver egyelőre nincs feltelepítve a saját weblapomra. escapeshellarg($parm)). ahol nem tudjuk megváltoztatni az adatokat. milyen beállítások voltak érvényben a kamerán. ezért itt példákat nem közlök. Ezek a funkciók a mi honlapunkon is hasznosak lehetnek. 227 . így azonnal észrevehetjük. és az került volna megjelenítésre): $result = mysql_query("select print( $result). Most az üzenetet a Resource id#3 formában kapjuk. Az escapeshellargQ által visszaadott sztring: 1 -Tt /dev/hda' Az escapeshellcmd() az escapeshellarg() egy korábbi változata. és a 11. és ezeket táplálod be paraméterként a parancsok számára. de nyilvánvalóan nem működik olyan jól. Extra információ A PHP szüntelenül újabb hasznos információkat bocsát rendelkezésünkre.Áttekintés nak. $parm = " -Tt /dev/hda" . "^ exec("hdparm " . hogy a felhasználók ne tudjanak sztringeket begépelni közvetlenül parancsok paramétereként. A JPEG-fájlok tartalmazhatnak olyan mezőket. hogy nyers adatokat gépeljenek be. A JPEG-ekről szóló és a JPEG-ekből származó információk megjelenítéséhez lapozzuk fel a 8. ami korlátozza a program elterjedését. akkor a felhasználók utasításokat tartalmazó adatokkal behatolhatnak a rendszerbe. a getexifQ. * from countries"). oldalakról.ru) letölthető mnoGoSearch-szoftver Unix-platformon ingyenesen használható a Win32 bináris verzió viszont pénzbe kerül. feltéve hogy a weblap Unix-platformon működik és a jövőben is azon fog működni. A PHP-ban most már szerepel egy utasítás. Az escapeshellarg() biztosítja. de a valóságban a sztring egy adatbázisból vagy valamely más forrásból származhat.mnogosearch. fejezeteket. Nem hasonlítottam őket össze forráskód szinten. 3. és úgy készítettem el weboldalaimat. pl. hogy kinyertünk volna egy sort. amely megjeleníti ezeket az információkat. hogy a select eredménye helyett a forrás azonosítóját jelenítettük meg (ahelyett. és egy PHP-mterfészt biztosít az adatbázisban való keresésre. Ha egy képernyőn egy erőforrás azonosítóját sztringként használtad. mnoGoSearch-függvények Az mnoGoSearch-oldalról (www. Az indexelésre alkalmas szoftver információkat gyűjt a fájlokról. ezáltal csökkenti a behatolás veszélyét. A következő felsorolás az egyes utasítások rövid leírását tartalmazza. amellyel rögzítették a digitális képet. amelyek alapján megállapítható. akkor korábban néha egy sima egész számot láttál. tetszőleges ODBC adatbázisban tárolja őket. A következő példában saját magunk adhatunk idézőjeleket és perjeleket a sztringhez. honlapokról. ami nem segített a képernyőt előállító utasítás hibájának felismerésében.

• udm_find() Végrehajtja a keresést. • udm_free_res() Felszabadítja a kereséshez rendelt erőforrásokat. • udm_add_search_limit() Korlátozásokat ad a kereséshez. • udm_load_ispell_data() Betölti a nyelvi ellenőrző adatokat (ispell). • udm_errno() Visszatérési értéke egy hibakód. így megbizonyosodhatunk. ^ • udm_clear_search_limits() Eltávolítja a keresési korlátozásokat. így az nem fut a végtelen ségig. • udm_free_agent() Lezárja a sessiont. • udm_api_version() Megjeleníti az kereső verzióját. hogy a legfrissebb verziót használjuk. • udm_get_res_field() A keresési eredményeket adja. mint a pl.) • udm_alloc_agent() Egy mnoGoSearch-sessiont indít.) • udm_cat_list() Felsorolja az aktuális kategóriával egy szinten lévő kategóriákat. fejezet Környezet Az mnoGoSearch weboldalán tesztelhető a keresés. • udm_set_agent_param() Beállítja a keresőügynök paramétereit. • udm_cat_path() A legfelső kategóriától az éppen aktuális kategóriára mutató útvona lat adja.com kategóriáit. • udm_error() Visszatérési értéke egy hibaüzenet. • udm_get_doc_count() Megadja az adatbázisban található dokumentumok számát. 228 . így megbizonyosodhatunk arról.1. • udm_get_res_param() Visszatérési értékei az eredmény paraméterei. a Yahoo. így meghatározhatjuk a problémát. (A kategóriákat úgy kell elképzelni. • udm_free_ispell_data() Eltávolítja a nyelvi ellenőrző adatokat. hogy a dokumentumok száma összhangban van az indexelni kívánt honlappal.

hogy újabb kitörlendő fájlokat és alkönyvtárakat találjon. Egyszer elérkezel arra a szintre.Gyors megoldások Gyors megoldásokok A régi fájlok eltávolítása Szeretnél egészséges környezetet biztosítani a honlapod számára. Sőt. Az operációs rendszerekben is fellelhetők bizonyos eszközök és módszerek a fájlok kirostálására. A kód a fájlok egy tömbben való felsorolásával kezdődik. Ez az eljárás a főkönyvtártól az alkönyvtárak felé tartó listát állít elő. $v . a kód végrehajtása során további sorokat ad a táblázathoz. Mikor felrakjuk az online-boltunk apák napi akciójához kapcsolódó képeket. Az adatbázis a felhasználók hozzáférését is kezelheti. sokkal találóbb példában egy dátumhoz kötődő reklámkép és -banner fájljait tekintjük át. és a legalsó alkönyvtárral kezdve a megadott főkönyvtárig bezárólag mindent kitöröl. A kód első sora visszaállítja a tömbváltozót. majd kitörli a fájlokat. A kód egy következő része megfordítja a felsorolás sorrendjét. amelyet olyan tetszetős kezelőfelülettel ruházhatsz fel. "</tdx/tr>") . mikor egyedi kitisztító alkalmazásra lesz szükséged. Mikor a kód megtalál egy alkönyvtárát. "</tdxtd>" . $m) { print ("<trxtd>" $m . A következő kód beolvassa a kitörlendő listát. amilyennel csak szeretnél. Ez az igazán elegáns megoldás. hogy apák napja után az összes apák napi zoknit. Él 229 . Az 5. Egy alkönyvtárakat tartalmazó könyvtárat nem könnyű kitörölni. ezért a kód minden egyes alkönyvtárt egyedileg töröl. fájlokat töröl és könyvtárakat olvas be. Ezt követően megjeleníti a HTML-táblázat elejét. vagyis más honlapépítők is megadhatják a törlési igényeiket. ezért ki kell takarítanod az elavult fájlokat. és létrehozhatsz egy csinos formot a lista karbantartására. amelynek argumentumában két érték szerepel. A következő példákban először egy tesztfájlt és egy tesztkönyvtárat nevezünk meg egy ideiglenes könyvtárban. meghatározhatjuk. így a fájlok eltávolítása már a hozzáadáskor meghatározható. ha a mutató nem a tömb első elemére mutatna. A kód számos üzenetet jelenít meg azonos formátumban a ptr()-utasítás révén. = "t:/Copy of temp". majd a következő. és azokat egy HTML-táblázat sorában helyezi el: function ptrí$v. . majd végül megjeleníti a HTML-táblázat végét jelző tag-et. pólót és papucsot ábrázoló kép eltávolításra kerüljön a szerverről: $delete[] $delete[] = "t:/Copy of New Text Document. arra az esetre. de ezek nem kifejezetten a becses honlapod fájljaira vonatkoznak. fejezetet elolvasva felépítheted a listát tartalmazó adatbázist. hozzáadja a kitörlendő lista végéhez. A kitörlendő fájlok felsorolásával kezdjük.txt". a törlési dátumot is meghatározhatjuk.

hogy a cikluson belül a kód hozzáad.") { $delete[] = $v . ha az adott elem .és closedir()-parancsokkal olvassuk be (lásd a 8.7. $fi1e_name. else ptr($v. "not deleted"). A második if() megvizsgálja. -1) != "/") { $v . "<em>Result</em>"). $v) = each ($delete) ) { if(file_exists($v)) { if(is_dir($v)) { $dir = opendir($v). Ehhez az each()-megközelítést használja. readdir(). Ha az adott elem fájl.. az else()-ág pedig azt az esetet fedi le. A könyvtárakat az opendir()-. fejezet Környezet A while()-ciklus végigmegy a tömb minden elemén. illetve elvesz sorokat a táblázatból. kivéve. hogy létezik-e a fájl. ptr("<em>Item</em>". closedir($dir).= -/". Az első if() ellenőrzi. whiledist ($k.unset($delete[$k]). se nem könyvtár. hogy a fájl fájl-e. ha soha nem is létezett." and $file_name != ". 230 I . fejezetet). } while($file_name = readdir($dir)) { if($file_name != ". Ha a fájl nem létezik vagy nem könyvtár. arra az esetre. ha a tömb adott eleme se nem fájl. else ptr($v. az unlink()-paranccsal töröljük. Az egyes pont az aktuális könyvtárra vonatkozó mutató. akkor az adott elemet az unset()-paranccsal eltávolítjuk a $delete-tömbváltozóból. illetve ha már töröltük.. vagy már törölték.-ot tartalmaz. print("<table bordér=\"3\">").-ot vagy . "deleted"}. A kapcsolódó elseif() megvizsgálja. hogy a fájl könyvtár-e. "not a directory or file"). ezáltal a folyamatot nem befolyásolja. if(substr($v. elseif(is_file($v)) if(unlink($v)) ptr($v. A readdirQ minden elemet betesz a törlendő elemek tömbjébe. míg a dupla az eggyel magasabb szintű könyvtárra mutat: reset($delete).

felülről lefelé. hogy napvilágra kerüljenek a kiválasztás hibái. $v) = each($delete)) { if(file_exists($v)) { if(is_dir($v)) { if(ürmdir($v)) { ptr($v.4 ábra a kis tesztlistára vonatkozó törlési táblázatot mutatja. hogy a könyvtár üres és rendelkezünk a megfelelő jogosultsággal. "not found"). Miután a szkript végrehajtotta az előbbi kódot. "removed"). Az rmdirQ-parancs eltávolítja az argumentumában szereplő könyvtárat. ami párhuzamosan kerülhet feldolgozásra. } } print("</table>"). ha úgy módosítjuk. else { ptr($v. feltéve. Az array_reverse()-parancs miatt a legalsó szintű alkönyvtárral kezdi. A 7. Az alábbi kód végigmegy a $delete-tömbön és kitörli az elemeit. Az array_reverse()-parancs megfordítja a tömb elemeinek sorrendjét. "not removed"). while( l i s t ($k.Gyors megoldások unset($delete[$k] else unset($delete[$k]). ptr($v. érdemes mindent megjeleníteni.5 ábra pedig a második futtatás eredményét. Az alkönyvtárakon végiglépkedve keletkező bejegyzéseket eltárolhatjuk egy másik tömbben. a 7. } else { ptr($v. a végső kódnak alulról felfelé kell elvégeznie az eljárást. Mikor egy ilyen rendszert tesztelünk. ahol láthatjuk a hiányzó fájlok eredményezte üzenetet. az összes könyvtárnév. ezzel megoldja a problémát: $delete = array_reverse(Sdelete). hogy ne jelenjenek meg az alsóbb szinteken lévő elemek. "does not e x i s t " ) . benne lesz a $delete-tömbben. 231 . és legutoljára törli ki az általunk megadott főkönyvtárat. A lista rövidebbé tehető.

Ha Wordot használunk a tesztfájlok létrehozására és nem tudjuk törölni a fájlokat vagy a fájlokat tartalmazó könyvtárt.4 ábra A törölt fájlokat és könyvtárakat tartalmazó fájllista \Result Item t:/Copy ofNew Text Document. amelyeket kézzel kellett kitakarítanom.7. akkor zárjuk be az alkalmazást. hogy a saját.tmp |t:/Cop of temp/Copy (2) of temp/New Text Document. Ezeket az információkat összekapcsolhatod egy kirostáló alkalmazással.txt deleted Jfe.txt |not found jnot found Í:/Copy of temp 7. ha egy külön mezőben megadhatják.5 ábra Fájllista a már törölt könyvtárakon futtatott szkriptből ötlet: Egy külön tipp Windows felhasználóknak: Mikor ezt a kódot tesztelitek. és mindenféle ideiglenes fájlokat és félbehagyott tesztfájlokat hagynak maguk után. mint a Microsoft Word. y deleted oftemp/hs~l. A modern számítógépekben olcsó a tárkapacitás de a nagyméretű képek és az audiovizuális fájlok gyors terjedésével még mindig könnyen megtölthetjük a winchestert. Hivatkozás: Az adatbázisok listázása Lemezterület-kimutatás Képek listázása oldal: 144 267 384 Még egy területen láttam hasznát ennek a kitakarító kódnak. A legjobb alkalom erre. amellyel létrehoztuk a tesztfájlt. Az már hab a tortán. mikor a PHP COM eszközét használtam különböző Microsoft Office-alkalmazásokkal. Az Office-alkalmazások néha rejtélyes módon lefagynak. Az olyan alkalmazások. szintén beragadva hagyhatnak itt-ott egyes fájlokat. hogy egy adott fájlnak mi a szerepe és egy másik mezőben meghatározhatják a dátumot vagy egyéb feltételeket a fájl törlésére vonatkozóan.tmp ^S&T jt:/Copy deleted |fc7Copy of temp/Copy (2) of temp/hs~4 . Az rmdirQ-parancs nem fogja letörölni a fájlkezelő ablakban éppen megnyitott könyvtárat. amelynek segítségével a felhasználók megtalálhatják az elavult fájlokat. (tiZCop of temp removed y 7. fejezet Környezet \Rem lassult \ |t:/Cop of New Text Document. Biztosítani kell a lehetőséget a weblap építésében közreműködő társainknak. letilthatjátok az rmdirQ-parancsot az egyik könyvtárra. elavult fájljaik kitakarításáról rendelkezzenek. és a Windows Intézőt vagy valamilyen hasonló fájlkezelőt használtok a könyvtárak ellenőrzésére és a törlési folyamat követésére. Bemásoltam a kitakarító kó232 . mikor feltöltik a fájlokat.txt deleted y jfc/Copy of temp/Copy (2) of temp jremoved.

az tudja.com szintén Sydneyből pingelve 171 ms alatt válaszolt.3. ami egy aktív kereskedelmi weblapnál jócskán meghaladja az elvárható értéket. amelyeket kézzel szerkesztettek.') ■ -. és ezt használtam tisztogatásra. Ennek révén az eredeti tesztfájlokat a forráskönyvtárból átmásoltam egy tesztkönyvtárba. ezért szükséged lehet külső kiegészítő programok futtatására. Külső programok végrehajtása Bizonyos dolgokat még a PHP sem tud.8.8. Pinging petermoulding.. Aki valaha is használt pinget. ahol emberek több mint 50 ezer dollárt költöttek egy olyan szoftverre. Itt egy példa.. A legdrágább szoftvernek még a paraméterek beállítására szolgáló online-formja sem volt.32: bytes=32 bytes=32 bytes=32 bytes=32 time=20ms time=20ms time=20ms time=70ms TTL^HH TTL=24t TTL=2l»ít TTL-2>m . így az esetlegesen sérült fájlokat helyettesíthettem egy sértetlen másolattal.32: from 61. használd az exec()-utasítást.3. A következő" lépés a fájltisztogatás kiterjesztésében egy $copy-tömb hozzáadása volt.32] with 32 bytes of data: Reply Reply Reply Reply froia 61.32: from 61. míg egy másik szerverből több mint 500 ms-ba telt kiszedni a választ.3. dolgoztam olyan projekten. 5 Command Prompt Microsoft(R) Windows NT(TM) (C) Copyright 1985-1996 Microsoft Corp.Gyors megoldások dot a tesztszkriptjeim elejére.com rs-"_'■*■■--. hogy kéréseket küld IP-címekre és felsorolja a válaszadásig eltelt időt.8.. a világ legegyszerűbb programját a pinget használva. r :\Peter>ping petermoulding. mint az alábbi példa mutatja.. -^' . Egy fájlt hozzáadni a tömbhöz még mindig sokkal egyszerűbb. az egész szövegfájlokon alapult.8. Bár ez a másolgatás és törölgetés a PHP-val egészen egyszerűnek és magától értetődőnek tűnhet.32: from 61. 7. ' . mint fájlokat másolt és törölt a felhasználók által készített lista alapján. Az Egyesült Allamokban található Yahooo. ami nem rossz idő egy nemzetközi kapcsolat esetén.com [61. A 7.: : ■ ■ ..8.3. hogyan futtathatsz külső programokat. Ha a program nem a system könyvtárban 233 . amelyik alig csinált többet. Ha fájlkezelő rendszert készítesz a honlapod számára.6 ábra Ping a parancssorban Ha egy szkriptből szeretnél pingelni. mint kézzel kitörölni vagy egy fájlparancs kódjába begépelni. A sztring a futtatni kívánt program neve.3.6 ábrán egy Sydneyben található munkaállomásról pingeltünk egy szintén Sydneyben lévő webszervert: a körutazás 20 ms-ot vett igénybe. biztosíts a végfelhasználónak könnyen átlátható és könnven kezelhető formokat az adatok bevitelére. kérlek.

while(list($k. $result).32: 61. Ez egy help oldalt tartalmaz. akkor a sztringnek tartalmaznia kell az elérési utat is. adj hozzá egy tömbváltozót az exec()parancshoz.8. hogy a PHPszkriptben további vizsgálatnak vessük alá: 19 20 21 22 23 24 25 Pinging Reply Reply Reply Reply petermoulding.32: 61.8.32: 61. Az output megjelenítését pedig a print() utasítás és a while()-ciklus segítségével oldhatod meg: $result = exec( " p i n g " .32] with 32 bytes of data: from from from from bytes=32 bytes=32 bytes=32 bytes=32 time=20ms TTL=244 time=30ms TTL=244 time=20ms TTL=244 time=60ms TTL-244 Most adjunk hozzá egy további kódrészt. while(list( $ k . Ahhoz.3. $v) = print("<br>" $k $v).32: [61. mint a következőkben látható: 234 . fejezet Környezet található.8.8.8. Nyugodtan próbálgassunk: $result = exec("ping each($output)) petermoulding.3. A kód outputja itt látható. amit megjeleníthetünk a weblapunkon is. hogy megadjuk egy weboldal nevét. hogy a program teljes outputját megkapd. $output).com 61. $output). print("<br>" .7. hogy takarékoskodjunk a hellyel): Usage: ping [-t] [-a] [-n count] [-1 size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] I [-k host-list]] [-w timeout] destination-list Options: -t Ping the specified hőst until interrupted. vagy kivághatunk belőle részeket. <cut> 17: -w timeout Timeout in milliseconds to wait for each reply.com". A $result-változó értéke a program outputjának utolsó sora és a print()-utasítással tudjuk megjeleníteni.3.3. mert nem adtunk meg IP-címet vagy URL-t (néhány sort elhagytunk. Az új output egy formás elrendezésben mutatja be a szerver válaszadási idejét. Sajnos a pingelés eredményének utolsó sora üres sor: $result = exec("ping").3. mint a következő példa mutatja. 18: Próbáljuk ugyanezt a pinget újra ugyanezzel a szkripttel úgy. $v) = each($output)) print("<br>" $k $v ) .

és futtasd a programot a passthru()-paranccsal. a teljes outputot eltároljuk egy tömbben. 3 2 : bytes=32 time=60ms TTL=244 A passthru() az exec() egy alternatív neve.ch {$ output) { print("<br>" . 3 2: bytes=32 time=20ms TTL=244 25 Reply from 6 1 . $return_code). 8 . 8 . kiegészítve a help-képernyővel. A $result-változóban az output utolsó sorát kapjuk vissza.com-ot és egy opcionális második paramétert biztosít a program visszatérési kódjának. Az alábbi kód megpingeli a Yahoo. $return_code) Mivel a passthru() ellenőrizetlenül és formázatlanul küldi az outputot a képernyőre. Küldd el a bináris outputnak megfelelő fejlécet. $k . lássunk erre is egy gyors szemléltetést. 3 . 8 . 8 . hogy mint az execQ esetében. $v A reset()-parancs visszaállítja a tömbpointert a tömb elejére. sem az output utolsó sorát nem kapjuk vissza.vagy egyéb output nélkül kell követnie a fejlécet. Nincs lehetőség arra. while (list ($k. és meglepő módon az eredmény mindkét exec() outputját tartalmazza. Abban a verzióban. A execQ az új outputot a tömb végéhez fűzi. 18 19 20 Pinging petermoulding. 3 2: bytes=32 time=30ms TTL=244 24 Reply from 6 1 . 3 2 ] with 32 bytes of data: 21 22 Reply from 6 1 . A teljes output közvetlenül a képernyőre kerül. hogy mint az ececQ esetében.Gyors megoldások / . amely a kettő közt jelent meg: passthru("ping yahoo. 3 . A következő kód megpingeli a Yahoo. 3 2 : bytes=32 time=20ms TTL=244 23 Reply from 6 1 . grafikát vagy mozgóképet produkálnak. <cut> 17 -w timeout Timeout in milliseconds to wait for each reply. és 1-et. főleg olyan programokhoz használatos. 3 . $v) = -ea.com [ 6 1 . A bináris outputnak HTML. az output kétszer került elküldésre. 3 . ha sikeres volt a pingelés. Itt sincs lehetőség arra.■ reset{$output). 8 . amelyek bináris adatot. lássunk egy gyors demonstrációt. A $return_code-változóban O-t kapunk.com" print("<br>return_code: " . 3 . a teljes outputot eltároljuk egy tömbben.com-ot és egy opcionális második paramétert biztosít a program visszatérési kódjának. ha valamilyen hiba lépett fel: 235 . és később összesítve dolgozhatod fel: Usage: ping [-t] [-a] [ -n count] [-1 size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] I [-k host-list]] [-w timeout] destination-list Options: -t Ping the specified hőst until interrupted. pl. így az outputokat naplószerűen összegyűjtheted. amit teszteltem. ": " . A system() az exec() és a passthruQ egy alternatív neve.

8 ábra a Word CLSID bejegyzését mutatja (a Regisztrációs adatbázisban rengeteg CLSID-bejegyzés található).243: bytes=32 time=171ms TTL=244 return code: 0 Word-dokumentumok Rtf-formátumba konvertálása COM segítségével Az alábbi példa bármilyen Microsoft Office-termékkel vagy tetszőleges COM-kompatibil alkalmazással használható Windows vagy Windows NT alatt. Q . a PHP-é pedig 4.0.(Mentés másként) utasítással.7. print("<br>return_code: " .aifc Rndwbat: CLSIDJ FJnd Hexl Cancel | Lo o k at —^^S^^^^^^^^^^^EE 1? Keys ^^^^| M values (7 Data r Matchwhqle string only Tffl^^^^J °^^l .com". ami alább látható.115. Az egyetlen nehézség annak elérése. .arf i~Ű . ami példánkban Word.El a b w :--(23 acp . A számunkra szükséges név a CLSID-könyvtárat tartalmazó könyvtár neve. hogy az egyes alkalmazások pontosan azt az utasítást hajtsák végre. amelyet megtalálhatunk a Visual Basic for Applications (VBA) dokumentációjában vagy a Windows Regisztrációs Adatbázisában. milyen opciók működnek a saveas. $return_code). A Regisztrációs adatbázist a regedit-paranccsal megnyitva böngésszük a HKEY_CLASSES_ROOT-könyvtárat vagy keressünk rá a CLSID-re. =.aiff fi tü ais 7. A 7. fejezet Környezet $result = system("ping yahoo. print("<br>result: " .Cl HKEY_ CL ASSES_ RO OT '. amint éppen a keresés elején tartunk. amit szeretnél.-El .108.669 r. de a ReadOnlyRecommended-nek mint 236 .7 ábra Windows Registry HKEY_CLASSES_ROOT Kíváncsi voltam. Application. A FileName működött első paraméterként és a FileFormat másodikként. M My Co mputer B. EB —J " ^Ittiy V Edl! e"' Help Narne ■ £3 3SG .4pll. A 7. ezért létrehoztam egy saveas-makrót VBA-ban. Először a célalkalmazás COM-azonosítójára lesz szükségünk. és teszteltem a megfelelőjét PHP-ban. result: Reply from 216. $return_code).7 ábrán a Regisztrációs adatbázis megnyitott HKEY_CLASSES_ROOT-könyvtárát láthatjuk és a Keresés ablakot. $result).--£] aci !Eí-£) ai ■ adp ■-■El . A Word verziója 97 SR-2 volt.

C3 Word. Az if()-utasítással ellenőrizzük. SaveAsAOCELetter:= Falsé Ha mindezt saját kezűleg szeretnéd kipróbálni. Az első sor a $w-változóban létrehozza a com-objektum egy új előfordulását a word-alkalmazás számára és megnyitja a kommunikációs csatornát az alkalmazás számára. LockComments:=False. a wdFormatRTF-nek a definíciói is megtalálhatók. mint pl. a COM-műveletek végrehajtását szolgáló kód megtévesztőén egyszerű. tehát beállíthatod a kívánt értékeket. a kívánt Office-termékben válaszd az Eszközök Makró | Uj makró rögzítése menüpontot. def ine ("wdFormatRTF". AddToRecentFiles:=True. így mire a COM-ot PHP-bó'l használod. WritePassword :="". vagy PHP-ban is létrehozhatod a megfelelő definíciókat. A Visual Basicszerkesztőben az objektumok tulajdonságainak. 3 ) .8 ábra Windows Registry CLSID eleme ActiveDocument.Backup 8 7. ha éppen meg van nyitva egy párbeszéd237 . amelyeket COM-on keresztül szeretnél megvalósítani.define("wdFormatUnicodeText". A Microsoft Office-alkaímazások nem reagálnak. 4). állítsd le a rögzítést. define("wdFormatDOSText". Végezd el a megfelelő műveleteket. hogy sokkal több működő és dokumentált opciót találsz: {&' Reqistry Editor Registiy Edit View Help I WMVFile I WordAddinB •_1 CurVer ti ű Word. FileFormat:=wdFormatRTF. Password:="". SaveFormsData:=False. ReadOnlyRecommended:=False. Az én tesztgépemen a Word néhány alkalommal nem válaszolt. ErabedTrueTypeFonts: =False. define("wdFormatText". 5). SaveNativePictureFormat:=False. 2). mikor egy dokumentum már meg volt nyitva szerkesztésre.Application. define("wdFormatTemplate". könnyen lehet. Az alábbiakban bemutatott. A PHP COM interfésze gyorsan fejlődik.SaveAs FileName:="comtest. 7).Gyors megoldások hetedik paraméternek nem volt hatása. 0). 1). A következő kód a fájlformátum definíciók felsorolását tartalmazza: define("wdFormatDocument". és nézd meg a makrót a Microsoft Office-hoz biztosított Visual Basic-szerkesztőben.rtf".8 >. 6 ) . hogy ez sikerrel járt-e. define("wdFormatTextLineBreaks". define("wdFormatDOSTextLineBreaks".

A $w->Documents[l]->saveas()-parancs elmenti a dokumentumot az argumentum második paraméterben megadott valamelv. $w->Version) . miközben tesztelünk. lehet hogy fizikailag be kell zárnod a Wordot. } else { print("<br>Visible failed.").7. if($w->Visible = 1) { print("<br>Word should be visible. } if($w->Documents>Open("t:/comtest. $w->Documents[1]->saveas("t:/comtest3.application") ) { print("<br>Opened Word version " ."). com_invoke() Meghív egy COM-komponenshez tartozó eljárást. } else { print("<br>Word failed to open"). Ha Worddel szerkesztesz egy állományt. Néhányuk még mindig nagyon megbízhatatlanul működött. 238 . } else { print("<br>Open failed. VARIANTO VARIANT-osztály.doc")) { print("<br>Document opened. mielőtt más alkalmazással megnyithatnád az adott fájlt. amit a COM-on keresztül próbálunk elérni. ha már használatban van az a fájl. wdFormatRTF) A következő felsorolás az előző részben nem szereplő COM-utasításokat tartalmazza. mint például a Mentés másként ablak. és esetenként képtelenek megszakítani a kapcsolatot egy-egy fájllal. Az alkalmazások akkor is kudarcot vallanak. com_load() Új referenciát hoz létre egy COM-komponenshez. így Iá: hatóvá válnak a COM-műveletek. az előbbi felsorolásban szereplő formátumban. és nagyjából megegyezik a Word Fájl | Megnyitás parancsával. Használatuk az alkalmazástól függ. mikor próbáltam: • • • • COM() COM-osztály. A $w->Quit()-utasítással kilépünk az alka^ mázasból: i f ( $ w = new com("word."). Néhány embernek működik. A $w->Vistble = 1-utasítás hatására az alkalmazás ablakának aktívvá kellene válnia."). A Sw->Documents->Open()-parancs megnyit egy dokumentumot a Wordben. fejezet Környezet ablak. másoknak nem.rtf" $w->Quit().

de mindezt alkalmazhatod egy honlap összes oldalára vagy akár adminisztrációs panelek és opciók bonyolult összességére is. vagy a két fejléc elküldésével megjeleníti a bejelentkező ablakot. Először a PHP header()-utasítására lesz szükséged. A tartomány hozzárendel egy nevet hitelesítéshez. szabadon alkalmazhatod weblapok tetszőleges kombinációjára. a böngésző ugyanannak az oldalnak küldi vissza az információkat. mivel ennek hatására a böngészőben előugrik egy ablak. Másodjára a szkript látja a felhasználói nevet. Ha van egy működó' HTTP-hitelesítésed. A kód először a $PHP_AUTH_USER-változó létezését ellenőrzi. amely szintén megjelenik a bejelentkező képernyőn. Jelen esetben egy "Authentication Required" (Hitelesítés szükséges) és egy 401 -es fejlécet kell küldened. HTTP hitelesítés példa Ez a példa egy egyszerű HTTP-hitelesítést alkalmaz egy demonstrációs weblapra. com_propset() Egy COM-komponens tulajdonságának értékét állítja be. com_release() Csökkenti egy komponens-hivatkozás számlálóját. amit a doménnév követ. amelyik a fejléceket küldte. mint az a 7. com_addref() Növeli egy komponens-hivatkozás számlálóját. vagy elhagyja a bejelentkező ablakot és végrehatja a bejelentkezés utáni utasításokat. tehát a szkript másodjára is lefut. Username and Password Required EEnter usemameíor birds atpetermoulding com: User Nsme Password: OK Cencel i 7. majd beengedi a látogatót. amely felhasználói nevet és jelszót kér. A 7.9 ábrán a tartomány neve birds. com_propput() Egy COM-komponens tulajdonságának értékét állítja be.9 ábrán átható. amely tetszőleges HTTP-fejlécet küld.Gyors megoldások com_propget() Egy COM-komponens tulajdonságának értékét adja vissza.9 ábra Bejelentkezés képernyő A következő kód egy egyszerű. com_set() Egy COM-komponens tulajdonságának értékét állítja be. com_get() Egy COM-komponens tulajdonságának értékét adja vissza.10 ábra egy sikertelen bejelent kezés utáni böngésző ablakot mutat: 239 .com/birds/ címen. Ha a Mégse vagy az OK gombra kattintunk. A 7. A hitelesítés lényege a bejelentkező oldal és a felhasználónév valamint a jelszó ellenőrzése. tesztelésre alkalmas bejelentkező oldalt mutat a petermoulding.

pl. és egy gyenge biztonságú közös adatbázison osztozik a többi honlappal. nehogy mások ki tudják olvasni az adatbázisból.<br>You are logged on with password if(isset($PHP_AUTH_TYPE)) .jpg" . mielőtt elmented az adatbázisba. például FTP-hozzáférés. 2 50. $PHP_AUTH_PW) $PHP_AUTH_TYPE^■ print("<br>You are using authentication type print("<p>Here is my first pretty bird. The King Parrots arrive" " when the noisy Eastern Rosellas are not covering the" . hogy szemléltessük a fejléceket. A valóságban a felhasználói azonosítót és jelszót egy adatbázis bejegyzéseivel vetnéd össze. Mikor valaki bejelentkezik. $PHP_AUTH_USER . pl. vagy ha a gazdaszerveren más biztonsági rések vannak. és ezt hasonlítod össze az adatbázisban tárolt titkosított jelszavakkal. Ha egy felhasználó bejelentkezett. " in your username and password. Here is a sample" . A jelszót titkosítanád. Ez csökkenti annak a veszélyét. míg keresztülhalad a hálózaton. Hiába teszed azonban bombabiztossá honlapodat.) Ezen túl rövid időtúllépési időszakokat kell biztosítani arra az esetre. Ez a biztonsági szint éppen arra elegendő. ami alapján két böngésző megkülönböztethető. A böngészőben JavaScriptet használhatsz a jelszó titkosítására. ". "King Parrot")). sitting on" . a King Parrot. Mivel mindkettő lemásolható.0 401 Unauthorized"). Tehetsz még néhány további óvintézkedést attól függően.</p>"). a sessionje egy cookie vagy egy sessionazonosító segítségével tartható fenn az URL-jében. fejezet Környezet if(isset($PHP_AUTH_USER)) { print("Hello " . 240 . a böngésző IP címét. ugyanazzal a kulccsal titkosítod a jelszavát. továbbá tartalmaznia kell valamit. ha a szervered egyike az ugyanazon a gazdaszerveren futó sok kis virtuális szervernek.7. please type" . header( "HTTP/1. ha valaki elmegy ebédelni és nyitva hagyja a böngészőjét. print(img("kingparrot. " a branch outside my office window. " branches. a microtime()-utasítás által megadott időpontot. hogy a megfelelő titkos kódot tartalmazzák-e. mielőtt átadnánd a szervernek. print( " I f you want to see my pictures of pretty birds. ami minden bejelentkezésre egyedi. " of what you are missing:<br>"). egy titkos kódot kell elhelyezni a cookie-ban. else header ( "WWVJ-authenticate : basic realm=\ "birds\ "" ) . and click OK. hogy valaki elolvassa. A titkos kódnak tartalmaznia kell valamit. némelyik az eredeti IP-címet egy HTTP_X_FORWARDED_FOR-fejlécként küldi el. 50 0. hogy mennyire vagy paranoiás. (Egy proxy-szerver mögötti böngésző IP-címének megszerzése elég bonyolult lehet. aztán ellenőrizni kell a beérkező lekéréseket.

and click OK. please rype in your username Euid password. hogyan fusson le a kódod a phpinfo() alapján. Az alábbi utasítások eló'segítik. ha valaki egy elavult böngészővel látogatja az oldalaidat. Néhány változás hatása függhet a böngésző típusától. hogy lásd a teszt eredményeit. ezért nem árt minden nap megvizsgálni az eredményeket. f " Bookmaiks A Localion:|http://petetmojlding cijm/bin:iir| If you waiit to see my pictures of pretty birds. amelyek soha nem kerülnek megjelenítésre. mi történik. ezért minden beérkező üzenetet naplóznunk kell. de nem befolyásolhatod. Here is a sample of whatyou are missing: Documen:: Doi j* ■_> á^ C&l 7. hogy a kódod jobban igazodjon a környezethez. hogy felfedezd. néhány a lap megjelenítése után.10 ábra A hibás bejelentkezéskor kapott képernyő Hogyan igazítsuk a kódot a környezethez? A phpinfoQ-utasítással megtekintheted a PHP környezetét.Gyors megoldások JE Netscape File Edit View Qp Commu-ricator Help 8ack Reloac Home Search Neísi . 241 . például átirányító oldalakon. Hibanaplózás Először is minden szkríptváltozást naplózni kell ahhoz. néhány pedig olyan lapokon. Néhány változás a lap megjelenítése előtt következik be.

1) . hogy normális esetben mennyi ideig fut le a szkript. $self . amit a következő példa szemléltet. hogy rögzítsük a PHP naplóállományát az error_log()-utasítás használata. tégy egy naplóüzenetet a szkript azon részei elé. A logtofile()-parancs argumentumában tetszőleges sztring szerepelhet. majd végezetül bezárja a fájlt. így fogalmat alkothatsz arról. megnyit egy naplózásra szánt fájlt. fwrite($log. "\n"). ahol külső erőforrásokat. " " . Az error_log()-parancs a php. ha a PHP vagy az Apache valamely belső hibával küszködik. $t) . például indexelést adsz az adatbázishoz. hogy lemérd a hatását. substr($m. és bármikor eltávolíthatod a régi feljegyzéseket. $t) = explode(" ". $text . fejezet Környezet A legegyszerűbb módja. illetve mögé. ezért írtam egy külön naplóparancsot: error_log("Changed code to fit odd browser"). Az fopen()-parancs a paraméterének hatására az fwrite()-parancs egy létező fájlhoz fűzi hozzá a bejegyzéseket.ini beállításaitól függően a PHP vagy a rendszer naplóállományába ír. date("Y-m-d H:i:s". logtofile("New test" Az eredmény például így néz ki: 2002-06-07 1 6 : 1 1 : 0 5 . fclose($log). Ennek a parancsnak a kódját a következő példában láthatjuk. 6 1 8 3 0 4 0 0 New test 242 L . Mikor egy szkriptet tesztelsz.txt". A logtofileQ-utasítás fopen()-parancsában nevezz meg egy saját tulajdonban lévő könyvtárat. microtime()). például adatbázis-lekérdezéseket használ. hogy az error_log()-utasítás üzenetei nem mindig jutnak el a naplóállományba. "a")) { list($m. a dátumot és az időt. Úgy találtam. vizsgáld meg az időket. vagy e-mailt is küldhet. Az idő a standard rendszeridő helyett a microtime()-utasítástól származik. function Logtofile($text="") { $self = " " . mikor a szkript egy része szokatlanul sok időt emészt fel. amelyhez korlátlan hozzáférésed van. " " . és kimutassa azokat az eseteket. de tetszés szerint írhat egy külön fájlba. így a fájl arra is használható. hogy feljegyezze az időt egyazon szkript különböző bejegyzései közt. Ha valamit változtatsz a környezeten. hozzáfűzi a sztringet. } if($log = fopen("t:/log. ha a fájl nem létezik. az fopen() létrehozza a fájlt.7. if(isset($PHP_SELF)) { $self = $PHP_SELF.

ODBC-t használsz. Ha egy szknpted figyelmen kívül hagyja az elkattintást. hogy a PHP befejezte a kérdéses szkriptet. de ez nem volna túl jó ötlet. hogy hagyja figyelmen kívül. erre a register_shutdown_function()-utasítást használjuk: 243 . akkor minden egyes rekord beolvasása elé tehetsz egy ellenőrzést. pl. majd ezeket követően az összes többi terméket kategóriánként csoportosítja. és a PHP megszakítja a futásukat. hogy ezt a szkriptet minden más után futtassa. Először írjunk egy függvényt. Ha egy szkript megjeleníti az árbevétel szerinti első tíz terméket. a connection_aborted()-paranccsal ellenőrizheted. Szkript időtúllépés Néha a szkriptek túllépik az időkorlátot. akkor ehhez minden bizonnyal két lekérdezést használ. mielőtt az összes adatot feldolgozták volna. hogy elkattintott-e a látogató. ha a szkript túllépte az időkorlátot. logtofile("Start of very long database search page") if(connection_aborted()) { logtofile("User left the page"). érdemes-e elvégezni a műveletet. A php. amely IGAZ értéket ad. Az oldalakon a képernyőket részekre oszthatod. ezért közölnünk kell a PHP-val. tekintve. Az eltávozó látogatók valószínűleg a tízes toplista megtekintése után teszik ezt.ini-ben beállíthatod. amely naplózza.Gyors megoldások Menekülő látogatók Van a honlapodon egy olyan oldal. Ez az utasítás csak akkor lesz hasznos. és külön-külön vizsgálhatod a látogatók reakcióit. ha a látogatók bezárják az ablakot vagy elkattintanak. } else í // continue with code Az ignore_user_abort()-utasítás immúnissá teszi a szkriptet az elkattintással szemben. hogy a webszerver elég sok időt töltene olyan oldalak elküldésével. Ha lassú adatbázis-kapcsolattal dolgozol. hogy meghatározd. A logshutdownQ nevű példaprogram a logtofile()-utasítást használja a feljegyzés rögzítésére. A következő kóddal felismerhetjük és feljegyezhetjük ezeket az eseteket. ha egy oldal végrehajtása megszakad. ha azután fut le. és mindkettő jelentős erőforrásokat vesz igénybe. amelyiken sokáig töltődik be a fő információ az oldal tetején? Az ilyen oldalakon a látogatók gyakran az első néhány sor elolvasása után a Vissza gombra kattintanak. mint azt a következő kódrész mutatja: ignore_user_abort(true). hogy a PHP hagyja figyelmen kívül a látogatók bármiféle elkattintását. amelyeket senki nem néz meg. tehát a két lekérdezés közé érdemes egy ellenőrzési pontot tenni. Hová kell elhelyezni az ellenőrző pontokat? Nagy erőforrás igényű műveletek közé. mint például adatbázis-lekérdezések. Először közölnöd kell a PHP-val. A feljegyzés tartalma a connection_timeout()-utasításon alapszik.

elseif(extension_loaded("php_mssql.so kiterjesztések Windows alatt dll névre hallgatnak. hogy a kiválasztás rendelkezzen hibakezeléssel.vagy a switch()-utasításokkal használva meghatározhatod. 244 . kisétálsz az ajtón. Ehhez tudnod kell. fejezet Környezet function logshutdown() if(connection_timeout()) logtofile("The script timed out").dll" ) or extension_loaded{"php_pgsql.so")) $database = "pg". mit használhatsz a kódot futtató szerveren. ha egyik opció sem elérhető. else logtofile("The script shut down normally").dll") or extension_loaded("php_mysql.dll") or extension_loaded("php_mssql. hogy a kiterjesztés milyen néven szerepel a php. így megállapíthatod. Úgy is járhatsz. A Unixos . } register_shutdown_function("logshutdown"). hogy feltelepítesz egy alkalmazást. így a kód könnyedén eldöntheti.so")) $database = "my". ezért mindkettőt ellenőrizheted. grafikus vagy matematikai függvényekre is elvégezhető. logtofile("Using PostgreSQL"). logtofile("Using MySQL"). Flash-t vagy PNG-t használjon. Gondoskodj róla. A $database-t az if (). hogy BCMath-t vagy GMP-t. hogy a szervertől függően melyik kód fusson le. mint pl. a másik MySQL-t. az extension_loaded()utasítással ellenőrizheted. egy figyelmeztető üzenet vagy e-mail küldése.7. elseif(extension_loaded("php_pgsql. a rendszergazda pedig letörli az alkalmazáshoz szükséges kiterjesztést. melyik van feltelepítve.ini-ben. pl. Ez a példaprogram a $database-változó értékét adja meg. logtofile("Using Microsoft SQL Server"). Ez az ellenőrzés bármilyen PHP-kiterjesztésre. Az adatbázis kiválasztása Ha az egyik honlapod PostgreSQL-t használ.so")) $database = "ms". mint a következő kód mutatja: if(extension_loaded("php_mysql.

például a www. míg ha egy funkciót határozottan elérhetőnek tüntet fel.ini-fájlra. valamint lássuk el instrukciókkal arra az esetre.Gyors megoldások Böngésző-alapú kódok Az alábbi egyszerű módon módosíthatod a programjaidat. Nem véletlenül fogalmaztam úgy. A browscap-fájlok csak azt tudják megmondani. ha másodosztályú CSS2-t alkalmazol. amit rendszeresen frissíts. amelyek közül sok teljesen megfejthetetlen. hogy engedélyezve vannak-e. hogy ellenőrizhesse böngészője képességeit. hogy ha a browscap szerint valamely funkció nem támogatott. és a böngészők információit illetően hagyatkozz a browscap.0. Az sem derül ki. hogy rosszul ismeri fel a böngészőt. hogy a böngésző támogatja a cookie-kat. akkor ez csak a lehetőséget jelenti.0 majorver=#l minorver=#0 frames=FALSE tables=TRUE cookies=TRUE backgroundsounds =TRUE vbscript=FALSE 245 . Általános szabályként használható. de azt nem tudják. Csak illeszd be a következő' kódot. Ha a browscap-fájl nem friss. ha böngészője nem megfelelő.0] brows er =WebTV Version=l. amelyek valószínűleg elérhetőek a szkriptet olvasó böngészőben. A következő példát a PHP 4. hogy a CSS2 mely része működik az adott böngészőben. akkor félrevezethet egy bizonyos böngészővel kapcsolatban. A browscap a böngésző által küldött $HTTP_USER_AGENT-sztringen alapul és egy forgalmas oldal napjában több száz szokatlan agent-sztringet kap. vagy hogy milyen komoly következményekkel járhat. és biztosítsunk számára egy tesztelési lehetőséget. vagy az is előfordulhat. A böngésző lehetőségeinek statikus listája alapján nem tudod megállapítani. hogy fel vannak-e telepítve bizonyos opciók.com/asp/browscap/ oldalról: Sbrowser = get_browser().5 browscap-fájljából vettük. hogy a webTV-képernyők korlátozott méretűek és felbontásúak. ezért kisebb képeket igényelnek. Kiderül belőle.cyscape. de az nem. vagy néhányat esetleg kikapcsoltak a telepítés óta. akkor ne használjuk az adott funkciót. hogy jobban illeszkedjenek a böngészőhöz. akkor tájékoztassuk a látogatót a követelményekről. li' if(Sbrowser->javascript) { logtofile("Generating JavaScript"). Ha az oldalunk megtekintéséhez egy nem szokványos böngészőkiegészítő szükséges. // create JavaScript here A get_browser()-utasítás által megadott objektum felsorolja azokat az opciókat. hogy valószínűleg. hogy a böngésző támogatja a CSS2-t. [WebTV 1.

amikor az oldal bármilyen outputot produkál. } tt ] -31 Ellenőrzés a fejlécek elküldése előtt j Ha a kódodat valaki más használja a szkriptjében. } else { // send the headers A HTTP-fejlécek egy csoportban kerülnek elküldésre az oldal elején. if(function_exists("beadd")) // perform calculation using BCMath. ha a megfelelő PHP-verziót használod. ha nem a naplófájlban rögzít egy hibaüzenetet. és a szükséges opciók is fel vannak telepítve. Az utasítások ellenőrzése akkor célszerű. A példaprogram ellenőrzi. A véletlenszerűen elküldött fejlécek elkerülése végett győződj meg arról. abban a pillanatban. fejezet Környezet javascript=FALSE javaapplets=FALSE ActiveXControls=FALSE Winl6=False beta=False AK=False SK=False AOL=False Utasítások ellenőrzése Minden utasítás rendelkezésre áll a honlapodon? Ha az alkalmazásodhoz egy új függvény szükséges. hogy nem megbízható a HTTP-fejlécek küldése. Mielőtt átirányító fejléceket vagy cookie-kat küldesz. hogy az egyik kiterjesztett matematikai utasítás elérhető-e. az első PHP-tag előtt véletlenül leütött szóköz vagy egy beágyazott fájl utolsó PHP-tag-je után szereplő karakter hatására is elküldi a fejléceket. mint a következő kód mutatja. hogy létezik-e az utasítás. csak éppen elfelejtetted beágyazni a megfelelő fájlokat az include-paranccsal. hogy megbízható-e a fejlécek küldése: if( hea ders _se nt ()) { logtofile("Too iate to send headers"). akkor előfordulhat. 246 . és törölj ki minden karaktert az utolsó ? > után. a headers_sent()-paranccsal ellenőrizd. A PHP még egy szimpla. ellenőrizheted a PHP-verzióját vagy a function_exists()-utasítással egyszerűen meggyőződhetsz arról. hogy nincsenek szóközök vagy újsor-karakterek az első <? előtt.7. else { logtofile("BCadd missing").

amelyeket egy helyi rendszergazda esetleg újrakonfigurált. tehát csak 25-ször kell lefuttatnom. l o gt of i l e(S v er si o n) . hiszen ez segít a távoli szerverekről küldött naplófájlok értelmezésében. és megvizsgálja. 0 .ini fájlomban 30 MB van beállítva. szeretnél mindent alaposan tesztelni. A következő példa lekérdezi a verziót. A memória ellenőrzése Mielőtt egy új alkalmazást beindítanál. amelyek az egyes verziók hibáit kezelik. too COMplicated"). amely szándékosan fogyasztja a memóriát. mikor ellenőrizned kell a PHP-verzió számát. vagy ha a legnagyobb kép is csak közepes méretű? Hogyan tesztelheted a rendszer teljesítményét azt modellezve. A rétegek nagy része visszafogja a teljesít- 247 . hogy a memóriát egy alkalmazásból teszteled. hogyan képes a PHP szükség esetén erőforrásokat felszabadítani. működik-e a PHP kitisztító mechanizmusa. 25-ször párhuzamosan meghíva a szkriptet. de a 4. A tesztgép 600 MB virtuális memóriával rendelkezik. 5 " ) { logtofile("Sorry.4 Win32 bináris állományai jól működő COM-támogatást tartalmaztak.Gyors megoldások A PHP ellenőrzése Vannak helyzetek. hogy kiderüljön.0. Az eredménytől függően futtathatsz különleges kódrészeket. } else { // COM code here Ha a kódod függ a verziótól. if($version == " 4 . köztük a PHP-ba. $version = phpversion(). amelyek mind korlátozásokat szabnak a memória méretére. mielőtt a telepítés vagy a frissítés olyan pontra érkezik. hogyan kezeli a virtuális memória a terhelést: leak(30408704). miközben a szkripted többszörösen beágyazott különböző szoftverekbe. hogy egyes PHP-verziók esetén hibaüzenetre lesz szükség.0. akkor lehet.7-dev. hogy mindent naplózzunk. hogy szükséges-e különleges eljárás.0. hogy egyszerre számos szkript nagy fájlokat olvas? Próbáld ki a leakQ-utasítást. A teszt php. ami a COM-hoz hasonló sajátosságokat használ. akkor telepítési és frissítési részek elé helyezd a verzió ellenőrzését. Ha olyan kódot írsz.5-ös verzióban már problémák voltak ezen a területen. ahonnan nem léphetnek vissza. beleértve a verziószámot is. A leak() azt teszteli. ha a tesztadatbázis csak 100 sort tartalmaz. hogy az emberek az előtt szembesüljenek a problémával. Mi történik. a webszerverbe (amely maga is számos réteget tartalmazhat) és az operációs rendszerbe. A phpversionQ értéke a verzióra vonatkozó sztring. A PHP 4. letesztelhetem. Egy jó indok arra. Furcsán hangzik. tehát minden leak()-utasítás 29 MB memóriát fog lefoglalni. amely valahogy így néz ki: 4.

ha nincsenek hibaüzenetek (lásd fentebb a headers_sent()-utasítást). és nagyon hasonlít a következő megoldás kódjához és utasításához. ha a biztosítani kívánt fájlokat a webszerver könyvtárán kívül helyezed el. akkor meg kell kerülnöd a szokásos rendszert. A következő kód egy tesztoldal. ha már létezett. fejezet Környezet ményt. "w+"). Ha a tesztfájlgeneráló kódot ebbe a keretbe foglalod. hogyan változik a teljesítmény). Sname = "roo. és az fpassthru()-parancshoz hasonló readthruQ-val továbbítod a felhasználónak. fpassthru($file).i dában magában a kódban gépeltük be az értékeket. Ez a megoldás megmutatja. akkor törli a tartalmát. Próbáld ki. ha nem létezett. és a szerveredet olyan emberek tartják karban.jpg". Az fopen()-utasítás megnyitja az új fájlt j írásra és olvasásra. vagy szét vághatjuk a létrehozást és a megjelenítést két külön oldalra. Két oldallal minden szükséges üzenetet megjeleníthetsz. amely három változót vesz át egy adatbázisból (vagy egy formból vagy egy URL-ről. // lots of code to generate the new file header("Content-Type: rewind($file). Mindez megoldható. $type = "image/jpeg". hogyan tudod megjeleníteni a friss tartalmat az fpassthru()-utasítás révén. Hozzáadhatunk egy algoritmust. 4 Képek biztonságos megjelenítése Vannak helyzetek. $file = fopen($directory . ahogy közeledsz a maximális memória-mérethez. Ez azt jelenti. vagy akárhonnan. akkor létrehozza. amint azt a következő megoldásban bemutatjuk. 248 . A középső részben a kód létrehozza az új fájlformátumot. de nem akarod a webszerver standard biztonsági megoldását használni. amit a következő Gyors megoldásokban ismertetünk. . meddig tudsz elmenni (közben figyeld. A rewind()-parancs visszaállítja a fájl pointerét a fájl elejére. hogy nem küldhetünk hibafelismerő üzeneteket a képernyőre. Sname. hogy tetszőleges tartalmat nyújts a látogatóknak. mert blokkolnák a fejlécet. $type). hogy a tesztfájl létrehozása után el kell küldeni egy fejlécet. akkor azonnal láthatod az outputot a böngészőn. mikor egy képet vagy egyéb titkos információt csak egy felhasználónak szeretnél megmutatni. és a második oldalon a readfileQ-paranccsal jelenítheted meg a tesztfájlt. ami kényelmes a teszt számára). Szokatlan formátumok megjelenítése Ha új típusú tartalommal kísérletezel.7. ami csak akkor küldi el a fejlécet és a tesztfájlt. Az egyetlen szépséghiba. akik megkésve adják hozzá az új MIME-típusokat a konfigurációs fájlokhoz. Ebben a pél. és az fpassthruQ-parancs elküldi a fájlt a böngészőnek és bezárja a fájlt: $directory = "/tmp/".

hogy felismerjen egy fájltípust. ezáltal teljesen általános fájlokat is megjeleníthetünk: <?php if(isset($image)) header ("Content-Type : image/jpeg") . amely átveszi a kép nevét és megjeleníti a képet. és egy sessionrekord egyik mezőjében átadni a fájlnevet. és kereskedelmi megoldásoknál egy árat is hozzárendelhetsz. Képinformáció kiíratása 385 Ezt a technikát bármilyen fájlra alkalmazhatjuk.ti Gyors megoldások Először szükséged lesz egy oldalra. A végfelhasználó nem férhet hozzá a sessionrekordhoz. vagy elküldjön egy fájlt. olyan fájltípust is elküldhetsz. A readfile() argumentumában bármilyen fájlhivatkozás szerepelhet. Mivel a fájltípus az adatbázisban van eltárolva és dinamikusan küldöd el. fejezet alapján.html?image=roo\"" . de a sessionrekorddal szintén továbbítható. $image •jpg") A kép fejlécekkel együtt jelenik meg egy oldalon. hogy ne a megfelelő fájlt küldje el. Mikor egy különleges képet (vagy bármilyen egyéb fájlt) helyezel el egy oldalon. A tesztelés megkönnyítése érékében a példában a fájl nevét egy nem biztonságos URL-lekérdezés paraméteréből veszi át. a szélességét (width) és egy alt-paramétert. A tartalom típusát el kell küldeni a HTTP-fejlécrekordban.readfile("i:/usr/home/petermoulding/secure/" . Mikor lekérdezed a leírást és az árat. Ahhoz hogy jól formázott HTML-t kapjunk. de átadható a sessionrekorddal. és itt kézzel kell beállítani. és mindezt a sessionrekordban tárolod a megjelenítendő oldal számára: print("<img src=\". mint a következő kódban látható. A teszteléshez a kép nevét egy URL-lekérdezés image=roo-paramétereként adjuk át. de egy működő honlap esetén érdemes volna sessionöket beállítani a 19. formázással. URL-ek vagy akár FTPhivatkozások is. a fájl típusa nem fog megjelenni a böngészőben a böngésző adatlekérésének következményeként. 249 . nem veheti rá arra./readfile. A következő példakód pontosan ezt teszi a rendkívül egyszerű readfileQ-utasítás révén. így nem cselezheti ki a rendszert. valószínűleg létrehozol egy adatbázisbejegyzést. amely a fájl leírását tartalmazza. " width=\"280\" height=\"250\" border=\"0\" alt=\"\">" ). mikor nem kellene. amelynek a továbbítására nincs konfigurálva a webszerver. a méretet és az alt-információt is visszanyered. a méretet és az alt-információt ezen a szinten érdemes hozzáadni. Ha a webszerver nem úgy lett konfigurálva. az <img> tag-nek be kell állítani a magasságát (height). A fájl típusa szerepel a kódban. és csak egyetlen HTML-tagre van szükség a kép megjelenítéséhez. de a biztonságos rendszerben ez egysession rekordon keresztül történne.

Még tovább mehetsz. ha olyan oldalakat alkalmazol. ezáltal elérheted a köznyelvben paranoiásnak nevezett szintet.7. amelyek egy tűzfal mögött elhelyezett szerverről veszik a fájlokat. fejezet Környezet A webszerver által nem ismert fájltípusok és a rajta nem hozzáférhető helyen tárolt fájlok által kínált dupla biztonsági szint meghaladja számos nagy weblap biztonsági szintjét. 250 .

fejezet Fájlok Gyors megoldások Könyvtárak listázása Közös kód Az is_dir() megközelítés Afiletype() megközelítés A get_directory_file() megközelítés Formázott fájllista Egyéb könyvtárfüggvények Könyvtárak létrehozása és törlése Fájlok listázása az attribútumokkal együtt Altalános kód A get_directory_file() kiterjesztése Formázott fájllista További attribútumok Lemezterület-kimutatás Altalános kód A get_directory_file() kiterjesztése Üres lemezterület Fájllista és elfoglalt lemezterület A könyvtárak által elfoglalt lemezterület kiíratása A legnagyobb könyvtárak által elfoglalt lemezterület kiíratása A legnagyobb fájlok által elfoglalt lemezterület kiíratása Képfájlok attribútumainak kiíratása Képinformációk kigyűjtése Képinformációk megjelenítése Bármilyen típusú adat megjelenítése Altalános kód Szövegfájl megjelenítése HTML-fájl megjelenítése Bármilyen típusú fájl megjelenítése Üres fájlok létrehozása Fájlok feltöltése CRC-számolás fájlokra oldal: 256 256 256 257 258 259 260 262 263 263 263 265 266 267 267 267 268 270 272 273 274 275 276 277 278 278 279 280 281 283 284 286 .8.

az mkdirQ új könyvtárat hoz létre. A fájlok számtalan formátumban és funkciókban fordulnak elő a különböző operációs rendszerekben. valamint az egyéb fejezetek-í i hez (például a 19. hogy az adott fájlhoz milyen alkalmazást társítsanak. A fájlattribútumoknak két szintje létezik. néhány levelező program gondolkodás nélkül futtatni is fogja azt. 252 . jelen fejezet tesztoldalai a /phpblackbook/files könyvtárban vannak. így az operációs rendszereknek.8. de nem minden fájl tartalmaz megjeleníthető grafikát. a realpath() a relatív könyvtárlinkeket abszolút elérési úttá változtatja. fejezet tesztoldalainak indexére mutató URL a /phpblackbook/ files/index. illetve az alkalmazásoknak el kell tudniuk igazodni abban. és a is_dir() fájltípustesztelő függvénnyel segíti a könyvárakkal való munkádat. Ezen a könyvtáron belül jelen könyv tesztoldalai a /phpblackbook könyvtárban vannak (az Apache szerint). Könyvtárak A PHP az opendir(). a PHP-fájfüggvényeknek nyújtott elérési út pedig az i:/petermoulding/web/root/phpblackbook/files. ezen fejezet tesztoldali és fájljai pedig a phpblackbook /files könyvtárában. egyik az operációs rendszeren. A PHP dirname() függvényével elérési utakból fájlokba emelhetsz át könyvtárneveket. Más operációs rendszerek más módszert alkalmaznak annak eldöntésére. Minden fájlt lehet mérettel jellemezni. PHP-nézet A PHP közvetlenül az operációs rendszer fájlhozzáférési rutinjaival áll kapcsolatban. az összes fájltípusra érvényes attribútumokkal. de bármely rendszer hibázhat. mint a dirname() és más függvények együttesen.html. A pathinfoQ ugyanazt az információt nyújtja. az rmdir() pedig törli a könyvtárat. mint a futtatható fájloknak. readdirQ és closedirQ könyvtárkezelő függvényekkel. Windows alatt ez a fájlkiterjesztés. Ezeket a hibákat használják ki az e-mail-en keresztül terjedő vírusok. fejezetben leírt session-ök) szükséges fájlműveletekalapjait tartalmazza. A 8. fejezet Fájlok Áttekintés Az adattárolás alapegysége minden operációs rendszerben a fájl.petermoulding. a fájlokkal való műveletekhez szükséges PHP-kódokkal foglalkozik. másik az alkalmazáson belüL Jelen fejezet az alapvető fájl típus okkal.com honlapja az i:/petermoulding/web/root könyvtárban van. Apache-nézet Amikor az Apache vagy a használt webszerver megszámlálja a weboldalak könyvtárait. A teszthonlapom az i:/petermoulding/web/root könyvtárban van. hogy melyik alkalmazás tudja az adott fájlt futtatni. így a könyvtárakat a szerver a fájlstruktúra elejétől számlálja. Ha egy vírusnak olyan neve van. azaz az utolsó pont után lévő néhány karakter alapján dől el. a webszerver a honlapod alapkönyvtárától számlál. Az én tesztgépem test.

A is_readable() segítségével megállapíthatod. Először minden egyes függvényt tesztelj le.a Gyors megoldások „Adatok megjelenítése" című részében bemutatott speciális hexadecimális megjelenítő használatával megjelenítheted a fájl egy részét. és ellenőrizd. hogy írható-e. Más esetekben az operációs rendszernek külön szabályai vannak. hogy olvasható-e. amelyekben a fájltípust a fájlok végződéséből állapítod meg. Fájlok létrehozása és megváltoztatása Ha egy fájl szöveg vagy valamilyen nyers bináris formátum. hogy a fájl normál fájl (is_file()). a legmegfelelőbb mechanizmussal megjelenítheted. írhatsz ugyan bináris írásmódot használó saját rutinokat JPEG. de akkor állandóan változtat gatnod kell a kódot. hogy azok Unix alatt működnek a legjobban. Fájlok megjelenítése Ha már ismered egy fájl típusát. hiszen a gyakran használt PHP-fájlfüggvények mind elfogadnak elérési utat.Áttekintés Nézetek váltása A jelenleg használt könyvtárat a getcwd()-vel találhatod meg. és megváltoztatta. és ha valamelyik váratlan eredményt ad. az is_writeable()-val azt. hogy a függvény érvényes eredményt adott-e. Fájltípusok Vannak operációs rendszerek. amellyel megállapíthatod.vagy PNG-fájlok léthozására. amelyek bármely fájlra alkalmazhatóak. hogy a fájl vajon egy HTTP POST fájlfeltöltés eredménye-e. ha olyan rendszerfüggvényt használsz egy folyamat futásához. amely az elérési út paramétert nem ismeri. mert előfordulhat. így elég csak az elérési úttal dolgozni. a PHP-fájlfüggvényekkel létrehozhatod vagy megváltoztathatod. Minden operációs rendszernek megvan a saját mechanizmusa a fájl használatának megállapítására. A legtöbb PHP-függvénnyel eredetileg Unix-függvényeket hívtak be. minden egyes PHP-frissítésnél teszteld azt újra. Sokkal valószínűbb. A PHP-ban van olyan függvény. hogy az egyedi és a szabványostól eltérő esetekben is megfeleljen. Nem tudom. ahogy a függvény az operációs rendszeredtől kapott információkat értelmezi. Ebben a fejezetben olyan fájlműveletekről lesz szó. és a te operációs rendszeredre nem fordíthatóak le. és különböző PHP-függvényekkel megnyitva azokat. vagy a hamis eredménnyel hibát jelez. azonban bármilyen más formátumú állomány esetén jobb inkább a fájl típusának megfelelő függvényt használni. könyvtár (is_dir()). hogy valaki belemélyedt a kódba. hogy ezt ténylegesen hányszor fogod majd megtenni. így a képek és adatbázisok egyedi követelményeinek megfelelő függvényeket másik fejezetekben tárgyalom. az is_uploaded_fileQ-val pedig azt. A különleges fájlok. fájlra mutató Unix-típusú link (is_link()) vagy futtatható fájl (is_executable()). fejezetben található függvényekkel ellenőrizheted az image-fájlokat is. hogy könyvtárat akkor váltasz. Ne felejtsd el a @ jelet használni a hibák elrejtéséhez. és . A l i . például a JPEG fájlok .jpeg vagy -jpg végződésűek. 253 .ha kétségeid vannak . további speciális fájlokat ellenőrizhetsz. így lehet. és a chdir()-rel válthatsz a könyvtárak között.

olyan könyvtárban van. és a feltöltött fájl a php. amikor megnyitod. mint egy pizzának a Sydney User Group (PHPSydney. így saját nevet adhatsz neki. de mi történik. ha bezárod. Fájtok feltöltése A HTTP-vel végezhető fájlfeköltés. 254 .8. levelekhez csatolt állományok vagy bármilyen egyéb egyedi fájlformátum esetén: mindig az adott fájltípushoz készített szoftverrel hozd létre és változtasd a fájlokat. hogy a pontos eredményt megtekintsd.0. hogy azonnal törölheted vagy újból használhatod az ideiglenes nevet. Az egyetlen különbség a fájl élettartamában van. és pont úgy záródik be a fclose()-tól. Őszintén szólva a várható élettartama pont annyi.3-tól ezt a problémát az elhelyezési fájl létrehozásával oldja meg. Mivel az eredményt a webszervered operációs rendszere határozza meg. hozz létre az operációs rendszerednek egy tesztoldalt. b) segítségével a-ból b-be másolhatsz egy fájlt. különben a fájl elvész. hogy milyen biztonsági előírásokat kell betartani egy áthelyezett vagy másolt fájl esetén. A tempnam() az ideiglenes fájl nevét adja eredményül. az unlink(a) pedig törli a fájlt. Ideiglenes fájlok Az ideiglenes fájl {temporary) egy egyedi típusú fájl. melyet soha nem kell látnod. mím az fopen(). amelyről csak az operációs rendszernek kell tudnia. A feltöltés méretét az upload_max_filesize specifikációban lehet korlátozni. ellenőrzésképpen le kell a fájlt másolnia és állandó tárhelyre áthelyezni. pontosan úgy ad vissza egy állományazonosítót. Csak akkor létezik.ini-ben meghatározott ideiglenes könyvtárba kerül. ami azt jelenti. mint az fopen(). Fájlok másolása A copy(tí.com) ülésén. mert soha nem kell a nevével vagy a törlésével foglalkoznod. vagy ami logikusabb. fejezetben bemutatott függvények használatával. A copy() és az unlink() együttesen lehetővé teszi a fájlok áthelyezését (mivel sajnos a PHPben nincsen move()-függvény). mint az fopen(). írást és más fájlkezelő műveletet. ha két szknpt verseng ugyanazért az ideiglenes névért? A PHP a 4. íme a php. A tmpfile() pontosan úgy nyit meg egy ideiglenes fájlt. Ugyanúgy végezhetsz vele PHP-fájlbeoivasást. Végtelen a vita azzal kapcsolatosan. az elejétől használhatod a tmpfile()-t. fejezet Fájlok Ezért hát sokkal jobban jársz a 11. A PHP legutolsó verziójában található move_uploaded_file()-függvénnyel áthelyezheted a feltöltött fájlt. Ugyanez igaz az adatbázisok. amelyre a Gyors megoldások „Fájlok feltöltése" című részben találsz példát. és olyan neve van. Flash-fá)lok.ini erre vonatkozó része: file uploads = On upload_tmp_dir = t:\upload upload__max_f ilesize = 8M Mikor a szkripted megkapja a fájlfeltöltési információt. törlődik.

ami gyakorlatilag azt jelenti. Javaslom. Az umask() beállít egy alapértelmezett engedélyezési mód maszkot. (A logikai ÉS-t bitenként alkalmazzák. Engedélyezés/Jogosultságok Számos operációs rendszerben és fájlrendszerben a hozzáférés-kezelést leegyszerűsítheted a fájlok csoportokhoz való hozzárendelésével. közvetlen kapcsolatot jelentenek a Unix és Unix-féle operációs rendszerek C-függvényeihez. amellyel fájlok vagy könyvtárnevek listáját tömegesen tudod az egyik csoportból a másikba helyezni. amelyekben egyszerűen csak be kell pipálni. hogy milyen jogosultságokat akarsz adni. 255 . mint például a méret. mint a chgrp(). A chgrp() az egyik felhasználói csoportból egy másikba helyezi át a fájlt. vagy ezek az operációs rendszerek képesek lesznek a Unixot a PHP-val való kommunikációban felülmúlni. újra beolvasod. Ehhez a legfontosabb helyiértékre nullát kell tenned. Mivel a Unixnál nincsenek forráscsoportok. A PHP olyan biztonsági függvényei. majd az egyéni felhasználók csoportokba sorolásával. A chmod() segítségével PHP-ból a Unix chmod műveletét végrehajtva megváltoztathatod a fájlhoz való hozzáférést.) Az umask(OOl) a 0777-es engedélyezési módot 0766-ra konvertálja. hogy csak a fájl tulajdonosának van végrehajtási hozzáférése a fájlhoz. Ezen oldal kódja a listában vagy egy könyvtárban található összes fájlra alkalmazza a chgrp()-t. készíts egy olyan adminisztrációs oldalt. és az csak akkor fog működni. végre kell hajtanod az írást. A hozzám hasonló egyszerű embereknek jó néhányszor el kell olvasni egy Linux kézikönyvet ahhoz. Az operációs rendszertől függően a cache percekig vagy akár napokig is tárolja az eredményeket. mind pedig a felhasználói csoportok. és utána megpróbálod beolvasni a fájlattribútumokat. Ha írsz egy fájlhoz. hogyan működik a chmod(). és akkor eredményez 0-t. majd utána beolvasni a fájlattribútumokat. amely minden olyan engedélyezési sztringre vonatkozik. ha minden argumentum 1. majd azonnal az új fájlhosszt próbálja beolvasni. ha az argumentumok valamelyike 0. ha megfelelően magas szintű hozzáférésed van a fájlhoz. egy fájlcsoport megváltoztatása a chgrp()-t egyszerre egy fájlon használva unalmassá válhat. hogy megjegyezzék. Ezért én inkább maradok a GUI-alapú alkalmazásoknál. hogy oktálisnak értelmezze a módot. amely felfrissíti a fájlt. amely logikai ES-t (AND) használ új fájlokra. és akkor 1-et. és csak Unix vagy Linux alatt működnek. Talán hosszú távon a PHP-függvények is képessé válnak arra. A legkifinomultabb rendszerekben egyidejűleg vannak jelen mind az erőforrás-. lefuttatnod a clearstatcache()-t. hiszen mindezek a fájlattribútumok a cache-ben mentődnek el. és a lemez helyett onnan kerülnek beolvasásra. A chown() segítségével PHPból a Unix chown-utasítást végrehajtva megváltoztathatod a fájl tulajdonosát.Áttekintés Fájllista-cache A clearstatcache() olyan különleges függvény. amely általában túl hosszú a scriptnek. és olvasd el a chmod-ról szóló részt. Ha nem konyítasz a módértékekhez. fogj egy jó könyvet a Unixről vagy Linuxről. így nem tartalmazzák a hozzáférés-kezelés kifinomultabb pontjait. így az ilyen rendszerek által kínált hozzáférés-kezelés egy jól strukturált relációs adatbázishoz hasonlatos. amikor a fájlkönyvtárakat és az olyan fájlattribútumokat. hogy más operációs rendszereken is használják az ekvivalens függvényeket. amelyre akkor van szükséged.

Az ismétlés elkerülése érdekében az egyszer bemutatott kódot és függvényt nem ismétlem meg még egyszer. hogyan kell a könyvtár struktúrában a fájlokon és könyvtárakon lépkedni. $links_found = 0. $others_found = 0. és a fejezet tesztoldalai ezen belül a /phpblackbook/files könyvtárban vannak. hogy a fájlok egy tesztkönyvtárban vannak. ellenőrizve annak tartalmát. fejezet Fájlok Gyors megoldások Könyvtárak listázása Ez a megoldás azt mutatja meg. amelyet te állítasz be. mert azok az aktuális szülőkönyvtárra való hivatkozások: $directories_found = 0. amely bemutatja az opendirQ. majd a kód egy ciklussal végigmegy a könyvtáron. és a $path-változót arra használom. nem számítanak be. A . hogy az alapkönyvtár elérési útját tartalmazza. Az én tesztgépemen a test.8. valamint hogy ez a kód az alapja a következő Gyors megoldások némelyikének. és .") if (is__dir ($path 256 . $files_found = 0. is_file() és is_link() fájltípustesztelő függvényeket. Közös kód Jelen fejezet összes gyors megoldásában feltételezem. megszámolja a talált könyvtárakat és fájlokat. readdir() és closedir() könyvtárkezelőés az is_dir(). illetve függvényre hivatkozom. így az operációs rendszer és a PHPfájlfüggvények számára az összes fájl az i:/petermoulding/web/root/phpblackbook/files címen érhető el: $path = "i:/petermoulding/web/root/phpblackbook/files".com teszthonlap a i:/petermoulding/web/root könytárban található. a következő utasítással egy könyvtárat nyitunk meg. Az első sorokban számlálókat hozunk létre. hogyan kell a kódot különböző célokra megváltoztatni. Ez a legegyszerűbb kód.. hanem az adott megoldásnál a korábban bemutatott kódra. while($file_name = readdir{$path_id)) if ($filename and $filename != $f ilename) .petermoulding. $path_id = opendir($path). majd megjeleníti az összefoglalást. Az is_dir() megközelítés A következő kód a Spath-ban elnevezett könyvtárból olvassa be a könyvtárstruktúrát.

hogy az egyes fájltípusokon ugyanazt a műveletet hajtsuk végre. $links found). sztring a dir. az előző kóddal különböző műveletet hajthattunk végre minden fájltípuson az egyes if()-utasításokon belül: $path_id = opendir($path). Ez alkalmassá teszi arra. Habár ez a kód ideális arra. $files_found). amely sztringként adja vissza a fájl típusát. hogy a fájltípusokat egy asszociatív tömbben tároljuk. $fílename) $file name)) closedir($path_id). Ezután egy ciklussal megjeleníthetjük a talált fájltípusok listáját.." and $file_name != ". "/" $files_found++. } elseif(is_file<$path .1 257 . de ezek a változtatások az PHP-t először használó embereket összezavarhatják: Directories found: 2 Files found: 3 Links found: 0 Others found: 0 A filetype() megközelítés A következő példában az is_dir() és az ehhez hasonló függvényeket az egyszerű filetype()függvénnyel helyettesítettem. fiié vagy link egyikét tartalmazza. Lent látható az eredmény. "/" . Remélem. while($file_name = readdir($path_id)) { if($file_name != ". vadonatúj fájltípusokat tartalmaznak. $others_found). nem lesznek Others-típusok. amely a filetype() eredményeként megjelenő érték alapján kulcsindexelt. print("<br>Directories found: " . mint például a BeOS. else $others found++. amelyekben ezt a kódot használod. azokban a rendszerekben. } elseif(is_link($path .") { $file_type = filetype($path . valamint a négy változó tömbbel való helyettesítésével kisebbé és szorosabbá teheted. Csak azért hagytam az othert benne. "/" í $links_found++. print("<br>Links found: " . mert az olyan operációs rendszerek. print("<br>Files found: " . $file_name). 4. $directories_found). print("<br>Others found: " . A kódot a többszörös if()-utasítások switch()-csel.Gyors megoldások $directories_found++.

hogy a kód a kiválasztott könyvtár alkönyvtáraiban is végigmenjen a fájlokon. hogy csupán könyvtár. A perjel eltávolítása olvashatóbbá teszi a könyvtár elérési útját. nem hozza. fejezetben leírt képattribútumot. fejezet Fájlok if (!isset($found[$file t y p e ] ) ) { $found[$file type] = 0. amely már leíróbb jellegű neveket tartalmaz. rájössz. $k . illetve bizonyos függvényekben így kell az elérési utat megjeleníteni. Amikor a get_directory_file() úgy látja. így a kód utolsó sorai egy üres $found-változót hoznak létre. Néhány későbbi példában arra használom ezt a függvényt. Ahogy a kód végigmegy az alkönyvtárakon. $v) = each ($found) ) { print("<br>Found " . Vagyis olyan. Ha végigolvasod a 3. Gyakrabban fordul elő azonban. ezért a kód első része eltávolítja az utolsó / jelet az elérési útból. Az egyetlen eredményként megjelenő fájlattribútum . hogy egy fájl a könyvtár. $v) Alább látható a kód eredménye. létre a $found-ot. amikor a táblázatban van tárolva. amikor azt könyvtárnévként használjuk. hogyan használhatod ezeket a rövid neveket indexként egy olyan tömbhöz. fejezet tömbös példáit. és az array_merge() függvény összefésüli az alkönyvtárból érkező tömböt a $found elsődleges tömbbel.8. ": " . így a fájlméretet vagy bármely. így a következő kód a korlátozás nélküli. nyilvános alkalmazásban viszont már nem. mely a fájlattribútumokat találja meg. Van egy kis különbség e között és a között a példa között. amely nem túl sokatmondó. egyre hosszabb és hosszabb elérési utakat hoz létre. többszintű feldolgozásra mutat példát. a 11. majd az e függvény által létrehozott tömb elemei alapján gyűjtsön további fájlattribútumokat.a kód pontosságának bizonyítására . de bármilyen szükséges fájlattribútumot hozzáadhatsz.a fájltípus. closedir($path id) . amit egy adminisztrációs vezérlőpanelben szívesen használnál. reset($found). } $found[$file_type]++. Found file: 5 Found dir: 2 A get_directory_file() megközelítés Az előző példák egy könyvtár egyetlen szintjén mentek végig. hogy a return utasítással visszatérjen: 258 . az alkönyvtár feldolgozására a get_directory_file() behívja önmagát. amely függvény a könyvtár elérési útját kéri. hogy azt szeretnéd. while (Üst ($k. Ha a függvény üresnek találja a könyvtárat. A következő kódrész azután visszafűzi a perjelet. amikor a fájlnév hozzáadódik az elérési úthoz. Az előző megoldások könyvtárolvasó kódja egy get_directory_file() nevű függvénybe volt beágyazva.és fájlneveket gyűjtsön.

gif [Type dir (file i ■■rtr file~ file [dir [file Ifile |file {file ■ 8. /files/images File images index.") f i ~ * $file_type = filetype($path . $found[$path][$file_name] = $file_type. a második a fájlokon fut végig: Dtrectory i: /petennouldinsAveb/root/phpblackbook/files/ i:/petemioulding/web/root/phpblackbook/files/ i:/petennoulding/web/root/phpblackbook/files/ !i:/petermoulding/web/root/phpblackbook/ílles/ ir/petermoulding'web/root/phpblackbook/files/ i:. az első a könyvtárakon. végül az ábrán látható táblázatban megjeleníti az eredményt. html listingdirectories. if ( !isset($found)) { $found = arrayO. $file_name). majd a könyvtár és fájl szerint kulcsindexelt $found-tömböt kapja vissza. "/" . két whileQ-ciklus van. Formázott fájllista A hátralévő' kódpélda a get_directory_file()-függvény eredményét veszi.html l test london. és a 8.Gyors megoldások function get_directory_file(Spath) { $path_id = opendir($path).i:/petermouldingweb/root'phpblackbook.jpg php4-small. petennouldingí web/root phpblackbooky'files/images |i:/petermoulding/web/root/phpblackbook/files/images i:/petermoulding\veb/root/phpblackbook/files/images . $file_array).1 ábra Könyvtárak listája 259 . } return($found)." and $file name != ".. A kód első sora meghívja a get_directory_file()-t a gyökérkönyvtárból kiinduló elérési úttal. if($file type == "dir"} < $file_array = get_directory_file($path .gif santaclara. closedir($path_id).gif peters.1 ábrán látható formázott fájllistát jeleníti meg. "/" . while($file_name = readdir($path_id)) { I if($file name != ". $file_name). Mivel a Sfound kétszintű indexeléssel rendelkezik.htm listingfiles. $found = array_merge($found.

Az eredmény: Dirname: i:/petermoulding/web/root/phpblackbook/files A következő kód print("<br>Basename: eredménye: Basename: index.</tdx/tr>") . de a könyvtárlistában nem szerepel könyvtárként. El kell döntened. "</tdx/tr>") . mert a test-nek nincsen tartalma. Van jónéhány formázási lehetőséged: végigmehetsz a könyvtárakon és létrehozhatsz egy csak alkönyvtárakból álló listát. Egyéb könyvtárfüggvények A dirnameQ-függvénybe a fájl elérési útját írva az elérési út könyvtárrészét kapjuk eredményül. "</tdxtd>" . "</td><td>" . "/index. $d . "/index. $d . "<td><em>File</em></td><td><em>Type</em></tdx/tr>") . A $path használó teszt pontosan úgy működik. nincsenek fájljai vagy alkönyvtárai. míg a basename() a maradékot. "<td>&nbsp. $f . vagy kiemelheted az egyes alkönyvtárak elején álló első könyvtárak nevét. Bármilyen könyvtárak megtalálására megvannak az eszközeid. Listázhatod úgy a könyvtárakat mint a könyvtárkulcsban lévő bejegyzések összességét. $dv) = each ($found) ) { if(is_array($dv)) {~ while (üst <$f. ahogy azt várnád: print("<br>Dirname: " . "</td> . print("<table bordér=\"3\"><tr><td><em>Directory</em></td>" . Az egyetlen szokatlan elem a test alkönyvtár. A következő három gyors példa ezen függvények legjobb és legrosszabb tulajdonságait mutatja be. else { print ("<trxtd>" .8. while (üst ($d. amelyet a főkönyvtár fájllistája tartalmaz. " . 260 .html basename($path . a 9. és a következő kóddal . print("</table>").a fájlokra jellemző további attribútumokhoz is hozzáférsz.a keresést elősegítendő . egy olyan könyvtár. $fv) = each($dv)) { print ("<trxtd>" . reset($found) . fejezetben bemutatott könyvtárkereső űrlapot is használhatod. vagy listázhatod az állományokat egy könyvtártípussal is.html")). a fájlnevet eredményezi. dirname(Spath .html") ) . $fv . hogyan kezeled az üres alkönyvtárakat. $dv . fejezet Fájlok $found = get_directory_file($path).

"/index. $v) = each($info)) { print("<br>Pathinfo: k: " . mint fájl: print("<br>Dirname: ". holott a b lehet könyvtár.noaa.ncdc. mint az előző részben.dll?wwAW~MP~PUB Pathinfo: k: extension. hogy a b-t fájlnévként értelmezi. Az eredmény: Dirname: /a.noaa.ncdc. Az eredmény ugyanaz a basename-re és dirname-re. A $path . v: " . dirname("/a/b/" ) . Az első példa ugyanaz.Gyors megoldások Az /a/b-vel lefolytatott teszt azt mutatja. v: dll?wwAW~MP~PUB 261 .html Pathinfo: k: extension. $info = pathinfo("http://www4. mint a dirname() és a basename() összekapcsolva. illetve megjelenik a fájl kiterjesztése is: Pathinfo: k: dirname. és az URL-ekben a b valószínűleg inkább könyvtár. mint az előző rész első példája. basename: " " . while (üst ($k. v: /a k: basename. Ennek eredménye: Pathinfo: Pathinfo: k: dirname. nem sikerül a lekérdező sztringet kezelnie: . de mint látjuk.gov/cgi-win/wwcgi. Az eredmény: Dirname: /a.html"-t egy whileQ -ciklus követi. v: b A harmadik teszt megpróbál egy URL-t összetevőire bontani.gov/cgi-win Pathinfo: k: basename.dll?wwAW~MP~PUB"). . basename: " " . $v ) . természetesen itt nincsen kiterjesztés: $info = pathinfo("/a/b"). "/index. Próbáld ki a honlapodon ezt a tesztet a PHP-val: print("<br>Dirname: ". hogy az eredményül kapott tömböt megjelenítse: $info = pathinfo($path . ".html"). dirname("/a/b") . v: http://www4.és fájlnév is. basename: b A harmadik /a/b/-teszt meglepő. Az eredmény így néz ki: Pathinfo: k: dirname. v: html A második példa az /a/b ugyanolyan értelmezését adja. v: wwcgi. mert itt a b könyvtár helyett fájl. basename("/a/b") ) . v: index. v: i:/petermoulding/web/root/phpblackbook/files Pathinfo: k: basename. basename("/a/b/" ) ) . basename: b A pathinfoQ ugyanazt az információt adja. $k . .

5-ben az mkdirQ igényli a második paramétert. mert nem tartalmazta az opcionális második paramétert.0. hiba esetén hamis eredményt adva vissza. a ]ogosultsági beállítást. törli a könyvtárat. Ezért a második paramétert vagy változóként kell megadnod. hiba esetén hamis eredményt adva vissza. sikeres művelet esetén igaz. íme egy egyszerű példa a két függvényre: $new = ".) számára./anothertest". amely alkalmas a PHP-függvényekben való használatra: print("<br>Realpath: " . aminek 262 . if /^ print("<br>:-) Removed directory: " . Az rmdir() könyvtárnevet vagy teljes elérési utat fogad el. de amennyire én tudom.( Failed to created directory: . fejezet Fájlok A realpath() a relatív könyvtárlinket abszolút elérési úttá konvertálja. a ./index. Az anothertest Figyeld meg. } else { print("<br>: ./anothertest {Figyelem: Rossz paraméter megadása az mkdir() könyvtár létrehozása sikertelen. a Unix-stílusú jogosultsági beállításokat nem fordítja le Windows NT-s megfelelőjükre. Windows NT alatt a PHP 4. amelyet a Unixszal használnak. Az eredmény: Realpath: i:\petermoulding\web\root\phpblackbook\files\index. A következő' példa egy oldallekérésből származó relatív fájlnevet. $new). $new). realpath(". Ha az effajta kódot webszervereken való éles használat céljából írod.html Könyvtárak létrehozása és törlése Az mkdir() könyvtárnevet vagy teljes elérési utat fogad el.( Failed to created directory: " . új könyvtárat hoz létre. if(mkdir($new)) print("<br>:-) (rmdir() ) Created directory: " .html")). Az eredmény a következő: Warning: Wrong paraméter count for mkdir() : . hogy az bármely PHP-változatta használható legyen.html-et abszolút fájlnévvé konvertálja. de egyéb operációs rendszerekben figyelmen kívül hagynak. $new). hogy az mkdir() nem működött./index. $new). amelyet akkor használsz.8. gondoskodnod kell arról. } else { print("<br>:-( Failed to remove directory: " . sikeres művelet esetén igaz. amikor egy URL-ből származó fájlnevet egy PHP-függvénybe akarsz beírni.

vagy pedig egyetlen közös beágyazott elemként kell használnod. szükséged lesz egy az Apache-ról szóló jó könyvre. Kevés felhasználó esetén a leggyorsabb megoldás az Apache . Ez a megoldás „Könyvtárak listázása" című előző rész kódján alapul. Ha a honlapodhoz való hozzáférés biztonságos. biztonsági igazolást és SSL-t telepítesz. honnan akarod a kimutatást kezdeni. A legjobb megoldás az. Ez problémákat vet fel ha olyan weboldalt próbálsz írni. A következő példa a 0777 általános beállítást tartalmazza. LDAP) vagy adatbázisban (pl. Fájlok listázása az attribútumokkal együtt Ez a megoldás azt mutatja meg. az összes megfelelő Apache biztonsági opciót alkalmazod felhasználói információk könyvtárban (pl. amelyet az előzőhöz képest megváltoztattam: if(mkdir(Snew. Annak érdekében. Általános kód Az első lépés annak eldöntése./anothertest .és . ese- 263 . legyen a $path-ban lévő kiindulási pont egy kevés fájlt tartalmazó alkönyvtár. és egy az operációs rendszer adminisztrációjáról szól. hogy könyvtárakat hozzanak létre és töröljenek. Egy a 9. Inc. The Coriolis Group.htpassword-fájljainak használata. MySQL) való tárolásnál. amely az új felhasználók számára új saját könyvtárat hoz létre. mint a Apache Server for Windows Little Black Book (Greg Holdén. majd az adminisztrációs oldaladon a bejelentkezéshez felhasználói nevet és jelszót kérsz. amely bárki részére hozzáférést biztosít.). 0 7 7 7 ) ) Az eredmény: :-) Created directory: :-) Removed directory: .htaccess. így nemigen van arra jogosultságuk. hogyan fuss egy könyvtárstruktúrában végig a fájlokon a fájlattribútumok kiíratásával. ami a honlap összes szkriptjében megtalálható. fejezetben megmutatott űrlap segítségével megadhatod a kiindulási könyvtárnevet: $path = "i:/petermoulding/web/root/phpblackbook/files" . mint a Linux System Administration Black Book (Dee-Ann LeBlanc. hogy mind a feldolgozás idejét.6 részben használt get_directory_file()-függvényt kiterjesztjük. Csak azt az egyetlen kódsort mutatom. ami az összes operációs rendszerrel működni fog. lazíthatsz a fájlhozzáférési engedélyek rendszerén. Inc. i A get_directory_file() kiterjesztése Az e\Ő7. Bármelyik rendszert választo~d~is. The Coriolis Group./anothertest Mindkettő nobody felhasználóként fut a webszerveren (hacsak a szerver alapértelmezett beállításait nem változtatták meg). mind a kimutatás méretét kordában tartsuk. hogy több.). és megadható neki egy olyan alapértelmezett beállítás.Gyors megoldások értéke a szknpt elején beállítható. ha a PHP-t Apache-modulként futtatod.

"/ $file["permissions"] = fileperms($path $file["size"] = filesize($path . $file["inode"] = fileinode($path .8. filegroup()és fileinode()-függvények ezeket az információkat Linux alatt nyújtják. a fllectime() pedig azt. . hogy mikor volt a fájlhoz történő legutolsó hozzáférés (feltéve. $file["modified"] = filemtime($path . fejezet Fájlok tünkben a hagyományos PHP-függvényekkel elérhető összes fájlattribútumot adja eredményül. if($file["type"] == "dir") $file_array = get_directory_file($path. $file_jxame) . if ( !isset($found)) í $found = array(). "/" $found[$path][$file_namel = $file. A fileowner()-. $file name). else { $file["accessed"] = fileatime($path $file ["changed"] = filectime($path $file["group"] = filegroup($path . $file name). $file name!. A filemtime() azt mutatja meg. $file name). $file_name). . Ez tartalmazza a fileatime()-függvényt. $file name). ~'"if (isset ($found) ) $found = array mérge($found. else $found = $file array. . $file array). $file name). "/" . $file["owner"] = fileowner(Spath . "/" . A megváltoztatott szakaszt kiemeltem. /" . $file name). "/" . viszont Windows NT alatt nem adják eredményül a megfelelő Windows NT fájlattribútumokat: function get_directory_file($path) { $path__id = opendir ($path) . hogy mikor változott meg legutoljára a fájl mérete. hogy mikor frissítették legutoljára a fájl valamelyik rekordját. "/" . while( $ f ile_name = readdir($path_id)) if ( $ f ilename != and $filename = ! $file["type"] = filetype($path . "/" . $file name). /" . "/" . hogy az operációs rendszer és a fájlrendszer lehetővé teszi ezt). closedir ($path_id)-. amely azt mutatja meg. fileperms()-. } return($found). 264 .

jpg |i:/petennoulding/web/root/phpblackbook/files/images jphp4-small.és fájlnevek normál tag-ként jelennek meg.csupán a könyvtár . a $found-ból ciklussal táblázatba kiíratva a 8. majd az eredményül kapott tömbből. míg az utolsó a HTMLtáblázat tag-et zárja le.Gyors megoldások Formázott fájllista A következő kódrész a get_directory_file()-függvénnyel az összes könyvtárat és fájlnevet beolvasva. A könyvtár. "<td><em>Group</em></td><td><em>Inode</emx/td>" . " " ) .abban a szintén valószínűtlen esetben. "<tdXem>File</emX/tdxtdXem>Type</emx/td>" . ha a fájlbejegyzés nem egy attribútumokból álló tömb . print ("<table border=\"3\"XtrXtdXem>Directory</emX/td>" .a könyvtárakat jeleníti meg. fájl nélküli könyvtárral néhányszor már igen: $found = get_directory_file($path.3 ábrán látható fájl. a dátumokat pedig a 2.html Ifile 12001-05-17 13:28:25 8. "<td><em>Accessed</emx/tdxtd><em>Changed</em></td>" . Az első printutasítás az oszlopfejlécet. 0 ! 0 0 .html ifile i:'petennoulding/web/root/phpblackbook/files/ listingfiles.2 és 8. a második while()-ciklus pedig a fájlok szintjén fut végig a könyvtárak tartalmán. I jl ti rectory ÍFile i:/petermoulding/web/root/phpblackbook/files/ima _____ ges london.gif i:/peteniioulding web/rootphpblackbook/files/ index. ha a könyvtárbejegyzés nem tartalmaz fájlbejegyzéseket . $ dv) = each ( $ f o un d) ) 265 .2 ábra Fájlok és attribútumaik listája.gif i:/petennouldingweb/rootphpblackbookyfiles/images peters. a második az egyező mezőket. fejezetben bemutatott dateQ-függvénnyel formáztam.és attribútumlistát eredményezi. "<td><em>Modif ied</em></td><td><em>Owner</emX/td>" . Owner\Permissions\Size ' 33206 33206 33206 33206 33206 33206 33206 21940! 6530 . ifile 120012001-0505-17 17 jfile 2001-05-17 13:29:42 11:27:12] Ifile 11:27:12 13:15:29i 2001-05-17 listingdirectories.html f | i :/petermoul dingv w eb/rBr6t7plq)bÍ ackb o okj'fi 1 es/ \Type\Ac cessed |file 12001-05-17 11:27:12] |fiíe" [2001-05-17 1Í727:12. a negyedik . a harmadik — abban a meglehetősen valószínűtlen esetben. Jóllehet még soha nem találkoztam attribútum nélküli fájllal.és fájlneveket. Arra az esetre.gif 1j i:7petermouÍding/web/roofphpb 1 ackbook/fiíes/images santaclara. ha a get_directory_iile()-függvény fájl nélküli könyvtárat vagy attribútum nélküli fájlt eredményezne. "<tdXem>Permissions</emx/tdxtdxem>Size</emx/td>" w h ile (ü s t ( $d . 4528 2543 Oi 483 j 5365 ] 5342 | ?__ 0 0 0 0 _ i 0 0 2000-09-11 21:16:41 0 2001-03-16 09:46:13 o 2001-01-30 04:36:00 0 2001-03-15 21:50:59|0 2001-05-17 12:22:29 0 2001-05-17 13:15:29 0 2001-05-17 13:28:25 0 8. A rész Changsd 2001-05-17 11:27:12 2001-05-1711:27:12 2001-05-17 11:27:12 2001-05-17 11:27:12 2001-05-17 07:14:39 2001-05-17 07:15:32 2001-05-17 12:03:44 Group Inode \Modified 0 0 0 . beraktam az if(is_array())-tesztet.3 ábra Fájlok és attribútumaik listája. B rész Az első while()-ciklus könyvtárszinten fut végig a $found-on.

" .</tdxtd>&nbsp. </tdxtd>&nbsp. További attribútumok A következőkben bemutatott függvényekkel bizonyos operációs rendszerekben további attribútumokhoz juthatsz.</tdxtd>&nbsp. $fv) = each($dv)) { if(is_array($fv)) $f print("<tr><td>" . $d . Figyeld meg. "<td>" . $fv["inode"] . "snbsp. $fv["modified"]) $fv["owner"] . $fv["accessed"]) . "<td>&nbsp. "<td>&nbsp. "</tdxtd>" . 266 .</tdxtd>&nbsp. "/" . $fv["group"] . $d . else { print ("<trxtd>" . . $file_name).különösen ami a futtatható fájlokat illeti. print("</table>"). "</td><td>&nbsp/</tdxtd>&nbsp. date("Y-m-d". date("Ym-d". $fv["modified"]) "Snbsp.</tdxtd>&nbsp. "<td>" . "/" $file_name).</tdx/tr>" ). $fv["accessed"]) . </tdxtd>&nbsp. $file_name). $file_name). "<td>&nbsp.</tdxtd>&nbsp. "<td>&nbsp. </tdxtd>Snbsp. </td>" . de nem szabad elfelejtened. date("H:i:s". "<td>" .</td>" . $fv["changed"]) >" . "</td>" . "/" .</tdxtd>&nbsp.</td><td>&nbsp. date("H:i:s".8. $file["readable"] = is_readable($path . hogy a is_writeable() az is_writable() aliasa: $file["executable"] = is_executable($path . $fv["type"] . "<td>&nbsp. "</td>" . $fv["permissións"] $fv["size"] . "</td>" . "/" . fejezet Fájlok i f ( i s array($dv)) { ~ whiledist < $ f . $file["writeable"] = is_writable($path .</td>" . date("H:i:s". $file["writeable"] = iswriteable($path . </td>" . "</td><td>" . $dv . else { print ("<trxtd>" . $fv["changed"]) . hogy az ezen függvények által adott attribútumok jelentése is operációs rendszerenként eltérő lehet . "<td>" . "<td>" date("Y-m-d"." .$fv . $f . "&nbsp. "</td><td> . $d .

én a rendszerpartíciót a c:-munkaállomásomon kezdem el. A Linux ext2 fájlrendszere a fájlokat a 8. Minden fájlrendszer többletráfordításokat használ fel a könyvtárakra. A PHP4-et nem nehéz új függvényekkel kibővíteni.000 helyett 8. valamint törölje ki a nem használt fájlokat. Vegyük a következő példát. nem örülnél neki. és lehet. hogy ne kelljen a függvény teljes leírását elolvasnod. A get_directory_file() kiterjesztése A példában az előzőkben használt get_directory_file()-függvényt bővítjük ki a fájlattribútumokkal. így a PHP által közölt eredmények csak útmutatók. így 1. az output pedig egy a könyvtár-. hogy hol kezdjen el írni a lemezre. Az itt bemutatott kóddal könnyen megtalálod a legnagyobb könyvtárakat és fájlokat. aki ért a C-hez. hogy mikor olvasták be a fájlt legutoljára.192.192 bájt (8KB) többszörösébe osztja ki.Gyors megoldások Most már bármilyen attribútumról készíthetsz kimutatást. a PHP-dben pedig megvan az ehhez szükséges függvény. hogy bizonyos fájlfüggvények nem működnek a hálózatban lévő meghajtókon: $path = "c:". Az operációs rendszered nyomon követ bizonyos fájlinformációkat. amelyeket az operációs rendszerednek vagy a fájlrendszerednek megfelelően ki kell igazítanod. hogy egy adott fájlt mikor használtak a legutolsó alkalommal. Azért. ha előre ellenőrződ a rendelkezésre álló lemezterületet. de még így is az 512 bájtos lemezszektor többszörösére kerekít fel. így bárki. a többletráfordítások miatt ezt a dátumot viszont csak néhány fájlrendszer jegyzi fel. Az operációs rendszered a fájlban lévő bájtok számáról is készít kimutatást. és csak azután kezdesz neki a feladatnak. ami nem feltétlenül egyezik meg a fájl által ténylegesen elfoglalt bájtok számával. de a jó fájlkezeléshez arra is szükség van. majd fájlnevekkel indexelt tömb lesz. így a Reiser vagy a NTFS kevesebb területet használ a kisebb fájlokra. hogy feljegyzi azt is. A változó allokációjú fájlrendszerek. mert a c: számtalan kisebb és nagyobb fájlt és könyvtárat tartalmaz. további függvényekkel további információt szerezhet be az operációs rendszertől. de nem árt tudni. Lemezterület-kimutatás Amikor egy bonyolult. Jobb. amely tar- 267 . és egyszerűen átalakíthatod. Ahogy az a $path-utasításban látható. ha már eltakarítottad a szemetet. hogy keresse meg a legrégebbi fájlt. ha az az utolsó pillanatban a lemezterület hiánya miatt fuccsolna be. hogy a fájlt mikor hozták létre. A kimutatáshoz egyszerűen adhatsz partíciótáblát és további meghajtókat. A legtöbb fájlrendszer feljegyzi. az input a $path. amennyiben az operációs rendszered biztosítja az információt. a biztonsági és naplózási információkra. erőforrás-igényes fájlt alkotsz.000 darab 200 bájtos fájl 8 a 200. Általános kód A kódnak csak egy kiindulási pontra van szüksége.000 (8MB) területet foglal el.

a &nbsp. a harmadik pedig a szabad lemezterületet mutatja.4 ábra néhány eredményt mutat. print(trow(tdl("diskfreespace(\"/\")") . "&nbsp. Ha a táblázat egy cellájában nincs input.920: e space for /mysql/bin |l.ez az eredmény persze nem más. amit szintén használni fogsz. A tdd() egy táblázat egy cellájában jeleníti meg a dátumot. a második ugyanezt az értéket number_format()-tal formázva. a tde() kiemelt szöveget jelenít meg a fejrész egy cellájában. a tdreQ egy jobbra igazított. tdn(diskfreespace("/mysql/bin")))) . a tdn() egy formázott és jobbra igazított számot jelenít meg egy cellában. kiemelt szöveget jelenít meg egy cellában. hogy a cella minden böngészőben helyesen jelenjen meg: function tdd($text="") if(strlen($text)) Stext = date("Y-m-d".920 8. a kód egy sortördelést letiltó karaktert szúr be. Stext) . A 8.277. fejezet Fájlok talmazza a fájlméreteket.277. hogy mennyi lemezterület van még a partíción. így biztosítva azt.-t.777. az utolsó beolvasás idejét. ha a dískfreespace() egy alkönyvtárba mutat . Üres lemezterület Mennyi szabad terület van még a partíción? A következő' példában a PHP diskfreespace()függvényének használatával megjelenítjük.8. a trow() pedig cellák sora köré töri be a táblázatsortag-eket. print (trow (tdl ("diskf reespace (\"A") ") . print("</table>"). a tdl() balra igazított szöveget jelenít meg a cellában.4 ábra Szabad lemezterület print("<table border=\"3\">"). amelyekre nincsen szükség. print(trow(tdl("diskfreespace(\"/mysql/bin\")") ." . tdn (diskf reespace ("/")))). mintha a főkönyvtárba mutatna. valamint további attribútumokat.777. hiszen a szabad lemezterület az egész partícióra vonatkozik: diskfreespace("/") (Disk free space for / '1277777920 1. Az első sor a partíció gyökérkönyvtárából visszakapott nyers számot mutatja.tdl(diskfreespace("/")))). el se 268 . ezt a példa későbbi részében még használjuk. Táblázatfüggvények A „Gyors megoldások" megjelenítő kódrészleteiben a HTML táblázattag-ek begépelésének csökkentésére használd az itt látható egyszerű formázófüggvényeket. date("H:i: s". $text).

". 269 i .!. "</em></td>"). "</td>"). else Stext = "Snbsp. :. ■■ ■ .". "</em></td>"). function tdn ($text="") if (strlen (Stext)) Stext = number_formát(Stext) . Stext . ■ Stext = "&nbsp. ^^^ : .". Stext . Stext . "</td>").. return("<td><em>" . í function tdl($text="") if{!strlen(Stext)) { Stext = "&nbsp. return("<tr>" .Gyors megoldások Stext = "&nbsp. return("<td align=\"right\">" .". Stext .". "</tr>"). return("<td>" . -•■ .-./ . return("<td>" . function trow($text="") if ( !strlen(Stext)} Stext = tdl("Snbsp. Stext . "</td>"). function tde($text="") if ( ! strlen (Stext) ) . Stext . return("<td align=\"right\"><em>" . function tdre($text="") if (! strlen (Stext) ) Stext = "&nbsp.").

(Egyszer egy projektemnél egyetlen könyvtárban 49. majd a korábban definiált cellaformázó függvényeket használva megjeleníti az eredménysorokat. felhőt és napfelkeltét ábrázoló kép volt. A $parts = explode('V".5 ábra Fájllista és a felhasznált lemezterület 270 . a második pedig a könyvtáron belül. $d)-vel kezdődő kódrész veszi a könyvtáron belül elfoglalt teljes területet. az előző megoldásban alkalmazott ciklushoz hasonlóan.COM 26. amely korlátozza a böngészőnek küldött sorok számát. a területet mindhárom könyvtár esetén hozzáadva a tömbhöz.408 'boot.792 c. A megjelenítési hosszúság korlátozása érdekében a középső printutasítások if($print_limit)-utasításokba vannak ágyazva.768 98. /usr/localés /usr/local/bin-könyvtárakat épít fel.exe 33.8.kezelhető blokkokban megjelenítve — onnan bogarászd ki.COM 'IO. Azután egy ciklussal végigfut az eredményül kapott tömbön. és a könyvtáron belül talált minden szinten hozzáadja a $size-tömbhöz.és bin-részekre bontja.DOS (COMMAND.253 c:cygwin/bin addftinfo.00C eget.768 c: INTDETECT. hogy az SQLszolgáltatások használatával az eredményeket . és a fájlok méretét egy külön kód adja hozzá a $directory_total-mezőhöz.xygwin/bin addr2line.SYS 8. az hatalmasra nőhet. majd /usr-. Az outputot elküldheted egyszerűen egy adatbázisba (a MySQL-t javaslom). local. Ez a mező az egyes ciklusok végén kiíratásra kerül.exe 337.SYS MSDOS.496 c:cygwin/bin aclocal 10. fejezet Fájlok Fájllista és elfoglalt lemezterület Ha a fájllistát egy magasabb szinten lévő vagy egy grafikai munkát tartalmazó könyvtáron futtatjuk le. Hivatkozás: Adatbázis létrehozása oldal: 160 A kód a get_directory_file()-függvényt használja az attribútumokat is tartalmazó fájllista és az elfoglalt lemezterület kigyűjtésére. a $found-on. Két whileQ-ciklus fut a $found-on végig: az első a könyvtárszinten (az első kulcs).5 ábrán látható): Directory c: c: c: \Me ____ J Size 289 512 32.816 c: íntldr 156.304 c: c: 32.ini BOOTSECT. megadva a könyvtár által elfoglalt teljes lemezterület nagyságát. A /usr/Iocal/bin/ könyvtárat például usr-.) A következő kód a $print_limit-ben beállított megjelenítési limitet tartalmaz. A $size-t későbbi listákrajiasználja (az eredmény a 8.

\ \ $parts = explodeC /". tdl($dv) . print ("</table>" ).Gyors megoldások ͧ3 $print_limit = 10.= $pv. while(list($d. $print_limit--. trow(tde("Directory") . td($fv))).= " / " . $found = get_directory_file($path) . else if($print_limit) print(trow(tdl($d) . $pv) = each ($parts)) { if (strlen ($acc d i r ) ) { $acc_dir . } 1 $acc_dir . tdl($f) . $directory_total += $fv["size"]. tde("Size")) ) . tdn($fv["size"] $print_limit--. tdl($f) . 271 . print("<table border=\"3\">" . $dv) = each($found)) if (is_array($dv)) $directory_total t 0. $d) . } else { $size[$acc_dir] = $directory_total. while(list($pk. $acc_dir = "". if(isset($size[$acc_dir])) { $size[$acc_dir] += $directory totál. tdl() ) ) . tde("File") . else { print(trow(tdl($d) . while(list($f. $fv) = each($dv)) if(is_array($fv) ) if ($print_limit) print (trow(tdl($d) .

072.793 c:ProgramFiles 437.953 |c:KPCMS ! 6. A Netscape 4. while (üst ($d.000 fájlból álló listával már nem boldogul.0/Help 350. $s) = each($size)) if($print_limit) í print(trow(tdl($d) $print limitr-. tdn($s))) } print } Az eredmények a 8.054. Az ebben és a következő kódokban használt ksortQ és a többi tombréndező függvényt a 3.072. A ksort()-tal rendezi a tömböt.805 |c:KPCMS/CMSCP \ 625. de előtte jó sok fájllal teszteld le a böngésződ.060.879 c. tde("Size"))).679. print ("<tcLble border=\ "3\ ">" . arra az esetre. fejezetben mutattam be.248 c:Prograin Files/Adobe 6.012 'c:KPCMS/DCPDB 6. Mivel minden könyvtárhoz egy elem tartozik. hogy a $size-tömb létezik-e és valóban tömb-e.8. és minden nyitva lévő Netscape-ablakot bezár: if(isset($size) and isarray($size)) $print_limit = 10.776 c:ProgramFiles/ACDSee32 : 2.513 . ha az előző kód megváltozott.0 \ 6. csak a tesztelés során megjelenítendő sorok korlátozására beiktatott külön kód miatt tűnik bonyolultnak. \Ekrectory Size \ |c: : 347.478 !l 8.513 c:PrograniFiles/Adobe/Acrobat 4. fejezet Fájlok A könyvtárak által elfoglalt lemezterület kiíratása A következő kód az előző példában létrehozott $size-tömböt rendezi és jeleníti meg. majd a while()-t használva végigfut rajta.76 egy 10. . trow(tde("Directory") .Program Files ACDSee32/Shortcuts 1. Ha már működik.6 ábra Könyvtárként felhasznált lemezterület 272 . megszüntetheted a korlátozást. a lista egyszerű. miközben a fájlok által használt terüjet listáját íratja ki. ksort($size).c:Program Files/Adobe/Acrobat 4.524. A kód első része ellenőrzi.6 ábrán láthatók.

hogy az arsort()-tal rendez. } í print("</table>"). majd a nyílt forráskódú StarOffice-alkalmazást.512 8.321. Ezen kimutatás alapján újratelepítem a Cygwint.524. Az arsort()-függvény az asszociatív tömböket a kulcs szerint fordított sorba rendezi. A 8.558 c:Program Files/StarOffice ' I|l26. trow(tde("Directory") . Ha figyelembe veszem.485.7 ábra Felhasznált lemezterület. így az elfoglalt lemezterület alapján listázva a könyvtárakat a legnagyobb lesz legelöl. majd a cygwin-könyvtárat. 273 . hogy a Cygwint csak azért telepítettem a tesztgépre.7 ábrán látható eredmény három sor összetett. akkor a felhasznált lemezterület nagysága nevetségesen sok. legnagyobb könyvtárként listázva if (isset($size) and ís_array($síze)) { $print limit = 10. $s) = each($size)) { if($print_limit) { print(trow(tdl<$d) .229. egyetlen alkalmazást tartalmazó könyvtár.275. c:cygwin 7 ijl30. $print_limit--.580 ic:Program Files/TMG 1 50. amely a legnagyobb. A $print_limit lehetővé teszi.192.921.260. és mindent kikapcsolok.Gyors megoldások A legnagyobb könyvtárak által elfoglalt lemezterület kiíratása A következő kód és lista az előző könyvtárlista egy változata. hogy csak a 10 vagy 100 legnagyobb könyvtárad jelenjen meg.683 |c: WINNT/system3 2 1 [151. while (üst ($d.911 c:cygwia'usr _j[ 75. print("<table border=\"3\">" .485. amire nincsen szükségem. számtalan alkalmazást tartalmazó könyvtárak mutat. kicsit lemaradva tőle. azzal a nagy különbséggel. arsort($size). Mindkét program esetében hasznos lenne a telepítésre jobban odafigyelni.469 |c:Program Files/StarOffice/program 77.259 .512 c:Program Files/JavaSoft/JRI * 43.858. tdn($s))).431 ciProgram Files/JavaSofl j 43. tde("Size"))). hogy segítse a PostgreSQL telepítését. A terjedelmes StarOffice telepítését is felülvizsgálom. A használt kód a következő: íDírectory pze c:ProgramFües 437.776 |c:WINNT 210.

hogy mikor használták utoljára az adott fájlt. while(list($d. tde("Last accessed"})). while(list($s. méret. így további feltételként minden while()-hoz hozzáadhatod az and $print_limit feltételt: $print_limit = 10. fejezet Fájlok A legnagyobb fájlok által elfoglalt lemezterület kiíratása A következő feladat a legnagyobb fájlok felkutatása. A következő példában a krsortQ méret szerint fordított sorrendbe rendezi a tömböt. pedig igazából erre lenne szükséged: reset($found). rendezhetsz és egyszerűen feldolgozhatsz. A külső ciklus és a fő szekvencia méret szerint indexelt. tdeC'File") .8. Ez legalább olyan hasznos. Két while()-ciklus könyvtáranként. print ("<table border=\"3\">" . $dv) = each($sv)) if(is_array($dv)) while(list($f. A következő kód újra felkeresi a $found-tömböt é> egy. a legnagyobb könyvtáraké volt. így a legnagyobb fájl jelenik meg legelőször. A $print_limit 10 sorra korlátozza a belső printutasítást. hogy ez egy harmadik while()-ciklust is tartalmaz. hogy a megjelenítés leáll. } } A $file size méret szerint listázva tartalmazza a fájlokat. az elfoglalt területet tartalmazó $file_size nevű új tömböt hoz létre. trow(tde("Size") . $fv) = each($dv)) if(is_array($fv)) $file size[$fv["size"]] [$d] [$f] = $fv["accessed"]. krsort($file_size). így a belső printutasítás először a méretet jeleníti meg. hiszen a tömbnek a korábbi kettő helyett három kulcsa van. A kód többi része majdnem teljesen ugyanaz. mint az előző két tömböt listázó ciklus. hogy az utolsó hozzáférés adatai nem azt mutatják. $dv) = each ($found)) if(is_array($dv)) while(list($f. és a ciklus azután fut végig a fájlokon. hogy mikor olvasták be utoljára a fájlt. Az operációs rendszertől függően azonban előfordulhat. így látható. $fv) = each($dv)) . tde("Directory") í 274 . mint az előző. könyvtár és fájl szerint indexelve. azzal a különbséggel. Átkerülnek az utolsó hozzáférés adatai is. $sv) = each($file_size)) if(is_array{$sv)) while(list($d. majd fájlonként fut végig a $found-tömbön. A fájlok szintjén minden egyes fájlbejegyzés hozzáadod:* a $file_size-hoz. amelyet könnyer.

dat 2001-01-30 20:05:00 fi .qts 5.047. Ötvözve ezt az 5. hogy a képfájlok attribútumait kilistáztasd. .232 jc:Program Files/Iomega/Iomegaware IIOGUREG.« V -f Gyors megoldások ■114: if ($print_limit) í print (trow(tdn( $ s ) $pr i nt _l i m i t -.111. amely a képre vonatkozó információkat tartalmaz. és adhatsz hozzájuk címet és szerzői jogi figyelmeztetést is.EXE ToOl-01-17 22:45:44 j 6.777.767.216c: cygwin/usr/1 ocal/pgs ql /data'pgxlog 0000000000000000 Í2001-05-14 19:57:47 11.i| .692 c:Program Files/Sta^OflFice/help/01 (16. opcionális paramétert tartalmazhat. fejezetben magyarázok el teljes részletességgel.a példában ezt $att-nak nevezem -.c:Program Files/Opera/Mail/Apachetect |Trash.bmp 2001-05-19 14:49:16 3.0J)l/lib rt. hogyan mehetsz végig úgy a fájlokon.640 jc:Program Files/JavaSoft/JRE/1. fejezet MySQL-adatbázis kódjával.3.848 c:Program Files/StarOffice/user/store 2001-01-30 19:52:14 outscs | 6.094.3/lib rtjar 2001-05-02 21:33:04 9. de a vizsgált képek között egyikről sincs további információ. A getimagesize() fájlnevet és egy további. legnagyobb fájlonként listázva Képfájlok attribútumainak kiíratása Ebben a megoldásban arról lesz szó. fejezet kódjával kibővítve automatikusan hozhatsz létre kisméretű előnézeti képeket. a magasság és szélesség az. A $att-ba négy hagyományos érték kerül.646.a többi képfeldolgozó függvénnyel egyetemben -a 11.646. és a két hagyományos érték közül csak kettő. képes leszel képeket listázó és megjelenítő oldalakat létrehozni.! jl8. a 11. Eredményként tömböt ad . tdl($f) .089. A képattribútumokat a getimagesizeQ-képfüggvény használatával gyűjti össze. akár képkatalógust is készíthetsz.103. Egyaránt használjuk az előző fejezet Gyors megoldások részében látott $path-t és get_directory_file()-függvényeket.8 ábra Felhasznált lemezterület. amit itt $extra-nak nevezek.454 c:Program Files/JavaSoft/JRE/1.744 c:WINlsn7system32 2000-12-04 17:35:40 .. Az eredmény: \File Last accessed ' shelp. melyet .054 !c:WINNT |Carolyn. tdl(Sd) .QuickTime.168 |c:Program Files/StarOöice/program applicatrdb 2000-05-08 05:20:00 || 5. illetve JPEG-képek esetén további kettő. Ha egyszer elsajátítottad az alábbi példában szereplő kódot. tdd(Sfv))) print ("</table>") . |5Í2K \Directory \ 8. amelyik 275 .MBS 2001-04-13 07:33:44 6.327 .760.jar 2001-05-19 17:23:51 11.

": " . $dv) = each ( $f otmd) ) { if(is_array( $dv)) { ~ while (üst ( $ f .} if(isset ($att[5])) {$fv["bits"] = $att[5]. $fv) = each($dv)) $x5 = strtolower(substr($f.ez a fajta információ jelenleg csak a JPEG-képekről érhető el.jpg" or $x5 == ". Jóllehet a kód összegyűjti és egy megjelenítésre alkalmas sztringbe helyezi az információt.png" or $x4 == ".gif" $f. a képek többletinformációinak kigyűjtése érdekében néhány helyen megváltoztatva. A Sextra-ba egy a képben tárolt információkat tartalmazó tömb kerül . hogy az csak képeket olvasson be. $ek .8. hogy Photoshopból származtak.} {$fv["htral"] = $att[3]. reset($found) .jpeg" or $x4 == ". while (üst ($d. . Az első változtatás a belső feldolgozó ciklus módosítása. $ev.} if(isset ($att[l])) if(isset ($att [2])) {$fv["height"] = $att[l]. amelyek többletinformációt tartalmaztak. mint az előző Gyors megoldásokban használt fájlfeldolgozó kód. Mivel a kód valójában az új képattribútumokat a már létező fájlattribútumokkal vegyíti. $x4 = substr($x5. if($x4 == ". olyan további megjelenítő oszlopokat szúrhatsz be. a sztringet nem helyeztem a kimeneti HTML-táblázatba. if(isset ($extra) and strlen($extra)) 276 . .= "<br>" else Sextra = $ek . $fv["extra"]) /' $att = getimagesize ( $ d if(isset($att[0] )) {$fv["width"] = $att[O].} if(is_array($fv["extra"])) while (üst ($ek. A több szerveren lefuttatott teszt csak néhány olyan JPEG-fájlt talált. A másik változtatás hatására a kód a képattribútumokat a $images-tömbbe helyezi el.} if(isset($att[4])) {$fv["channel"] = $att[4]. $ev) = each ( $fv [ "extra" ])) if (strlen(Sextra)) $extra . $ev. de csak a magasságot és szélességet jeleníti meg. így a kód az összes értéket eltárolja. és ez a többlet információ is csupán annyi volt. fejezet Fájlok hasznos. mint például a létrehozás ideje: $found = get directory_file($path). -4). Képinformációk kigyűjtése A következő kód úgy néz ki. és a vizsgált fájlok között nem volt JPEG. -5)).swf") or $x4 == ".} if(isset($att[3])) {$fv["it"] = $att[2].

Csak azt kell megnézned. az előző Gyors megoldásokban a 10 legnagyobb lemezterület elfoglaló fájl megjelenítésére mutatott trükkök használatával: if(isset($ímages) and is_array($images)} { $print_limit = 10. amelyek nem használnak fájlvégződéseket. ha egy fájl . amelyek között csak néhány kép van. csupán a megjelenítendő mezőket kell megváltoztatnod. A kód beállítja a tesztre vonatkozó megjelenítési korlátot. trow(tde("Directory") . hogy kép-e. $images[$d][$f] = $fv. reset($images). további if()-utasításokat szúrhatsz be. ha valaki az előző kódot megváltoztatta volna. Az olyan operációs rendszerekben. az if()-utasításban felsorolt végződések egyikével rendelkezik. tde("Width") . vagy rendezd a tömböt valamilyen más sorrendbe. print("<table border=\"3\">" . ha a getimagesizeQ-függvényt lefuttatod. így rengeteg felesleges műveletet takaríthatsz meg. A következő kód a tömb használata előtt ellenőrzi. A belső ciklus akkor fut. majd két while()-ciklus fut végig a könyvtárakon és fájlokon.Gyors megoldások $fv["extra"] = Sextra. tde("Size") .jpg vagy más. arra az esetre való tekintettel. else { $fv["extra"] = "". úgy döntheted el egy fájlról. tde("Height") . helyezd a fájltípus-ellenőrzést a get_directory_file()-függvénybe. tde("Extra")) ). tde("Bits") . Ha rengeteg fájlt kell beolvasnod. a legkisebb vagy bármilyen egyedi tulajdonsággal rendelkező képet keresel. hogy a tömb létezik-e. while (üst ($d. hogy a képattribútumok immár a $images-ben vannak. Ha a legnagyobb. az elemeket megjelenítve. tde("Channel") . az előző Gyors megoldásokban használt megjelenítő kódhoz hasonló ciklussal fuss végig a tömbön. $fv) = each($dv)) { if( i s ar r ay ( $ f v ) ) {~ if($print limit) 277 . tde("File") . Sdv) = each ($images) } { if(is_array($dv)) { while( l i s t ( $ f . Képinformációk megjelenítése Most. hogy az eredmény tömb-e vagy pedig hamis érték. ez jelen esetben 10.

hogy a kis tesztfájlocska egy masszív szövegfájl. ahogy azt a $line_limit-ben beállítottam. Az első példa a fileQ-függvényt használja a teljes fájl memóriába történő beolvasására.jpg [i :/petermoulding/web/root/phpblackbook/files/images php-syd. td l($ f) . A második példa azt feltételezi.ini).gif i:/petennoulding/web/root/phpblackbook/files/images copy. A PHP-fájlfüggvényekkel bármilyen. fejezet Fájlok print (t ro wftdl ($d ) . tdl($fv["height"]) .jpg Heigh Width t 11 61 80 250 80 6530 100 60810 500 6530 100 50024 6530 6405 50024 250 100 100 250 280 80 190 280 8. Ez akkor ideális.jpg |i:/petermoulding/web/root/phpblackbook/files/images peter. ha megjelenítés előtt a kód eldob néhány sort.jpg lii/petennouldingí'web/root/phpblackbook/files/images kingparrot. tdl ( $ f v ["width"]) .html) és egy képfájlt (me. Az eredmények: Directory ^File Size 255 i:/petennoulding/web/root/phpblackbook/fíles/images jbs. tdl ($fv [" si z e" ]) . a $print_limit használatával 10 sorra korlátozom a megjelenítéseket. t41($fv["channel"]) . te pedig ugyanannyi sort akarsz megjeleníteni. egy HTML-fájlt (test. ahogy azt az előző példában is tettem. print ("</table>" ). a sorokat pedig 70 karakterre csonkolom.gif |i:/petermoulding/web/root/phpblackbook/files/images roo. az fgets()-függvénnyel egyszerre a fájl egy sorát olvassa be.jpg |i:/petermoulding/web/root/phpblackbook/files/images me.9 ábra Képfájlok listája az attribútumaikkal I Bármilyen típusú adat megjelenítése A következő példa célja olyan kód létrehozása. majd pedig a $print_limit-et alkalmazza a megjelenítéskor. tdl ( $ f v ["bits"]) .8. és a beolva278 .jpg) tartalmaz. hogy a böngésződ szétdurranna. A példa egy szövegfájlt (php. Általános kód A kezelhetőség érdekében. $print_limit--. amellyel bármilyen fájlt megjeleníthetsz a képernyőn anélkül. az operációs rendszered és a biztonsági beállításaid alapján engedélyezett fájlt beolvashatsz és megjeleníthetsz.jpg |i:/petermoulding/web/root/phpblackbook/files/images notme. tdÍTSnsxtra)) ).

ini". $v) $print_limit--. $print_limit = 1 0 . while (üst ($k. $file).ini [PHP] . A sorhossz alkalmazható a hosszú sorok kezelésére. hogy példaként használjuk. $line limit) A kód eredménye: File: í:/petermoulding/web/root/phpblackbook/files/php. A newline-karakterek megmaradnak. utána pedig megáll. az fgets() ezzel szemben csak azt a rekordot. minden newline-karakter után új elemet kezdve. A kód a file()függvényt használja arra. $path . $line_limit = 70. print("<br>" . mivel a file() a fájl méretétől függetlenül minden egyes alkalommal az egészet olvassa be. $v) = each($text) and $print_limit) $v = substr($v. print("<br><em>File: " . nem a megjelenítést. ami ideális megoldás a nagy fájlok elejének megtekintésére. engine = On short_open_tag = Off asp tags = Off precision = 14 y2k_compliance = Off output_buffering = Off output handler = A következő kód egyetlen nagy különbségtől eltekintve ugyanaz. Ezen kívül tisztában vagyok vele.Gyors megoldások sást korlátozza. mint az előző: a file() helyett az fgets() olvassa be az adatokat.ini fájlja körülbelül 50 sornyi beállításból és rengeteg megjegyzéssorból áll. hogy semmi olyan speciális karaktert nem tartalmaz. amelyiket kiválasztod. Az fgetsQ háromlépcsős folyamatot igényel: az fopen() megnyitja a bemeneti adatnak szánt fájlt. az fgetsQ a fájl egy rekordját olvassa be. A substr()-függvény a sor hosszúságát a $line_limit-nek megfelelően korlátozza. így az összes elem. hogy a a fájlt egy tömbbe beolvassa. "/" . és az első prmtsor kis fejlécet hoz létre a lista azonosítására: $file = "php. Language Options . és lehetőséget ad neked például egy fájl egyes rekordjai elejének megtekintésére: Sline^limit = 70. A kód többi része egyszerű megjelenítés. $file . A while()-ciklus végigfut a tömbön annak végéig. newline-karakterrel végződik. a fájl végén pedig hamis értéket ad eredményül. így elég hosszú arra. "/" . 0. és a mutatót a fájlra állítja. Szövegfájl megjelenítése A PHP php. talán az utolsót leszámítva. amely felizgatná a böngésződet. $print limit = 10. $text = file($path . A nem szövegfájlok a bemeneti fájl összes bájtját tartalmazó egyetlen nagy elemmé válhatnak. vagy ameddig a $print_limit nullára nem csökken. ha pedig kész 279 .

size: 6301 HTML-fájl megjelenítése A következő kód egy HTML-fájllal birkózik meg. hogy a HTML tag-eket speciális karakterekkel helyettesíted. de bármelyiket megváltoztathatod az fgets() vagy hozzá hasonló függvények használatával. 0. egy pótlólagos.ini". így a következő csak az első sor: File: i:/petermoulding/web/root/phpblackbook/files/php. html Heading One Somé text. } fclose(\5pointer). A következő kód használatával viszont a 8. "r"). A hátralévő példák a kódrövidségért a file()-t használják. fejezet Fájlok vagy a fájl beolvasásával. hogy a fájlból megjelenített HTML összeakad a megjelenítő oldalad HTMLjével. $size = filesize($path print("<br><em>File: " "/" . hogy a böngésződ HTML-nek értelmezné azokat. Ezen kód eredménye .11 ábra lesz az eredmény: File: i :/petermouiding/web/root/phpblackbooh/files/test. a 8.8. A megoldása a htmlspecialchars(). $print limit—.vagy htmlentities()-függvények használata. Mivel az ilyen típusú fájlműveletek nagy fájlok esetén használatosak. $file). print("<br>" . $file size: $size $pointer = fopen($path . $line_limit). "/" . $file.10 ábra HTML-fájl a tag-ek felcserélése nélkül 280 . A HTML-fájlok megjelenítésével az a probléma. melyek a HTML-t és egyéb karaktereket sztring megjelenítésre konvertálják.10 ábrán látható eredményre jutsz. az fclose() bezárja azt. $line). Ha a tesztfájlt anélkül jeleníted meg. amelyek a képernyőn anélkül jelennek meg. $size) and $print_limit) { $line = substr($line. 8. $path . while($line = fgets($pointer. $line_limit = 70. $print_limit = 1 0 .ini. amelyei csökkentheted a nagy fájlok miatt feleslegesen elvégzett műveleteket.a fejrészt leszámítva . a filesizeQ-függvényt tartalmazó sor a fejrészben megjeleníti a fájl méretét: $file = "php.megegyezik az előzőével. "/" .

$path . A htmlentitiesQ is ugyanezt a karakterkészletet változtatja meg. Bármilyen típusú fájl megjelenítése A következő kód az előzőnek egy jelentős kibővítése. A $print_limit a megjelenítendő rekordok számát állítja be. $file). ez biztos egyike azoknak a titkos PHP-fejlesztői dolgoknak. a $current_byte pedig egy a hosszú rekordokban való tájékozódást segítő mező.Gyors megoldások $file = "test. no meg számtalan speciális ékezetes karaktert. htmlentities($v)). "/" . print("<br><em>File: " . 0. amelyeket főleg az európai nyelvekben használnak. ezáltal nagyobb kontrollhoz jutsz. hogy a HTML-t értelmezés nélkül jeleníthesd meg. és a szóközöket &nbsp. $print Fűe: i:. így további elemeket adhatsz hozzá és strtr()-rel pedig manuálisan fordíthatsz szöveget.'pstermoulding/Yueb/root/phpbtackbook/files/test. Amennyiben az európai latin betűktől eltérő karakterkészletet kell megjelenítened.11 ábra HTML-fájl a tag-ek felcserélésével i Miért van két függvény ugyanarra a feladatra? Nem tudom.-re fordíthatod.0 Transitional//EN"> <head> <title>Test page</title> </head> <body> <hl>Headmg One</hl> text. A get_html_translation_table() a htmlentities()-hez használt táblázatot hívja be. hiszen ezzel bármilyen létező fájlt megjeleníthetsz. $line_limit). A htmlspecialchars() a karakterek közül csak a legszükségesebbeket változtatja meg. $print_limit = 10. ha azok maguktól nem jelení- 281 . a $segment_length az outputban soronként megjelenő karakterek számát határozza meg. $file while (üst ($k.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. a $current_record a hosszú fájlokban való tájékozódást segítő rekord. $line_limit = 70. a htmlspecialchars() használatával végrehajthatod az alapvető karakterek cseréjét. Sv) = each($text) and $print_limit) t $v = substr($v. a többi karaktert pedig a saját célod alapján egyedileg fordítsd. a $line_limit az egy rekordból megjelenő karakterek számát. $text = file($path . Ez a karakter akkor is szóközt jelentet meg a böngészőkkel. print("<br>" .</p> /htmí 8. Az általános fordításra a következő hexadecimális megjelenítésben találsz példát. "/" .html".

$print_limit = 10. print ("<brxf ont face=\" ' Courier New'. /images/me.monospace\">" . fejezet Fájlok tenék azt meg. Mivel bizonyos hexadecimális megjelenítések elvesztik a elöl álló nullájukat. for($i = 0. A betűtípus meghatározásával a karakterköz rögzítetté válik. $hs = "". monospace\">" . $hex. " Current record: " . $v) = each($text) and $current_record <= $print_limit) $current__record++. $hs . a dechex() pedig a decimális értékeket a hexadecimális megjelenítésre konvertálja. $text = file($path . $safe = get_html_translation_table(HTML_ENTITIES).8. \$current_record . a ! 282 . 0. $path . $segment_length = 16. strtr(Ssegment. a kód egy sora visszaadja ezeket. $current_byte += strlen($v). $v = substr($v. "&nbsp. így a képernyőn könnyedén megszámlálhatod a karaktereket: $file = ". Minden rész külön sorban jelenik meg. while (üst ($k. $safe) . szóközként jelenik meg ahelyett. a while()-ciklus pedig a decimális 0-tól a decimális 32-ig (szóköz) az összes karakterhez további elemet rendel. for{$i = 0. és részekre oszlanak. A fordító táblázat a $safe-be kerül. ". print("<br><em>File: " . mint például a sortörés. a tömb összes eleme pedig a $v-be kerül. hogy a HTML-t megbolygatná a honlapodon. "&nbsp. $v = substr($v. "</em>" ). "/" . Courier. $segment_length). $current_record = 0. $line_limit = 256. $current_byte = 1. $i++) $hex = dechex(ord(Ssegment[$i])). így az összes furcsa karakter. "/" . $file). Minden rekord egy tömbbe. "</font>" )." . 0. $file . current byte: " . Az ord() az egyéni karaktereket a decimális értékükre. és az elemek a Sline_limit-nek megfeleló'en csonkulnak.Courier. $segment_length). while (strlen($v) ) $segment = substr($v. while(strlen(Ssegment) < $segment length) $segment . $current_byte .". print("<br><font face=\"'Courier New'. $i < strlen($segment).jpg".&nbsp. egy kis ciklus pedig szóközöket szór a részek karaktermegjelenítéséhez. $i <= 32. $hs . $üne_limit) . így a részek igazítottan jelennek meg az oszlopban. . "</font>" ). ( s ' ■ ! .= " ". if(strlen($hex) < 2) { $hex = "0" .".= $hex . $i++) $safe[chr = "&nbsp.

amely véletlenszerűen tárol és olvas be értékeket. date("Y -m-d H : m : i " . Az opcionális dátum/idő Unix időjelzés. így amikor a felhasználó bejelentkezik nem áll fenn a fájlallokációs hiba veszélye. csak az utolsó módosítás idejét változtatja meg. Az alapértelmezett dátum/idő az aktuális idő. Jóllehet a PHP a fájlfüggvények nagyon széles választékával rendelkezik. filemtime( \ $ f ile)) ) . Ennek a megoldásnak a lehetséges alternatívája egy olyan szkript létrehozása. és akkor használhatod az alapértelmezést. neked csak néhányra van szükséged a megfelelő adat megtalálására. általában a szkript elején üres változót hozol létre. hogy azt mutassa.5 által adott eredményt: File . és úgy akarod a fájl létrehozásának idejét megváltoztatni. A következő kód a touchQ használatával változtatja meg egy fájlban a dátum/időt: $file = " . A touchQ-függvény egy fájlnevet és egy opcionális dátum/idő paramétert igényel. hiba esetén hamis értéket eredményez. vagy ha a fájl már létezik. Ha a 300 és 305 közötti rekordokat akarod megjeleníteni. A következő két sor mutatja a Windows NT alatt használt PHP 4. így az összes lehetséges hiba egy helyen történik. és egy telefonhívással megoldható. Sikeres végrehajtás esetén igaz. a kódod többi része pedig feltételezi.0.Gyors megoldások A kódot könnyűszerrel módosíthatod. t o u c h ( $ f i l e ) . hogy a számodra szükséges feladatnak jobban megfeleljen. p r in t( " < b r > N e w m t i m e : " . Üres fájlok létrehozása Furcsának tűnhet egy üres fájl létrehozása. " mtime: " . amely a felhasználó első bejelentkezésekor létrehozza az alapértelmezett fájlokat. így például a nagy fájlokat a file() helyett az fgets() használatával olvashatod be. de ez egyenértékű azzal a trükkel. amikor a felhasználó először lépett be. amelyre a weboldalad új felhasználójának szüksége lehet. és megjegyzéseket teszel a változó használatára vonatkozóan. p r in t( " < b r > F i l e " . strtotime ("+1 w e e k " ) ) . hogy az új felhasználónak nincsen listája a kedvencekró'l. Lehet. ahogy azt a filemtimeQ adja.például létrehozod az összes fájlt. Ugyanezt megteheted a fájlokkal is . amikor a szkriptben üres változót hozol létre. hogy ez a változó végig létezik. date("Y -m-d H : m : i " . állítsd a $print_limit-et 305-re.txt". touch($file. és rejtsd el az első háromszáz megjelenített rekordot./touchme. /touchme. de a felhasználói név létrehozásakor kialakíthatsz egy üres kedvencek fájlt. ha nem megfelelő jo- 283 . így úgy állíthatod be az utolsó módosítás idejét.txt mtime: 0 New mtime: 0 A következő sor a Linux alatti eredményt mutatja abban az esetben. filemtime( \ $ f ile)) ) . ha új felhasználó számára másolsz fájlokat. Ha hosszú szkriptet írsz. $file . üres fájlt hoz létre.

állítsd az action= űrlap paramétert az oldalad nevére. print("<br>uploadfile_name: " . Ha nincsen jogosultságod a fájlhoz való hozzáférésre. ha pedig létezik. hogy az upload_max_size nagyobb. Az if() a feltöltés által létrehozott $uploadfile-mező észlelésére szolgál. ha a fájltípus alapján egyedi feldolgozást akarsz végrehajtani: if(isset(Suploadfile)) print("<br>All set to upload a file. $uploadfile ). Győződj meg arról. két hibát kapsz eredményül. A $uploadfile_type a fájl MIME-típusát tartalmazza arra az esetre. fejezet „Fájlok feltöltése" című részből vett kód kivonatával kezdődik. és a bemeneti fájl nevét tartalmazza teljes elérési úttal együtt. $uploadfile_size print("<br>uploadfile_type: " . " value=\"200000\">" m 284 . akkor annak a tartalmát jeleníti meg. hogy melyik fájlt akarja feltölteni. $uploadfile_name print("<br>uploadfile_size: " . hogy a php. Ez után tedd a HTML-t egy olyan oldalba. amely megkérdezi a felhasználót. print("<br>uploadfile: " . fejezet Fájlok gosultsággal próbálták használni a függvényt. A $uploadfile az űrlapban <input type="file"> tag-jében beállított név. Először ellenőrizd. az űrlapot mutatja. mint a feltöltendő fájl: file_uploads = On upload tmp dir 8M memory_limit = 30M = T:\upload upload_max_filesize = Szúrd be tesztoldaladra a következő.in-ben a file_uploads be legyen kapcsolva. amelyhez persze hozzáférésed kell. minden touch()-ra egyet. "<input type=\"hidden\" name=\"MAX_FILE_SIZE\"" . mint a legnagyobb fájlod. A $uploadfile_name a $uploadfile-ból kivont fájlnevet tartalmazza. amikor a dátum/időt próbálod megváltoztatni: Warning: utime failed: Operation not (Figyelem: Hozzáférés megtagadva) permitted Fájlok feltöltése Ez a példa a 9. A HTML-ben a MAX_FILE_SIZE-nak legalább akkorának kell lennie." ). hogy legyen. $uploadfile_type else print("<br>Please teli me which file I should upload. itt uploadingfiles. egyetlen hibát kapsz az első touch()-ra." ) print("<form enctype=\"muitipart/form-data\"" . " action=\"uploadingfiles.html-nek nevezett kódot. majd teszteld az oldalt. Ha hozzáférhetsz a fájlhoz. a memory_limit pedig legalább kétszer akkora. sikertelen feltöltés esetén értéke 0.8. de nincsen jogosultságod megváltoztatni. A $uploadfile_size a fájlméretet tartalmazza.html\" method=\"post\">" . Ha a mező nem létezik. Windows és Windows NT alatt meg kell határoznod a upload_tmp_dir könyvtárat. mint az upload_max_filesize.

bizonyos böngészők vagy szerverek miatt nagybetűvel kell írni) meghatározott méret. Please teli me which file I should upload. a test. Nos. és inkább saját magad tesztelj le mindent. próbáld kicsomagolni. Ha trükközni akarsz.76-ból vett űrlaphoz hasonló dolgot fogsz látni. a következő üzenetet kapod: Warning: Max file size exceeded . a JavaScriptet kell használnod. vagy adatbázisba olvasáshoz megnyithatod az ide285 .aladdinsys. a 8. Netscape 4. A legújabb böngészó'k .Gyors megoldások "<input type=\"file\" name=\"uploadfile\" size=\"60\" "<br><input type=\ " submit\" value=\ "Upload\"x/f orm>" Amikor az űrlap megjelenik a böngészőben. de azt javaslom. ahonnan feltöltötted. Minden általad feltöltött fájlt töltsd le..file [uploadfile] not saved (Figyelem: Fájlméret túllépés .tmp uploadfile_name: test. a következő négy sorhoz hasonlót látsz megjelenni. Ha azt gyanítod. A meglehetősen megbízhatatlan JavaScript használata nélkül lehetetlen felfedni az eredeti könyvtár kilétét. A php22.html pedig a forrásgépen levő eredeti fájlnév. A Mac-fájlok zippelhetők. Upload | 8. Ha a fájl feltöltődik.12 ábra Fájlnév űrlapfájlfeltöltéshez Ötlet: Macintosh-on számtalan tömörítési rutin van.tmp a feltöltési célkönyvtár ideiglenes neve. hogy végül megszüntette az oldalán a fájlfeltöltés lehetőségét. ami megbízhatatlansága miatt csupa haszontalan állományt fog feltölteni: Ali set to upload a file. amelyeket ők nem is választottak ki.hasonlóképpen kezelik a fájlfeltöltést. vagy küldd vissza e-mail-ben ugyanarra a gépre. és az esetleges módosulások észrevételéhez hasonlítsd össze a feltöltött fájlt az eredetivel.html Browse. mint a HTML MAX_FILE_SIZEban (jól látod. személyesen ülj le egy Mac-hez (vagy bármilyen hibákat eredményező böngészőhöz). megoldható a dolog. de gyakrabban vannak az Aladdin Stufflt-tal tömörítve (www.com).12 ábrán látható. olyan fájlokat feltöltve.a Mac-en lévő böngészőket leszámítva . és hasonlítsd összes a kicsomagolt fájlt az eredetivel. uploadfile: T:\upload\php22.. hogy egy fájl hibát tartalmaz. például emberek után kémkedni. de olyan sok probléma és hiba jelentkezett. és nincsen fájlkiterjesztés a fájl formátumánakjelzésére. mint hogy más emberek értelmezésére támaszkodj. amely nagyobb.az [uploadfile] fájl nincs elmentve) Mit tegyél a feltöltött fájllal? A következő kód beszúrásával a későbbi használathoz a megfelelő könyvtárba mentheted a fájlt.html uploadfile_size: 183 uploadfile_type: text/html Ha olyan fájlt próbálsz meg feltölteni. Valaki megpróbálta Mac-ről is engedélyezni a fájlfeltöltést. I:\PeterMoulding\web\root\phpblackbookAfiles\test.

ahol két különböző fájlnak számítanak (hiszen a Unix különbséget tesz a kis. hanem azt feltételezik. Ha nehezen kibogozható hibákat követsz el. hiszen ezek az operációs rendszerek nem különböztetik meg a kis. hogy a fájl a hálózaton keresztül történt továbbítás után is változatlan. vagy mert bár létezik.és nagybetűket. így a második felül fogja írni az elsőt. hogy a feltöltött fájl rendben van-e. a move_uploaded_file() pedig az ideiglenes könyvtárból az állandó könyvtárba menti a fájlt: if (isset($uploadfile) and is_uploaded_file($uploadfile)) { if(move_uploaded_file($uploadfile. rosszul vannak beállítva a hozzáférési jogok: Warning: Unable to create (Figyelem: Nem sikerült létrehozni) 1 i:/petermoulding/web/root/phpblackbook/files/ upload/test. Windows NT vagy hozzájuk hasonló operációs rendszer alatt mented el őket. amely meghaladja HTML MAX_FILE_SIZE méretet. és a weboldal szkriptjének végrehajtása elmarad. Cyclical Redundancy Check) meggyőződhetsz arról. amely akkor történik. ahol a fájlnevekben a szóköz nem engedélyezett. Fájlt veszíthetsz el. ha egy Windows alatti nevet.tmp1 to 'i:/petermoulding/web/root/phpblackbook/files/upload/test. CRC-számolás fájlokra Egy megfelelő CRC-vel (Ciklikus Redundancia Ellenőrzéssel. de a CRC-t használhatod olyan fájlok összehasonlítására is. hogy a két fájl ugyanaz. Ha olyan fájlt próbálsz meg feltöltetni.ilyen például két kép. fejezet Fájlok iglenes fájlt. $path .és nagybetű között). hálózati hibaüzenetet kapsz a böngészőben. vagy mert a célkönyvtár nem létezik. majd Windows. Unix alatt próbálod használni.0." ). például a „test file"-t.3-tól érhető el.8. A legújabb PHP-változatokban elérhető is_uploaded_file() segítségével ellenőrizheted. Megjegyzés: A move_uploaded_file() a PHP 4.html' (Figyelem: Nem sikerült áthelyezni) A másik elkerülendő hiba az inkompatíbilis fájnevek hibája. a következő két hibaüzenetet kapod. Suploadfile_name)) { print("<br>Uploaded file saved. ha a TestFile és testfile-fájlokat Unixből töltőd fel.html': No such file or directory (Figyelem: Nem sikerült létrehozni) Warning: Unable to move 'T:\upload\php21. A hagyományos CRC32 32 bites identi286 ." ). "/test/" . } else { print("<br>Uploaded file savé failed. amelyeket máskülönben nehéz összevetni .

Ha viszont különböző fájlrendszerből származó CRC-ket figyelsz meg. $acrc . amit a legegyszerűbben a 8 bitet négyszer összeszorozva kaphatsz meg. b: -40759560 Az itt kapott CRC-k kiválóan alkalmasak az összehasonlításra. $b = "/images/kingparrot. $b). megkeresi és megjeleníti a fájlméreteket és a CRC-ket. $a) $acrc = (double) crc32($path . print("<br>CRC $acrc . Mivel a fájlok különböző méretűek. 0 és 4 milliárd közti értékkel. $bcrc). $bsize). if($bcrc < 0) $bcrc = (double) (unsigned) $thirtytwo a: " . . b: A kód eredménye: Size a: CRC a: 6530. és hogyan konvertálhatod át azt gyakrabban használt egész vagy hexadecimális formára. b: " $bcrc) 256. ". A PHP a legtöbb 32 bites rendszeren 32 bites előjeles egészeket használ a mínusz kétmilliárd és plusz kétmilliárd között tartományból. hogyan hozhatsz létre hagyományos PHP CRC32-t. így a hasonló fájlok teljesen különböző CRC-ket produkálnak: $a = "/images/me. Sasize b: " . Ehhez először a 4 milliárdos értékre lesz szükséged. hiszen ugyanolyan fájlrendszerből származnak. n . 32 bites előjel nélküli egészeket is találni fogsz. de vedd úgy.jpg". if(\$acrc < 0) $acrc = (double) $thirtytwo + $acrc. $asize = filesize($path . és a CRC kiszámítási módja miatt kiemeli a kis különbségeket. . nem lenne szükség a CRC-k összehasonlítására. amely 4 milliárd esetből egyszer téved. Az általános CRC32 egy előjel nélküli 32 bites egész. ezért a következő kód a CRC-t 32 bites előjel nélküli egészre konvertálja. $bsize = filesize($path . mintha ugyanolyan méretűek lennének.Gyors megoldások tást állít elő. + $bcrc. a $a-t és a $b-t nézi meg. print("<br>CRC a: " . a más rendszereken generált CRC-kkel való összehasonlítás végett. r print("<br>Size a: " . Az alábbi kód a negatív CRC-ket kivonja a 4 milliárdból.jpg" . Ez a példa azt mutatja meg. b: 4254207736 287 . Az eredmény: Thirtytwo: 4294967296 CRC (unsigned) a: 199407017. $b) $bcrc = (double) crc32($path . így kapja meg a végeredményt: $thirtytwo = (double) 256 * 256 * 256 print("<br>Thirtytwo: " . A CRC alapján megkülönböztethető a kettő. A következő kód két fájlt. $a). b: 60810 1 9 9 4 0 7 0 1 7 . $thirtytwo).

$bcrc = dechex($bcrc). $bcrc ). } if (strlen($bcrc) < 8) { $bcrc = "0" . if (strlen($acrc) < 8) { $acrc = "0" . $bcrc. fejezet Fájlok A következő kód az előjel nélküli számot hexadecimálissá alakítja. Az eredmény: CRC (hex) a: 0be2b5a9. ". $acrc. b: fd920ef8 288 . $acrc .8. Ha a szám elveszíti az első nullát. az if()-es kódrészlet visszaadja azt: $acrc = dechex($acrc). } print("<br>CRC (hex) a: " . b: " .

9. fejezet Űrlapok Gyors megoldások Űrlap létrehozása Űrlapok létrehozása függvényekkel Hosszú lista létrehozása űrlapon belül Oszlopok igazítása Egy válasz a sok közül Egy válasz a sok közül rádiógombokkal Több válasz a sok közül Válaszok megőrzése és hibák kiemelése oldal: 307 307 309 311 314 317 318 323 .

és a POST mind nagy értékekkel. GET. az <input> tag-ek helyettesítik az URL-lekérdezési sztring egyedi elemeit. Az első példában minden kizárt dokumentumot elneveznek egy mezőn keresztül. például excludeOl. "$exclude01=dl991122&exclude02=d3010304" . hogy a kód újraírása nélkül gyorsan és egyszerűen építhess fel űrlapokat. a második forma ezzel szemben jóval több dokumentumnevet kezel. (Van egy olyan POST-űrlaporn. amelyet a rögzítési kezdő.és végtag közé teszel. amikor változókkal töltőd fel őket. A rögzítő tag a változókat egy URL-en keresztül továbbítja. mind az értékek hosszú listájával működik. amely 49. és a 20.) Az űrlapokban a <form>-tag helyettesíti az <a> rögzítő tag-et. a PHP-tömbökkel pedig hosszú listákat adhatsz hozzá ezekhez az űrlapokhoz. esetleg adatbázisba vagy XML-fájlba akarod fordítani az űrlapfüggvények bemenő adatait. de az URL-ek gyorsan zavarossá válhatnak. hogy a már megtekintett dokumentumokat kizárja.9. " & f ind=tropical+rain+forest+conservation">Find</a> 290 . Ha már végeztél az 5. Az űrlapok elküld gombjai a navigációs célú képek és lmkek alternatívájaként is felfogható. fejezettel. A „Gyors megoldások" részben épített újrafelhasználható űrlappal és kérdező függvényekkel anélkül rakhatsz be további kérdéseket és anélkül módosíthatod az űrlapot.000 fájlnevet továbbít az egyik oldalról a másikra. és az űrlapelküldő gomb helyettesíti azt a szöveget. fejezet Űrlapok Áttekintés A PHP-ban könnyű űrlapot létrehozni. A következő példa egy előformázott lekérdezésre mutató normál linket mutat. Alternatív navigáció Az oldalak linkelésének szokásos módja a rögzítő tag. Az űrlapvezérlők a hagyományos űrlapoktól távol eső dolgokra. URL-lekérdezésekből. A lekérdezésnek megvan az a képessége. "&type=document&author=cia . a link első formája a legtöbb böngészőben hibákat okoz.és POST-alapú űrlapokból származó változók egyszerű PHP-beli megjelenítésével gyorsan eljuthatsz a többoldalas űrlapokig és az olyan egyedi űrlapfunkciókig. Az adatbázis felőli megközelítés a gyorsan változó honlapok esetén ideális. A cookie-kból. Mikorra a keresgélő dokumentumok tucatját végignézi. Jelen fejezetben végig az űrlapok kérdéseinek létrehozásának módszereit taglalom. ami a PHP-ban egy egyszerű tömböt hoz létre. míg az űrlapos példa egy example[]-nek nevezett mezőt használ. Az űrlapok az értékeket az átláthatóbb POST-módszerrel továbbítják. az <a> használata. mint a fájlfeltöltés. amelyet ugyanez a link egy űrlapon keresztüli hozzáféréssel követ. így a következő részben említett alternatív navigációra is használhatók. hogy a kódhoz hozzányúlnál. mint amennyit egy session alatt át lehet böngészni: $link = "<a href=\"query-html?" "sortby=date&sortorder=descending&country=Surinamé" .

Sok cég az oldalaikon lévő gyatra hibanaplózás. Vannak oldalak. és azt találta. majd hazament a gyerekeihez vacsorára. hogy hány vásárlót veszít el és miért. "<ínput type=\"hidden\" name=\"sortorder\" value=\"descending\" name=\"sortby\" name=\"country\" value=\"Suriname\">" value=\"date\">" '<input type=\"hidden\" name=\"type\" value=\"document\">" '<input type=\"hidden\" name=\"author\" value=\"cia\">" '<input type=\"hidden\" name=\"exclude[]\" value=\"dl991122\">" '<input type=\"hidden\" name=\"exclude[]\" value=\"d3010304\">" '<input type=\"hidden\" name=\"find\" value=\"" '<input type=\"hidden\" '<input type=\"hidden\" "tropical rain forest conservation\"> '<input type=\"submit\" value=\"Find\">" '</form>". lekérdezési űrlapokat. miért nem töltik ki az emberek az űrlapot. a gyenge kimutatások és elemzések miatt soha nem fogja megtudni. így teljes körű ellenőrzéssel bírsz a tartalom és a formátum felett. Késő este a gyerekek öreg PC-jén a lassú modemmel megpróbálta a referenciaoldalakat megtekinteni. Egyszer segítettem egy reklámügynökségnek bemutatót készíteni egy nagy cég nagyon nagy emberének.Áttekintés $link = "<form action=\"query. A sebesség és kompatibilitás problémájának megoldása különlegesen fontos az oldalad regisztrációs űrlapja esetében. miért. amire nyomtatott űrlapon egyébként ritkán válaszolnak a vásárlók. Ahogy a böngészők egyre inkább támogatják a Cascading Style Sheets-t (CSS). Erőt és rugalmasságot szerzel. hogy bizonyos oldalak nem voltak olvashatóak. mert a regisztrációs űrlapjuk nem minden böngészővel működik. de légy óvatos. hogy azok könnyen használhatóak és minden böngészővel bombabiztosán működnek. hogy nem az ügynökség nyert. feltétlenül győződj meg arról. amikor visszatérsz HTML-be. Nem tudom. és utána csodálkoznak. felírta az ügynökség referenciaoldalainak listáját. Persze. mielőtt a jó öreg <font> tag-eket valami újabbra cseréled. Sőt az űrlap előállítói adott kérdéseket kötelezővé tesznek. ha az egész űrlapot. hiszen a potenciális vásárlók ezt látják és használják legelőször. hogy a zavaró és tolakodó kérdéseket. Az online űrlapokon keresztül történő navigációt nagymértékben befolyásolja. Jelen fejezet szkriptje létrehozza minden HTML-tag minden elemét. de a kódot egyre nehezebb olvasni. és minden alkalommal. A főnök megnézte a prezentációt. Ha nem tudsz gyors változtatásokat végre- 291 .html\" method=\"post\">" . az összes tag-et és paramétert tisztán PHP-ben írod. Amikor regisztrációs űrlapokat. amelyek vásárlók ezreit veszítik el. az emberek szívesen tesznek fel olyan kérdéseket online. vesztesz a PHP erejéből. visszacsatolási űrlapokat és problémajelentő űrlapokat hozol létre. hogy milyen gyorsan tudod az oldalakat megváltoztatni. figyelemelterelő képeket és a nyakatekert szövegeket távol tartsd az űrlaptól. A legkeményebb csatát a marketingosztállyal kell majd megvívnod. úgy csökkentheted az oldalak tartalmának közvetlen formázását. HTML vagy tisztán PHP? A PHP jól keverhető' a HTML-lel.

Szerencsére úgy terveztem meg a weboldalt. mint az <input> • Műveleti tag-re. a megfelelő jogi figyelmeztetés nélkül volt az oldalakon megjelenítve. a rendelési űrlapon meg kellett adni a vásárló címét.9 milliárd ember közül 5. mert a cég kifogyott a termékből. mi lehet a baj. hogy mindent PHP-kóddal hozzál létre. a irányítószámok nem csak öt jegyűek lehetnek. mint aki azonnal szívrohamot fog kapni. akik 10 perccel azután kérnek azonnali változtatásokat. mint egy rendkívüli ajánlat tórlése. és a telefonszámoknál hosszabb körzetszámok is megadhatóak. amikor több válaszlehetó'ség van. így olyan opció is választható. mint az < input type = "submit"> • Végtag-re: </form> Ezeket a tag-eket helyezheted a lap tartalmának elrendezésére szolgáló szerkezetek. mint egy oldal azonnali eltávolítása. Például amikor az első amerikai weboldalak próbáltak meg tengerentúli országokban értékesíteni. de a kiválasztható államok között csak amerikai államok voltak. hogy a tesztcsapat hazament. hogy hazamenjek. így a világon élő 5. Bármikor. A következetesség hosszú távon is meghozza az eredményét. A fejezetben található kódok egy része többválaszos kérdéseket kezel. Szerencsére ebben az e-mail-es világban faxszámot már egyáltalán nem kell megadni. Lesznek olyan vezetők és marketingesek.9. Napjainkban a legtöbb honlap már jobban működik. és naponta több ezer dolláros bírság jár érte. mint másik állam. amikor üvöltést hallottam.6 milliárd nem tudta rendesen beírni a címét. az oldalak használhatatlanok és félrevezetők lesznek. Minél következetesebben alakítod ki a kérdések és űrlapok formátumát és elrendezését. annál egyszerűbb lesz ügyfeleidnek a honlapodon az űrlapokat kitölteniük.html" method="post"> <input type="text" name="anything"> <input type="submit" name="doit"> </form> 292 . A minimális HTML A HTML-űrlapoknak szükségük van: • Kezdő tag-re: <form> • Valamilyen adattag-re. a cigaretta. így elkerülheted a kósza HTML-különcségeket. amit a fejezetben található kód tanít neked. vagy egyáltalán nem kell irányítószámot megadni. vagy a <form> tag-gel az egész táblázatot tedd keretbe és az egyedi <input> tag-eket helyezd az egyedi cellákba. Az egyik dolog. mint azt a következő példa mutatja: <form action="page. így a problémát hamarabb megoldottam. így táblázatok celláin belülre. mérlegeld a szabad formátumú válaszadás lehetőségét. A kérések lehetnek olyan egyszerűek. Egy gyorsan növekvő online-értékesítő oldal fiatal és briliáns marketingmenedzsere úgy nézett ki. mert a vadonatúj termékük. és jó ok arra. mint ahogy a lift megérkezett. az a következetesség. hogy gyorsan meg lehessen változtatni. egyik sem. Néhány évvel ezelőtt a liftnél vártam. így elindultam kinyomozni. fejezet Űrlapok hajtani. de olyan fontosak is. mert annak tartalma törvénybe ütköző.

ha az űrlapot másmilyen HTML-tag szinten fejezed be. Gondosan mérlegelned kell. a sorrend és az adatok elkülönítése. ezt követően pedig ezeket a függvényeket ágyazod egymásba. A legtöbb böngésző megszegi ezeket a szabályokat . amelyek egy másik böngésző használatakor tönkreteszik az oldalaidat. majd először körbeveszem <td>. az űrlap köré egy külön táblázatot teszek. így a kérdések sorrendjét a formázás megváltoztatása nélkül tudod móosítani. Problémáid adódnak. majd mindezt táblázattag-ekkel. amely figyelmen kívül hagyja az összetett formázási lehetőségeket. (A 3. aztán <tr>. tömbök. A megfelelő megközelítés a formázás. és van.és </tr> tag-ekkel. mint amelyik az űrlapot elindítja. ahogy azt a következő példa mutatja. A kérdések sorrendjét tárolhatod egy tömbben. mint a táblázatok. és mit lehet az űrlap köré helyezni. és összetett objektumok segítségével építhetsz fel egy űrlapot. és csak az űrlap logikus és olvasható elrendezéséhez minimálisan szükséges HTML-t használd. bekezdést és a HTML-formázók széles választékát! Vannak szabályok arra vonatkozóan. Amit te akarsz. Például ha egy űrlapot táblázaton kívül kezdesz el. ha az űrlapok elemei a többi HTML tag-hez képest megfelelő szinteken vannak létrehozva. Ili Bell és Whistle A HTML-ben nincsen <bell>-tag. amely a rosszul formázott HTML-t is elfogadja. fejezetben teljes részletességgel esett szó a tömbökben használt listákról. némely böngésző össze fog zavarodni. Ha az űrlapot az oldal egy részére kell elhelyeznem. Az egymásba ágyazott PHP-függvényekkel sokkal megbízhatóbban lehet űrlapokat létrehozni. Azt javaslom. és a táblázat egyik cellájában fejezed be. A szerkezetet egységessé és szimmetrikussá kell tenned. amely sortörést szúr oda. és végigfuthatsz a tömbön. hogy az egész oldalt át kellene szerkeszteni. és a top 30-as listámon levő összes böngésző megbízhatón kezeli az űrlapokat. Az űrlap vége is szúrhat be sortörést vagy szóközt. mint a Dreamweaverrel vagy más drága honlapkészítő programmal. ahova nem kellene. A PHP-ban egyszerű függvények. hogy az űrlapot milyen bonyolulttá teszed csupán annak érdekében. van. Böngészők és böngészőverziók tucatjaival tesztelem az oldalakat.van. hogy az megfeleljen a marketingrészlegnek is. a PHP-ban pedig nincsen whistle()-függvény.Áttekintés A <form>-tag több böngészőben is megzavarhatja a szóközöket. Könnyebbé teheted az űrlapok és táblázatok szimmetrikus elrendezését és egymásba ágyazását. az nem más. Az űrlapok tartalmazhatnak további formázási elemeket. és a kérdésekben is bárki ki tudja a szavakat cserélni anélkül. és végül az egészet űrlaptag-ekkel. mivel a kedvenc böngésződ elfogadhat olyan hibákat. amikor a tesztelők jelzik az űrlappal kapcsolatos problémákat. ha minden egyes layert függvényként hozol létre. hogy mi kerülhet az űrlapba. mint hogy a legegyszerűbben megváltoztathasd az űrlap formáját. például az űrlap egyes elemeinek az elrendezését szabályozó táblázatot. Egy űrlap kezdete bizonyos böngészőkben hasonló sortörést szúr be. tartózkodóan állj a kérdéshez. Én általában létrehozom az <input>-ot.és </td> tag-ekkel.) A kérdések sorrendje egyszerűen megváltoztatható a tömbelemek felfelé vagy lefelé való mozgatásával: 293 .

majd az elemek egyenkénti feldolgozására használd a while()-. A guaran^: a koffein egy lehetséges forrása. Amikor ezt a listát kiválasztható elemekké konvertálod. $id = strtolower(str^replace(" ". használhatod az elem indexszámát arra. $display_name)). Először állítsd a tömböt az elejére. Gondold végig a következő. Az ilyen nevet listából kiválaszthatóként kell megjeleníteni. A PHP tömbfeldolgozását használva futtass ciklust a tömblistán. Amikor egy listát dolgozol fel.és each()függvényeket. de a while(each()) ciklusnak számtalan előnye van. Például akkor is helyesen adja vissza a következő tömbelemet. mint a feltett kérdések típusa. ha a cikluson belül új elemet szúrsz be vagy törölsz a tömbből. A szöveg különböző nyelvű oldalakon történő megváltoztatásához nézd meg a 12. Az elsődleges cél az egyéni névazonosítóként való használatának elkerülése úgy. "country". Ha összetettebb neveid vannak. A „Gyors megoldások" részben számtalan példát mutatok erre. n = whileflist . Miután a sorrendet és a formázást elkülöníted a kérdések tartalmától. $ } ötlet: A fenti kódban használhatsz for()-ciklust is. hogy az egyes listákat egy egészként dolgozzuk fel. "Durian". 294 . fejezet Űrlapok $questio [] "name". hogy összezavarja az embereket. mert eltávolítja a megjelenítési nevekből a szóközt. hogy ne kelljen a karakterek feldolgozásával foglalkozni.és nagybetűket. n = $questio [] . így a $fruit["Apple"] nem azonos a $fruit["apple"]-vel. "Guaran*". hogy a PHP-tömbök megkülönböztetik a kis. hogy az elemet újra megtaláld a tömbben. hogyan lehet a szöveget strukturált formában bevinni. Légy óvatos a megjelenítéshez és azonosításhoz használt nevek keverésével. illetve technikákat. hogyan használhatod a más emberek által szerkesztett kiterjedt szöveglistákat. amikor egy szövegdobozba vagy kódba próbálják a nevét begépelni. és mindent kisbetűre állít: $display_name = "Macadamia nuts". n = n = $questio [] ■■ "city". és 20. "Black Sapote". Szeretem a következő trükkös kódot. Ne felejtsd el. "Otaheite Gooseberry". koncentrálhatsz az oldal felépítésére és az olyan témákra. űrlapba kerülő elemek listáját: $fruit[] $fruit[] $fruit[] $fruit[] $fruit[] = = = = = "Akee". amelyekben az egyéni elemeket azonosítani kell. $v) = ($k each($question)) print ( "<br>The question is: " . fejezetben. $questio [] ■ "address". és a benne levő ékezetes karakter alkalmas arra. azonosítóként a listaelem számát használd. egyszerűbb lehet az elemeket a számuk alapján azonosítani.9. HstQ. "". Mindkét fejezetben több módszert is találsz arra. illetve elkerüljük az olyan kódokat. amelyek jól jöhetnek az űrlapkérdéseidnél.

• az állam kötelező megjelölése. Olyan kérdést akarsz feltenni. ábra mutatja. • nem minden országban van irányítószám.ha kívánnak. Yes <input type="radio" name="fish" value="yes" checked> 295 . ahogy a 9.1.2 ábra Válasz egy Igen/Nem kérdésre Mi történik a HTML. és amely a felhasználó válaszadási lehetőségét adott válaszlehetó'ségekre korlátozza.&nbsp. A böngészőben a kérdés úgy jelenik meg. Eldöntendő kérdések A következő kérdésekhez jól alkalmazhatók a HTML-rádiógombok: • Szokott halat enni? Igen/Nem • Szokott tejterméket enni? Igen/Nem • Ablak melletti ülést szeretne? Igen/Nem A rádiógombok akkor használhatók a legjobban. amelyet a felhasználó könnyen megért. • nem minden országban ötjegyű az irányítószám.1 ábra Igen/Nem kérdés rádiógombok használatával A válasz pedig úgy. The value of $fish is yes 9. Itt van példának néhány az űrlapokkal kapcsolatos gyakori hiba. ahogy a 9. ábra. ha a több lehetséges válasz közül csak egyet lehet megjelölni.és PHP-kódban? A HTML a következő: <form action="radiobutton. ami a nemzetközi oldalak űrlapjainak tervezését érdekessé teszi. egy üres szövegmezőbe pedig megjegyzést írhatnak a felhasználók .&nbsp.Áttekintés Űrlapkérdések A HTML-lel számtalan módon lehet kérdéseket feltenni.html" method="post"> Do you eat fish?&nbsp. hogy sok országban nincsen az amerikai államoknak megfelelő fogalom. • minden országnak megvan a maga sajátossága. A kérdéstípusokat keverheted is. amelyeket az ázsiai és csendes-óceáni piacra betörni szándékozó amerikai cégek weboldalain találtam: • rögzített kijelölési lista az államok neveivel. az ausztrál államok bejelölésének lehetősége nélkül. Do you eat fish? Yes' 1 No^ 9. például rádiógombokkal megadsz három lehetséges választ. és válaszokat kapni az egyszerű bejelölődoboztól és rádiógombtól kezdve a kiterjedt kijelölési listákig. figyelem kívül hagyva.2.

hogy a név nincs keveredésben egyetlen másik PHP-változóval sem. Adhatsz az egyes válaszoknak más és más nevet. amennyit csak akarsz. az első < input> tag-nak a fishyes-t. de nem hiszem. ha az elküld gombra kattint: if(isset( $ f ish)) { print("The value of \$fish is " . de nehezen kezelhetővé válik.if(isset($fish)). hogy minden válasznak ugyanaz a neve. feltéve.9. Ha kihagyod a value-mezőt. amelyre egy. a másodiknak a fishno-t adva. hogy a többszörös választás minden böngészővel és operációs rendszerben működik.&nbsp. mi jelenik meg hiba esetén. Ezen nehézség illusztrálására a következő kódrészlet két sort tartalmaz a halas-kérdéses példából. A PHP a kiválasztott értéket a fish-nek nevezett mezőben adja vissza. Ez olyankor fontos. question2 stb. hogy az összes böngésző ezt tenné.Snbsp. és hogy hova jut a felhasználó. hogy többet lehessen megjelölni. Egy kérdésre annyi válaszlehetőséget adhatsz.&nbsp.3 ábrán látható lista: 296 . ahogy a következő fish-példában mutatom. Egy vagy több válasz lehetséges? Sok olyan kérdés van. melyekre használható a HTML <select>-tag. és a példában az érték a következő kóddal van megjelenítve. Ha kihagyod a name-mezőt. amelynek eredménye a 9.&nbsp. hogy mindkét rádiógomb neve fish. ha a válaszok száma több: <input type="radio" name="fishyes" value="yes" checked> &nbsp. "\"" .<input type="submit" value="Test"> </form> Vedd észre. be van jelölve. a $k-nak a használata. hogy az egyes mezők jelenlétét tesztelhesd. " name=\"question" . több vagy egyetlen válasz sem adható. " value=\"yes\" checked>". és rákereshetsz az on értékű mezőre. A nevet egy közös előtag használatával hozod létre. amikor a kérdésekre kevés válaszlehetőség van. de ez többválaszos kérdéseknél bonyolult lehet. A <select> tag-gel egy választ lehet megjelölni. és a kód. íme példaként néhány kérdés. amikor az űrlapoldalak saját magukra mutatnak az eredmények vagy a hibák megjelenítésére. némely böngésző az előző rádiógomb nevét fogja használni. $k . Tegyél megjegyzést az oldal tetejére. jóllehet nem biztos. Ez a fajta megközelítés egyszerűbbnek tűnik. Figyeld meg a fish létezésének ellenőrzését . ami a példában a question.No<input type="radio" name="fishno" value="no"> A name-mezőt minden egyes kérdésnél különbözőre állítsd.No<input type="radio" name="fish" value="no"> Snbsp. question 1. A legjobb technika talán a kérdés sorszámának. Az űrlapból visszajövő mezők questionO. és mindkettőhöz van érték rendelve. mely elmagyarázza. amely ebben az esetben a yes. Az alapértelmezett érték. a PHP az értéket on-ra állítva adja vissza. és győződj meg arról.&nbsp.Snbsp. olyan kérdések. mi jelenik meg az első belépésnél. de beállítható úgy is. fejezet Űrlapok Snbsp. nevet kapnak: $question = "<input type=\ "radioV" . $fish).

"<select name=\"favorite\"Xoption>Sparkling Ale</option>" "<option>Pale Ale</optionXoption>Dark Ale</option>" . "<option>Light</optionXoption>DB</optionX/selectx/form>") (Sparkling Ale Pa* .Áttekintés • Mik a kedvenc gyümölcseid? • Mit csomagolsz. hogyan tudnád a problémás kérdést feltenni legközelebb. hogy az emberek kihagyják az olyan kérdéseket. amikor a vásárló nem tud egy kérdésre válaszolni. egy csomó változót kapsz. és megkérdezi. mentsd el a többi választ. amelyek megkövetelik. mert így könnyen adhatok hozzá új elemeket. amikor egy bolt gyerekkocsit ad el neked. amely a kiválasztott elemek listáját tartalmazza. "<option>Special Old Stout</option>" . hogy még a tervezési fázisban vagytok. és gondolkodj el azon. "<option>Vintage Ale</option><option>Old Stout</option>" . amelyek egy igen/nem válasszal vannak beállítva. amely a következőket kérdezi: • Szereted a banánt? 297 FII .3 ábra Válaszd ki a kedvenc sörödet a <select> használatával Gondolj végig egy olyan helyzetet. hogy pontosan mit akarsz. majd a regisztrációs oldal közepén megkérdezik a termékről a véleményed. "<option>Genuine Draught</option>" . "<option>Stout</option><option>Premium Ale</option>" . amire nem tudnak válaszolni. Lehet. amikor Sydney-be utazol? • Válaszd ki a kedvenc Copper sörödet! print("<form action=\"query. Szeretem az olyan szoftvercégeket. az érvényes válasz. amikor az emberek a honlapodon járnak. mi felel meg a programozási stílusodnak. vagy csak a kutyádat akarod kényeztetni. vagy pedig egy tömböt. Amikor az űrlapból megjönnek az eredmények. Te választhatod ki.-\ e Dark Ale Stout Prémium Ale Vintage Ale Old Stout Special Old Stout Genuine Draught Light DB 9. hogy használat előtt regisztráld a terméket. Gondold végig a következő űrlapot. A semmi. Engedd. En általában a listamegközelítést alkalmazom.html\" method=\"post\">" . hogy hány gyereked van. Az egyetlen őszinte válasz a következő lehet: Eddig a termékük az időmet rabolta és semmi hasznom nem származott belőle! Ugyanez a probléma merül fel.

Nézd végig a listát. összetett műveleteket is végrehajthatsz. hogy melyik oldalt kérje. ezért változtasd meg a formátumot. így a vásárlód mondhatja. és a lap tetején elvégzed a feldolgozást. Bárki újabb gyümölcsöt adhat hozzá anélkül. mintha egy másik tömbben a kiválasztott gyümölcsök egyszerű listáját kapnám. Jobban szeretem azonban a listát tömbben megkapni. Mindegyik gomb egy teljesen különböző űrlapnak lehet az 298 . hogy a „Szereted" kérdés fejrészként jelenjen meg. hogy pontosan milyen kérdésre van szükséged. A fejezet „Gyors megoldások" részében találsz arra is példát. a Soranges-t szintén igazként vagy hamisként és így tovább. amelyik action="_page_name_"-et tartalmaz. amikor többet. Azt. ahol a _page_name_ annak az oldalnak a neve. ne a gyümölcsök egyszerű listájaként. vagy „Töröld a rendelést". amely semmit nem jelenít meg. $book.4 ábra Többszörös elküld-gomb A PHP-kódban egyszerű az összetett műveletek kezelése. amikor a vásárlók egyetlen elemet választhatnak a listából. mert minden egyes elküld gombtól különböző' mezőt kapsz.vagy $saveváltozók valamelyikét kapja vissza. amit több űrlap egy oldalra való helyezésével oldhatsz meg. illetve save-nek. Ha a felhasználót új oldalra irányítod. Összetett műveletek Az űrlap elküld. Gondold végig. és arra is. hogy „Gyerünk. A böngésző kiválasztja. majd próbáld ki a kódját. hogy az űrlap adatainak feldolgozását egy rejtett oldalon végzed el. a szkripted a $recalc-. Néha egynél több oldalra akarod az embereket irányítani. hogy a felhasználót a megfelelő oldalra irányítsa. és az if(isset($recalc))-hez hasonló kód használatával a megfelelő műveletet választhatod ki. tehát melyik szkriptet kéri. hogy a böngésző melyik oldalt. és átirányító fejlécet küldesz a felhasználó böngészőjének. A PHPkódodban az űrlap visszaadhatja a $bananas-t igaz vagy hamis értéket tartalmazva. könnyedén megjelenítheted ugyanazt az oldalt és űrlapot. ha egy oldal csak a 9. majd a kérést elküldi a szervernek. amelyet a böngésző akkor kér. Recalculate faré Book the trip I Savé for later 9. fejezet Űrlapok • Szereted a narancsot? • Szereted az almát? A kérdések listája hamar unalmassá válik. választhatod azt.4 ábrán látható három gombot tartalmazza. számlázz nekem". visszaállít vagy töröl gombbal végződik. ha a felhasználó az elküld vagy visszaállít gombra kattint. Ha az Ár újraszámolása gombot recalc-nak nevezed és a többit értelemszerűen book-nak.9. te döntőd el az oldal nevének a műveleti paraméterbe írásával. mi történik. hibaüzeneteket beszúrva és további információkat kérve. Az első HTML-tag egy űrlapban a <form>. ahogy a 9. Nem vagy erre a két opcióra korlátozva. amely tartalmazza a kérdéslistába kerülő gyümölcsöket. hogy a kód egyetlen sorát meg kellene változtatnom.4 ábra mutatja. Ugyanarra az oldalra akarod visszaküldeni a felhasználót vagy egy új oldalra? Ha ugyanarra az oldalra küldöd őt vissza.

a szkript folytatódjon vagy leálljon. hibaüzenetet küld. A csinos gördülőmenük eltávolítása Az első lépésben a csinos JavaScript-gördülőmenüket kell eltávolítani.000-ra való csökkentése működhet. a másolatban megváltoztatják a JavaScript-et. Miért? Azért fizetnek engem. mint az Opera. az olyan böngészőkben pedig. Ugyanis az oldal közepén egy JavaScript által szabályozott mezőre kattintva az össze nem-függő mezők tömkelege tűnik el. Mezők érvényesítése a szerveren A ÍI.vagy cookie-alapú bevásárló kosarat próbálsz hackeléssel módosítani. a Recalculate Faré (Ár újraszámolása) pedig egyszerűen visszaugrik az előző oldalra. így a saját PHP-kódodban mindent ellenőrizned kell. de mindenki számára érthető is. hogy lemásolják az oldalt. A Book The Trip (Az utazás lefoglalása) gomb egy a bankodnál lévő biztonságos oldalra mutathat. majd egy egyedi oldalon kell a szétválasztott kiválasztó űrlapokat megjelentetned. amelyek nem minden böngészővel működnek. 299 .Áttekintés elküldés gombja. Ehhez bizonyos lépéseket követek. az egyes embereket össze fog zavarni. különösen az árakat és az végösszegeket. Sok honlap használ befejezetlen és rosszul formázott JavaScript-et. JavaScript Sokszor a tapasztalatlan. hogy működnek.000-ról $1. hogy új számítást végezhessen. hogy ugyanezt a JavaScript-et eltávolítsam. mennyire jól csinálod meg a JavaScript-et. és hibás adatokat küldenek. Ha a szerveren egy mezőt a PHP-vel ellenőrzői. Mindegy. amely csak Microsoft Internet Explorer alatt működik. Gyakori tünet egy félig üres oldal. nem sok időt takaríthatsz meg a böngészőben a mező JavaScript-tel való ellenőrzésével. Ötlet: Ha egy JavaScript. amely felfrissíti a felhasználó profilját. vagy amelyet teljesen egészében más valaki szkriptje hozott létre. és a haszontalan adatokat távol tartsam az adatbázistól. amely nem csak egyszerűen felépíthető a PHPban. Az összetett űrlapok használatához először össze kell gyűjtened az adatokat. Az egyik trükk úgy működik. Olyan adatot kaphatsz eredményül. és vagy rossz mezőbe bevitt vagy teljesen hiányzó adat lesz az eredmény. hogy az űrlap minél több böngészővel működjön. a Savé for Later (Ments el a későbbiekre) egy olyan oldalra mutat. egyedi kérdésekkel és műveletekkel. A normál HTML <select>-tag olyan gördülőmenüt biztosít. hogy eldöntse. A honlap tulajdonosai később rengeteg pénzt fizetnek nekem. ha a felhasználó a második űrlap elküldés gombjára kattint. A második lépésben minden mezőt érvényesítened kell a szerveren. és ha úgy tűnik ís. Az egyetlen probléma az összetett műveletekkel az adatkoordináció hiánya. amelyet a szkripted csak részben érvényesített. és megengedi a böngészőt használó embernek. Az én feladatom az. Ami ennél bonyolultabb. Egy oldalon nem gyűjtheted össze az első űrlap adatait. hogy megjavítsam az űrlapokat. az oldal adatbázisa végül tele lesz érvénytelen adatokkal. a JavaScript-et először használó fejlesztők fejest ugranak a legördülő kiválasztási listába és a bonyolult adatellenőrzésbe. a végösszeg $5. és azután a másolat válaszol a böngészőből. de a $10 nem azt valaki mindig észre fogja venni. az emberek kijátsszák azt.

sokkal egyszerűbb a kérdések új sorrendbe rendezése és az oldalak részekre bontása. 300 . és a választól függően behívod vagy átugrod a cukorbetegek számára szánt kérdéseket tartalmazó oldalt. Egy nyomtatott kérdőíven a „Cukorbetegek részére" című szakaszt vagy kitöltőd. Ennek az online megfelelője a „Cukorbeteg Ön?" kérdés az első oldalon. sokan egyszerűen otthagyják az oldalt. amiért azt kitöltenénk. majd a részeket különböző oldalakon helyezni. A formázás és a kérdések különválasztásával. a korra a választható legkisebb vagy legnagyobb értéket jelölöm be. a jövedelmi szintre pedig egy olyat. megállapíthatod. minden részben egy fontos kérdéssel. Mi történik. Hosszú űrlapok A többoldalas űrlapok zavaróak. Ez a probléma online még bonyolultabb az emberek számára. sokan pedig azt teszik. ha az e-mailre vonatkozó kérdést egy külön oldalon teszed fel. évi amerikai elnökválasztás floridai problémája azt mutatja meg. H Gondolj egy olyan élelmiszert árusító honlapra. felmérésékre és játékra csalogató űrlapokra. haszontalan leveleket. és ehhez tudni akarja a vásárló korát. hogy az olvasó pozitív választ ad a „Szeretne ilyen jellegű emaileket kapni?" kérdésre. hogy üresen hagyott kötelezően kitöltendő mezőkkel ne fogadja el az oldalt. A nemre vonatkozó kérdés néha megengedi. vagyis hamis. ami teljesen irreális egy koplaló szerző esetében. Ha az űrlapot a szerverre küldöd és ott érvényesíted. így nagyobb a valószínűsége. és soha nem térnek vissza. mert oly sok marketinges küldözget időpocsékoló.vagy hátraugrani. hogy milyen típusú választ vársz. ha nincsen igazi ösztönző. ha például egy ételreceptet tartalmaz. Én soha nem kérek e-maileket. Az oldalnak egymáshoz kapcsolódó részekre kellene a hosszú űrlapot bontania. és ezt az információt továbbíthatod az űrlap tervezői felé. Hosszú űrlapoknál nagyon hasznos. és nem tudják az űrlap különböző részeit összehasonlítani. és mellékelsz egy levélmintát? A levél lehet érdekes és hasznos. fejezet Űrlapok Biztosan lesz olyan projekted. A hosszú űrlapok feldarabolása Rengeteg online-bolt honlapján találhatunk példát a túlságosan hosszú űrlapokra. jövedelmét és nevét. vagy átug-rod. összevissza válaszokat adnak a rámenős és a tárgyhoz egyáltalán nem tartozó kérdésekre. hogy az Egyébre kattintsak.9. milyen könnyű az embereket az űrlapokkal megkavarni. regisztrá ciós oldalakra. amelyek elriasztják a potenciális vásárlókat. Ha a potenciális vásárlókat a visszaküldött oldallal megállítod. A következő rész arra vonatkozólag tartalmaz útmutatást. hogy melyik mezőre nem válaszolnak a látogatók. mert nem tudnak előre. amely szeretne a vásárlóknak hetente e-mailt küldeni. hogy elhagyják az oldalt. így ha egy új látogató az egyik oldalon kitölti az egyik űrlapot. Sokan kitöltik az ilyen űrlapot. Ezért a különböző oldalakon ugyanazt az elrendezést kell követned. utána bármelyikkel képes lesz megbirkózni. hogyan kezeld a többoldalas űrlapokat. lehet. A 2000. ha a honlapod összes űrlapján az összes kérdést ugyanazzal a formázófüggvénnyel alakítod ki. amit én. amikor valaki ragaszkodni fog a JavaScript használatához. amely vizuális segítséget nyújt a kérdéshez és ahhoz.

és semmit sem kell egyik oldalról a másikra továbbítanod.. semmit nem célszerű addig elmenteni. Minden böngésző más szabályokat követ a cookie-kra. Az új profil részére az adatokat rejtett mezőkkel továbbíthatod oldalról oldalra. hogy segíthessünk a gyermekeit táplálni.ha van session -. és kérdezd meg az összes családtagjának az életkorát. A továbbításra a legjobb hely egy session-rekord . hogy ha az űrlapot kitöltője félig kész állapotban otthagyja. később visszatér és megpróbálja folytatni. akkor az összes utána következő oldalra új rejtett mezőket kell beszúrnod. A cookie-k problémája akkor jelentkezik. egy kis csábítással felteszed a kérdést. Tudni kell azonban. majd rejtett mezőkön a második oldalra továbbíthatók. de pontatlan válaszokat kapni. mosolygó csecsemők fényképét beszúrva tedd fel a „Segítsen nekünk. A cookie-specifikáció azt mondja ki.Áttekintés Ahelyett. ha ezek kifutnak a képernyőről. amely a bébiételeid hihetetlen széles választékát mutatja be. kérem. de ha egy többoldalas űrlap kellős közepén új oldalakat kell beszúrnod. és az egész designt újra kell gondolnod. amely a honlap életkorhoz kötött funkcióját mutatja be. hiszen a session-rekordból a honlap összes oldala elérheti a nevet.) Mindig jobb pontos választ kapni egy kérdésre. A cookie-k egyszerűbbek. hogy éjszakára a vásárló gépén maradhatnak. majd kérdezd meg a korát és egyéb személyes kérdéseket. Cookie-k állítása az összes oldalra Ha arra kérsz egy felhasználót. Tipikus stratégia az első oldalon a felhasználó keresztnevének megkérdezése. majd jöhetnek a kísérő anyagok. és minden egyes oldalhoz új cookie-t állíthatsz be. A cookie-k segíthetnek ezen. A cookie-knak megvan az az előnyük. Próbáld ki. ami nagyon unalmas lehet és hibákat okozhat. hogy egy oldalon egy témával foglalkozol. az adatokat azonnal a profilba mentheted. <input type="hidden">> könnyen lehet a hosszú listákhoz hasonló dolgokkal használni. Például az oldaladon. aki másnap folytathatja ugyanannak az űrlapnak a kitöltését. hogy töltsön ki egy többoldalas űrlapot. Rejtett mezők használata A rejtett mezőket. Amikor azonban egy új vásárló profiljához gyűjtesz adatokat.. az egyik oldalról a másikra az információt rejtett mezőkkel. amikor egy hosszú űrlapnak már több oldalát felépítetted." kérdést. amíg az utolsó oldalon a vásárló a beleegyezéseként az elküld gombra nem kattint. 301 . küldj neki egy oldalt. mondja meg. mint az összes kérdést feltenni. (Nem számít. hogy domainenként csak 20 cookie-t használhatsz. cookie-kal vagy session-rekordokkal továbbíthatod. Az információ oldalról oldalra való továbbítása Ha többoldalas űrlapjaid vannak. az első oldalon bevitt adatok egyenesen az adatbázisba kerülhetnek. hogy a nevét a következő oldalak tetején megjelenítve sokkal személyesebbé tedd az oldalt. mert egy cookie-ba bármit bedobálhatsz. Amikor egy vásárló profilját frissíted fel. Csak a sorrendben utolsó szkriptnek kell az egyes cookie-kat végignéznie. tehát ez csak útmutató. ami eleve kizárja. Belefutsz a cookie-k korlátaiba. a rejtett mezők nem működnek. hogy közvetlenül kérdezed meg valakitől a korát. A nevet legegyszerűbben egy rejtett mezővel továbbíthatod. de azoknak is megvannak a korlátjaik.

A session-rekordok problémája ideiglenes természetükből adódik. A cookie-k természetesen akkor sem működnek. Egy modern adatbázisban szöveges mezőben vannak eltárolva.frame=src. ha a cookie-k nem elérhetó'k. Éppen emiatt a felhasználók nem tudják könyvjelzővel megjelölni egy sessionegy oldalát. Egyetlen session-rekordban tárolni lehet az összes ember által a világ összes kitöltött űrlapjából származó szöveget. hogy egy űrlap nagyobb lehet a figyelmem értéktartományánál és a gépelési képességeimnél. A session-ük összes információját el kell mentened egy felhasználói profilban. be. Belátható. A session-öket a 19. fejezet Űrlapok hogy egy 21 oldalas űrlapot hozz létre oldalanként egy cookie-val. hogy a session-ödbe belenyúljak. hogy kikeresd az oldal nevét és a session-azonosítót.area=href.tags = "a=href. Nem egyszerű egy session-höz újra csatlakozni. amely naponta törli a cookie-kat. vizsgáld meg a cookie-fájljait (a Netscape-ben cookies. Kapcsold ki a cookie-kat a böngészőjében. hogy a cookie-kat azok korlátai miatt inkább csak session-azonosítók tárolására érdemes használni. hogy mit kell tenned (a PHP 4.0. ha a vásárlóid kikapcsolják a cookie-kat. ha a vásárló a munkahelyi számítógépén kezd el kitölteni egy űrlapot.use_trans_sid = 1 url_rewriter. és másnap a profil tartalmát felhasználva kell új session-t létrehoznod. hogy az esemény végén elfelejtse őket.és kijelentkezési rendszer kell létrehoznod felhasználói névvel és jelszóval. hiszen egy egyszerű módszer biztonsági kockázatokat okozna. ami azt jelenti. segítségükkel aktívan tarthatók a megkezdett sessionök.input=src.tags pedig beállítja a HTML tag-paraméterek listáját.5 alapján). ha elmész ebédelni. Jelentkezz be ugyanarra az oldalra bármi302 . lehetővé téve más embereknek. vagy úgy állítják be a böngészó'jüket. de íme egy gyors lecke. A cookie-k használatához be kell kapcsolnod a use_cookies-t a php. Ezzel már elindulhatsz egy tesztoldalon: session. ötlet: Hogyan kalőzkodj a gyengén programozott oldalak session-jein: Amint a kollégád hazamegy.form=fakeentry" Session-rekordok használata A session-rekordok bármilyen méretűek lehetnek és akárhány bejegyzést tartalmazhatnak. amely az URL-eket továbbítják. így kényszerítve az oldalakat.9. az összes többi információ pedig session-rekordban való tárolása. és maximum négy milliárd karaktert tartalmazhatnak. a use_trans_sid automatikusan az URL-be kell tegye a sessionazonosítót. fejezetben mutatom be. Elméletben használhatod újra ugyanazt a session-azonosítót. A honlapok oldalai közti kommunikáció ideális megközelítése a session-azonosító cookieban. Szintén problémát okoz. esetleg olyan szoftvert használnak. a rekord több terabájtos is lehet. hogy URL-t használjanak.use_cookies = 1 session. hogy másnap ugyanonnan folytathassák. Ha meg akarod engedni. és a session-azonosító oldalról oldalra való továbbítása miatt a cookie-któl vagy URL-ktől függenek.txt). így egy hosszú űrlap összes információját nem gyűjtheted ki egy cookie-ba. de ezzel lehetővé teszed. és az otthoni PC-jén próbálja befejezni. hogy az emberek másnap ugyanahhoz a session-höz csatlakozzanak. túllépik a rendelkezésre álló időt. Amikor a böngészőből kilépsz.ini-ben (ha lehetséges). a rewriter. hogy a session-öddel kalózkodjanak. Ha egy session-rekord egy modern operációs rendszer külön fájljában van. a session-rekordok eltűnnek. A cookie-k maximális mérete 4KB.

hogy vásárolhassanak. potenciális vásárlókat fogsz elveszíteni. majd adj neki ösztönzést. ha már belépett. helyezd ezt valahová a lap tetejére. hogy vásároljon valamit ahhoz. Úgy tervezd meg az űrlapot és az azt támogató kódot. ezzel is emlékeztetve a felhasználót arra. hogy őszinte választ kapj. Másként megfogalmazva. miért kell egy irodaszert értékesítő oldalon a nememre rákérdezni . Ugyanez igaz a jövedelemre és nemre vonatkozó kérdésekre. mit írtam az első oldalon. hogy mégis megtegye. így általában rengeteg időd van mindenre. A session-ök akár több óráig a szerverfájlban maradnak. Ha a fiataloknak szánt ösztönző az X-akták DVD-n. ha nem válaszol ezekre a kérdésekre. melynek megválaszolásáért valamilyen ösztönző jár. Ezt a tartományt tekintem mérvadónak.Áttekintés lyen más névvel. vissza tudok emlékezni. akkor ajánljon fel ösztönzőt vagy valamilyen nyereményt. amikor a második oldalt írom. az idősebbeknek pedig a Moulin Rouge DVD-n. hogy ő már be303 . Ha a felhasználói profilhoz hasonló űrlapot kell létrehoznom. hogy 95 éves vagyok! Adj visszajelzést Ha már van valamilyen információd. adj neki felhasználói nevet a belépéshez. mielőtt a látogatót az agresszív vagy unalmas kérdéseiddel felizgatnád. az a cél vezet. nincs szükséged a vásárlók életkorára ahhoz. és ezt használja a következő oldalak alapjaként. cigarettát vagy pornográf dolgokat árulsz (illetve semmi olyat. a marketing célú kérdéseket pedig hagyd későbbre. Fizesse meg a marketing a zaklatást Ha a marketingmenedzser tudni akarja az ügyfél életkorát.ösztönzőket venni mindenkinek jó üzlet. hogy a felhasználó az űrlap elején azonosítsa magát.ha férfi vagyok. akkor rózsaszínt? Ha az oldaladon nem alkoholt. hogy az első oldalon csak a vásárló nevét és email-címét kérd. hogy megkapja az ingyenes ajándékot . figyelembe veszem a mások hasonló jellegű képességét. Használható hosszú űrlapok tervezése A emlékezőképességem két oldalnyi. Te megkapod a korát. Halvány fogalmam sincsen. hogy az ösztönző nem indukál torzítást. hogy félúton abbahagyhassák a regisztrációt. Ahhoz. például egy ingyenes ajándék a következő szállításban. majd vágd ki és másold a kollégád session-azonosítóját a te URL-edbe. Sok kicsi sokra megy Ha valaki addig nem lehet új vásárlód. amíg egy hatalmas űrlapot ki nem tölt. kék tollat küldenek. de amikor a harmadik oldalt írom. és később a felhasználói nevükkel visszatérhessenek. A regisztrációs oldalon a legszükségesebb kontaktadatokat szerezd be. ha nő. és csak akkor tegyél fel neki további kérdéseket. ő pedig ösztönzést kap. hogy a döntő fontosságú e-mailcímet azelőtt elmentsd. amihez a törvények minimális életkort ír elő). amellyel azonosíthatod az űrlapot kitöltő felhasználót. már nem. a vásárló ismerje meg a belépési információkat. Azt javaslom. Engedd a felhasználót akkor is regisztrálni. és amikor űrlapokat tervezek. Alakítsd ki úgy az oldalt. Az életkorra való kérdés lehet egy különleges bónuszkérdés. győződj meg róla. akkor azt mondanám.

=> "Address". oldalanként 10 kérdést állítva be. Az űrlapot kezelő oldalon a tömböt egyszer session-változóként kezelem. hogy már regisztráltak. Amint kitölti az űrlap újabb és újabb szakaszait. amely jelzi. adj neki visszajelzést. => "Family name".9. és az egyes kérdéseket akkor tekintem befejezettnek. A PHP leegyszerűsíti a szerver feldolgozási feladatát. és évente újra felteheted. MySQL-ben a sztringmező a meződefiníciótól függően adhat üres vagy nulla hosszúságú sztringet (a részleteket az 5. Fájlok feltöltése Az űrlapokkal fájlokat is feltölthetsz gépedről a webszerverre. a tömbben a mezőnek megfelelő elemhez egy hibaelemet szúrok be. jelezve azt. Tovább finomíthatod az űrlapot egy „mindig mutat" elem hozzáadásával. hogy a hobbimezőt még nem kérdezted meg. az adatbázisba mentem a tartalmát. és ezen túlmenően a két eltérő űrlaptípus máshogy működik és mást jelenít meg a különböző böngészőkben és operációs rendszerekben. ahol a felhasználó látja a már kitöltött és a még hátralévő részeket. ismeretlennek vagy nullának. Van néhány apró különbség a feltöltő és a hagyományos űrlapok között. amely jelzi az összes oldalon ismétlődő fájlokat. hogy feltetted-e már a kérdést. hogy a regisztráció nem sikerült. és akkor kell a vásárlótól megkérdezni. fejezetben találod). Ha túl bonyolult a null/false és "" megkülönböztetése. "length" => 60. de nem segít abban. hogyan töltsenek fel a böngészőjükkel és operációs rendszereikkel fájlokat. A meg nem kérdezett és meg nem válaszolt kérdések közötti különbség Ha az adat már az adatbázisban van. Az űrlap felépítéséhez ciklussal végigfutok a tömb elemein. "length" => 60. mint például a „milyen hobbijai vannak". akik többször is regisztrálnak. vagy mert elfelejtették. hogy mikor tetted fel a kérdést. fejezet Űrlapok lépett. hogy vannak olyan felhasználók. ha megvan az információ. hogy a hobbira vonatkozó kérdést már feltetted. Egy tömbbel könnyen kilistázhatod a felhasználó nevét és a kitöltött űrlapszakaszokat. amikor legközelebb olvassa a profilját. Gyakran a következőhöz hasonló tömb alapján tervezem az egész űrlapot: Selements[] = "question" $elements[] = "question" $elements[] = "question" array("name" => "firstname". Akár egy dátummal is jelölheted. "complete" => falsé). majd tedd ezt az információt az űrlap egyik sarkába. A kevésbé jól tervezett űrlapok gyakori hibája. "length" => 60. Ha hiba van egy mezőben. "complete" => falsé). mint az Amazon nyomon követő listája. jelezve azt. array("name" => "lastname". például a vásárló nevét. az adatbázis eszközeivel a mezőket jelölheted üresnek. hozz létre egy külön mezőt. valami olyat. ahogy néhány adatbázisban és a PHP3-ban az volt. "complete" => falsé). => "First name". de még nem válaszoltak rá semmit sem. hogy a felhasználóknak elmagyarázd. majd a feldolgozás végén egy ciklussal végigfutva a tömbön. és a MySQL nullját fordítsd a PHP false-ra. array("name" => "address". Hasonlóképpen a MySQL üres sztringet a PHP-be fordíthatod ""-re. vagy mert azt hiszik. 304 . Ezt olyan kérdéseknél használhatod.

és ne felejtsd a könyvtárat éjszakánként megtisztítani. hogy mit tölthet fel az űrlap. például a több gigabájtos lopott filmeket sok-sok fájlban töltik fel. ahogy itt látod: <input type="submit" value="Upload"></form> A PHP beállító fájlja. hogy mi tölthető fel.html" method=\"post\" >" <input type="hidden" name="MAX_FILE_SIZE" value="200000"> A fájlnév beírására egy szövegdobozra van szükséged. ellenőrizni tudod. Sokak szerint ez biztonsági kockázatot hordoz magában. Inc. így néz ki: <input type="fíle" name="uploadfíle" size="60"> A szokásos elküld tag-gel és az űrlap végtag-jével kell lezárnod. az upload_max_filesize-nak pedig legalább akkorának kell lennie. mint a legnagyobb feltölteni kívánt fájl mérete. amely korlátozhatja. Amikor valaki feltölt egy fájlt. Másold be ezt a példát. Képzeld el azt problémát.. az upload_tmp_dir-nek a megfelelő könyvtárra kell mutatnia. a fájlfeltöltéseket korlátozd azáltal. és a HTML a file-típust használva egyedi fájlnév szövegdobozt kínál a kiválasztási eszközzel. Az upload_max_filesize-zal azt próbálod a fájl méretének korlátozásával befolyásolni. és van. a php. így tudod tájékoztatni őket a feltöltés megfelelő módjáról. akik beléptek. egy űrlaptag.Áttekintés Az első dolog. A file_uploads-t on-ra kell állítanod. 2000) és nézz utána az enctype-nak. hogy több feltöltés történhessen egyszerre. vagy ragadd meg a HTML Black Book-ot (The Coriolis Group.ini számtalan olyan paramétert tartalmaz. Bárhogyan is döntesz. 305 . Ezt a következőképpen teheted meg: file_uploads = On upload_tmp_dir = T:\upload upload_max_filesize = 8M memory_limit = 30M A file_uploads lehetővé teszi. hogy a szerver ne duguljon el a sok feltöltéstől. hogy az ideiglenes könyvtárban még arra is elegendő hely van. nem pedig a fájlé. ha egy webszervert szexképekkel vagy lopott Nirvána-dalokkal árasztanak el. így mielőtt a fájlt áthelyeznék. így állítsd a PHP memory_limit-jét az upload_max_filesize-nál nagyobbra. aki az erőforrás-használat elfogadhatatlan módszerének tekinti. A fájl méretének korlátozása önmagában kevés arra. Az űrlaptag így néz ki: <form enctype="multipart/form-data" action="apage. hogy megakadályozd a szervered rossz célra való használatát. Győződj meg róla. ami a feltöltéshez kell. amely beállítja az enctype-paramétert. Ebben a tag-ben a size a fájlnév szövegdobozmérete. hogy csak olyan felhasználóknak engedélyezed. az az upload_tmp_dir-ben megadott ideiglenes könyvtárba kerül. hogy a PHP fájlfeltöltéseket végezzen. Ezt azonban ki lehet játszani. majd a megfelelő szoftverrel ezeket összerakják. Bizonyos fájlműveleteket a PHP-ra allokált memória mérete korlátoz.

Gyors megoldások Gyors megoldások Űrlap létrehozása íme HTML-ben egy alapűrlap. "<input type=\"text\" name=\"name\">" .} Űrlapok létrehozása függvényekkel Az „Űrlapok létrehozása" című részben mutatott kódot nagy űrlapok esetén nehéz megváltoztatni.5 ábra böngészőben mutatja az eredményt. A megfelelő megoldás az űrlap kis számú függvényre és különálló kérdésekre való felbontása. 307 . "Please enter your name:" . "<input type=\"submit\" name=\"submit\" value=\"Submit\">" . íme egy kód a createaform. íme egy alapvető PHP-kód az űrlaptag-ek létrehozására. majd visszatér a createaform. $name).html nevű oldalra: <form Please <input action="createaform. A PHP az űrlapok összes mezejét megragadja POST-on vagy GET-en keresztül.html-oldalon a felhasználó által megadott adatok a Sname nevű változóba kerülnek.html" method="post"> enter your name: type="text" name="name"> <input type="submit" name="submit" value="Submit"> </form> Itt van egy alap PHP-kód űrlap létrehozására: print("<form action=\"createaform. $page . "\" method=\"post\">" .html\" method=\"post\">" . Please enter your name:[ Submit 9. "</form>"). Stext) { return("<form $text action=\"" . amely a kérdéseket a form() nevű függvénnyel bevitt szöveges sztringként tartalmazza: function form($page. amely megkérdi a neved.5 ábra Egy alapűrlap egyetlen kérdéssel és egy elküld-gombbal A createaform.html-oldalon levő adatok felhasználására: if (isset($name) ) [print("Your name is: " . és az értékeket a HTML <input>-tag name-paraméterével elnevezett mezőkbe helyezi. A 9.

Az űrlapmód alapértelmezésben post. mert csak így tudod a vásárlóval közölni. fejezet Űrlapok . Egy töröl gombot szintén be lehet tenni. Minden űrlaphoz kell elküld gomb és <input>-tag az elküldés típusával. A $question azért szükséges.&nbsp. Please enter vour name: 1p3ubmíT| 9. "&nbsp.6 ábra Egykérdéses űrlap 308 . A $name szintén kötelező. A form_text()-ben az if(strlen($default))-sor az alapértelmezett mező szövegét ellenőrzi. néhány szóközt.6 ábrán látható űrlapot adja eredményül. A form_text()-ben a return() először a kérdést. "<input type=\"text\" name=\"" .9. A következő a szöveges inputot használó űrlap alapvető kódja. A függvénynek szüksége van a kérdés nevére. amely soronként egy kérdéssel bővül. "<input type=\"submit\" name=\"submit\"" . "Please enter your name:") A kód a 9." . $default . mert ez az űrlapok létrehozásának legjobb módja. A form()-függvény első paramétere a céloldal neve. A böngésző részére pedig az egészből outputot hoz létre a print()-tel: print(form ("form. $default . hogy mit is szeretnél megtudni. utána jön az űrlapba kerülő összes kérdést tartalmazó sztring. hogy a kérdésből űrlapot csináljon. a kérdés szövegére és egy nem kötelező alapértelmezett válaszra: function form_text($name. $name "V" Az <input> tag-ben lehet egy alapértelmezett érték. mert különben nem tudod a szkriptedbe visszaérkező választ azonosítani. return($question . ">"). majd a form_text()-függvényt a form()-függvénnyel veszi körül. " value=\"Submit\">" . hogy az embert az űrlap kitöltésére ösztönözze. "</form>").html". Most már egy könnyen bővíthető kóddal hozhatsz létre űrlapot. mielőtt a value-paraméter szövegét az alapértelmezett szöveg köré helyezné. így beraktam egyet a form()-ba. form text("name". $question. majd az <input> tag-et a megfelelő paraméterekkel adja vissza. $default="") if(strlen($default)) $default = " value=\"" . A következő kód egy kérdést helyez a form_text()-függvénybe az < input>tag létrehozására. "\"" .

$parameters) if (!isset ($parameters["de fault"])) { $parameters["default"] = "". ami nem más. " > " ) . $question["state"] = arrayC'type" => "text". A type az <input>-tag form_text() nevű formázó függvényének használatára utasítja a form()-ot. Sparameters ["$default"] . "question" => " C i t y : " ) . "<input type=\"text\" name=\"" . type. hogy legyen a válaszokat feldolgozó szkript mezó'elnevezési szabályaival. átugorja a value= létrehozását. ahogy azt az űrlapon szeretnéd: $question["name"] = arrayC'type" => "text".snbsp.Gyors megoldások Hosszú lista létrehozása űrlapon belül Az „Űrlapok létrehozása" című részben mutatott kód nehezen használható a kérdések hosszú listája esetén. A tömb öt elemet tartalmaz. Először hozd létre a tömböt. Ez az „Űrlapok létrehozása" című részben mutatott függvény. a többi paramétert pedig tömbben fogadja el. $question [ "address" ] = arrayC'type" => "text". $question [ "country" ] = arrayC'type" => "text". } if (strlen($parameters["default"])) { $paraineters["default"] = " value=\"" . "question" => "Country:"). $name . " . néhány változtatással. ahol a name a tömb kulcsa. így tömb használatával fogjuk a példát kibővíteni. így összhangban kell. A name-mező azonosítja a questíon-re adott választ tartalmazó mezőt. A question tartalmazhat HTML-beli kiemeléseket. és ha nincsen alapértelmezett szöveg." . A return()-utasítás változatlan for- 309 . A question az <input>-tag elé kerülő olvasható szöveget tartalmazza. amely a kérdéseket olyan sorrendben tartalmazza. akkor létrehozza azt. mint amit a felhasználó lát. Egy nevet használ a kérdésre adott válasz a kérdés szövegének és a nem kötelező alapértelmezett válasz azonosítására: function form^text($name. "Snbsp. hiszen outputként változatlanul jelenik meg. "question" => "Address:"). $parameters["$default"] return($parameters["question"] . "question" => " S t a t e : " ) . és minden elem egy a name-. Ha a $parameters["default"] nem létezik. "question" => "Please enter your name:").és question-elemeket tartalmazó tömb. $question["city"] = arrayC'type" => "text". A kérdésre adott alapértelmezett válasz meglétére ellenőrzi a $parameters["default"] hosszát. Ez a függvény a Sname-et diszkrét paraméterként. t II! l|» illl A következő alapvető kód a szöveg input használatával épít kérdéseket.

és futtasd végig ciklussal a kérdések tömbjén.= " $function = "form " . $v). nem pedig hagyományos szóközök (" "). " value=\"Submit\">" . mert a hagyományos szóközök a HTML-ben eltűnnek.) Próbáld ki a következőt: function form($page. ezáltal függvénynevet állít elő. $text . fejezetben találsz részleteket. fejezet Űrlapok mában tartalmazza a $parameters["question"]-t (így a kérdés tartalmazhat formázó tageket). A form()-ban a while-ciklus végigfut a kérdések listáján (a $question tömbben). while (üst ($name. $page . ha új kérdéstípust adsz hozzá. A while()-cikluson belül a kód ellenőrzi. $text .= $function($name. hogy a látogató be tudja gépelni a választ.) Most vedd az „Űrlapok létrehozása" című részben mutatott alapvető űrlapfüggvényt. hogy van-e szöveg a $text-en belül. 310 I . ahol függvénynévnek kellene megjelennie. Az igazítás elég összevisszának tűnik. $v) ) = each ( $question) if (strlen($text)) {$text .és each()-függvényekkel $v nevű egyszerű tömbként adja vissza az egyes kérdéseket. majd űrlaptag-et tesz az egész köré. Mivel a tömb lehet üres. hogy minden kérdés külön sorban jelenjen meg. valamint az <input> tag-et. fejezetet. Ez a tulajdonság lehetővé teszi a függvénynevek dinamikus létrehozását. $question) $text = "". "</form>"). (Minden egyes alkalommal. a függvénynévben talált értéket a függvény neveként fogja használni. amelyeket figyelmen kívül hagyhat. talán csodálkozol a $function() miatt. egy megfelelő nevű függvényt is hozzáadsz. de a következő megoldás ezzel a problémával birkózik meg. néhány szóközt. (A list()-ről és az each()-ről a 3. A módosított kód a list(). majd a $function-változót függvényként végrehajtja. Megjegyzés: A szóközök sortördelést letiltó HTML-szóközök (&nbsp). A kód a 9. és ha van.) Az új kód a kérdés típusát adja a form_-előtaghoz. majd az egészet együtt a $text-be rakja. "<input type=\"submit\" name=\"submit\"" . akkor egy <br> sortörési tag-et szúr be. Ha még nem olvastad a 10.7 ábrán látható űrlapot hozza létre. a formQ kezdésnek üres sztringként létrehozza a $text-et. (A HTML a többszörös szóközt egyszeresnek tekinti. $v["type"]. és a formázott kérdést a Stext-be helyezi.9. } return("<form action=\"" . A return() Elküld gombot <input type = "submit"> szúr be a kérdések végéhez. Ezután a kód a form__ konstansból és a tömb típuseleméből függvénynevet hoz létre. a függvénynevet a függvényváltozóba helyezi. "\" method=\"post\">" . Ha a PHP változót talál ott.

A példa a kérdéseket lefele futtatja az oldalon. Kezded a kérdéseket tartalmazó tömbbel. " >"). Sparameters["default"] . "Please enter your name:"). a question pedig a kérdést tartalmazza (a szövegformázáshoz szükséges HTML-formázó tag-ekkel együtt). A következő kód ugyanaz. A szöveget a Squestion-tömbhöz hozzáadva és a form()-ban egy újabb oszlopot létrehozva egyszerűen beszúrhatsz a jobb oldalra egy . mert a függőleges görgetés mindig egyszerűbb.7 ábra Többkérdéses űrlap Oszlopok igazítása Ez a megoldás az űrlapok oszlopait igazítja egy további kód hozzáadásával. Ez a tömb csak két kérdést tartalmaz példaként: $question["name"] "question" => $question["address" "question" => = arrayC'type" => "text". Ebben a tömbben a type jelzi a kérdéshez megfelelő formázófüggvényt. mint a „Hosszú lista létrehozása űrlapon belül" részben bemutatott megoldás (form_text()). } if(strlen(Sparameters["default"])) { $parameters["default"] = " value=\"" $parameters["default"] return("<input type=\"text\" name=\"" . csak a kérdés szövegét eltávolítottam.tartalmazza a kérdésre adott válasz azonosítására a name-et. A $question-tömb összes eleme . és megadja neked a kezdő lökést az űrlapok megjelenítésének ellenőrzéséhez.Gyors megoldások Please enter your name: Address: | City: L ___ _ _ Z State: | Country: [~ Submit 9. így azt a formQfüggvényen belül lehet formázni: function form_text (Sname. $name "\"" 311 . $parameters) if(!isset($parameters["default"])) { $parameters["default"] = "". illetve egy kételemű tömböt.kulcsként .a kérdésekkel kapcsolatos megjegyzéseket tartalmazó . mint a vízszintes. "Address:").további oszlopot. ] = arrayC'type" => "text".

röviden kitérve a változók függvénynévként való szereplésére. while (üst ($name. akkor nincs szükség a paraméter létrehozására.= "<br>". $question) { Stext = ""." . A változók függvénynévként való használatát teljes részletességgel a 10. $text . fejezet Űrlapok A form_text()-függvény a $parameters["default"]-ben levő szöveget ellenőrzi. $function($name. Másold le a form()-függvényt a „Hosszú lista létrehozása űrlapon belül" részből és helyezd a $v["question"]-t a kérdést formázó függvény elé. $v["type"]. $text .9. " value=\"Submit\"X/form>") . $v ["question"] . $page . $text $v["question"] . A form() részleteit a „Hosszú lista létrehozása űrlapon belül" részben magyaráztam el. "&nbsp. $v) . ($question) ) $v) = each if (strlen(Stext) ) {Stext .= return("<form action=\"" . mielőtt a value= paraméter a szövegbe helyezi. $v) ($question) ) = each if(strlen($text)) (ítext . </td> 312 . $v["type"]. "\" method=\"post\">" . A form()-nak ebben a változatában a kérdés szövegét egyszerűen kivettem a formázófüggvényből és a form()-on belül formáztam azt. így az összes kérdés szövege ugyanazt a formázást kapja. sortöréseket és táblázatokat is. $v["type"] nevű függvénynek továbbítja.</td>" . } . $function($name. így bekezdéseket. $question) { $text = "". fejezetben mutatom meg.= "<br>". Ha a $parameters["default"] üres. Egy egyszerű háromoszlopos táblázatot mutatok be.} $function = "form " . "<td>&nbsp.Snbsp.&nbsp. ahol a type az egyes kérdéstömbök type-eleme: function form($page. while (üst ($name. és az egyes kérdések tartalmát a "form_" . a while()-ciklussal végigfut a tömbön. "<input type=\"submit\" name=\"submit\"" . ahol a középső oszlop egy kis távolságot szúr a kérdések és a válaszok oszlopai közé: function form($page. A form() a kérdések listáját a Squestion-tömbbó'l kapja.} $function = "form " . $v).= "<trxtd>" . A return() az összes szöveget az <input> tag-be rakja. Most már bármilyen formázási technikát hozzáadhatsz.

utána egy apró változtatást javaslok. Az Elküld gomb a táblázaton kívül található. az <input>-tag pedig. ezért végrehajtok egy apróbb változtatást kézzel. Amikor a szemeidet és az egeredet lefuttatod a képernyőn. Nézd meg a böngésző által megjelenített képet.Gyors megoldások return("<form action=\"" . Please enter yoiir name: Address: Submit 9. </table>. Az Elküld gomb igazításához helyettesítsd a <table>-. így a gomb közvetlenül az utolsó <input>-tag alá kerül. A táblázat első oszlopában vannak a kérdések. "</form>"). Most a böngésző a 9. a második oszlop egy kis területet szúr be. amikor az űrlaptag-ek a táblázaton kívül kezdődnek és belül végződnek (vagy fordítva). ahol a felhasználó begépeli az adatokat. "\" method=\"post\">" . mind a három (feltéve. "<input type=\"submit\" name=\"submit\"" .8 ábra Űrlap oszlopba igazított kérdésekkel Nem szeretem. $page . ami érdekelhet téged. A böngésző képe a 9. ahol most.és végtagjait a kérdések köré helyezi. ha az Elküld gomb ott van.9 ábra Mezőket és elküld-gombot tartalmazó űrlap formás oszlopban 313 . a harmadik oszlopban van. a gombnak közvetlenül az alatt kell elhelyezkednie. hogy két szemed és egy egered van) egyből az Elküld gombra mered. így minden kérdés új sorban jelenik meg. $text-. $text "<tdxinput type=\"submit\" " value=\"Submit\" name=\"submit\"" Ez a kód az Elküld gombot a táblázat egy új sorának harmadik cellájába helyezi.9 ábrán látható űrlapot jeleníti meg. Úgy gondolom. így az összes sor és cella az űrlapon belül jön létre.és Submit tag-eket tartalmazó sort a következő kóddal: "<table>" . Ezzel a szimmetrikus elrendezéssel megelőzhetők az egyes böngészőknél olyankor jelentkező problémák. "<table>" . " value=\"Submit\">" . $text . Please enter your name: Address: | |~ Submit 9. A form() ezen változatában a táblázat sor <tr> és a cella <td> tag-jei veszik körül a whileQ-ciklusban generált szövegelemeket. A return()-utasítás a táblázat kezdő. ahova a látogató gépelheti a szöveget.8 ábrán látható. így azt a táblázat nem fogja az oldalon igazítani. "</table>" .

Nézd végig a következőket: function form_select($name. A többi rész új. hogy egy. while (list ($k. "</select>"). = "Austria". amelyek mindegyike egy választ 314 . a választást tároló változót használ. Ez a megokkegy az országnevek listáját tartalmazó tömböt. $v $parameters["default"]\* "</option>". amely a kiválasztási listákkal együtt megjeleníti a kérdéseket. if (isset($parameters["default"]) $output . mert egy <select> tag-et hoz létre. $v) = each ($parameters ["üst"] ) ) and $v . Bizonyos böngészőkben és operációs rendszerekben több lehetőség is kiválasztható. A while()-ciklus végifut a $list-en. amelyen íz emberek egy hosszú kiválasztási listán jelölhetnék be a kívánt célországokat. $name . A függvény a tömb nevét. a HTML-űrlap a választható országokat megjelenítő <select> tag-jét. . aki gépelés nélkül jelölheti ki a neki megfelelő válasz. hogy „Melyik országba akar utazni?". egy olyan űrlapra lenne szükséged. return ("<select name=\"" . Sparameters) $output = "". amely utóbbival beállíthatod. A form_select()-ben a lehetséges válaszok listáját a $list tartalmazza. A <select> tag-gel kiválasztási listát nyújthatsz a látogatódnak. a kiválasztási listában megjelenő lehetőségek listáját és egy opcionális alapérteimezer mezőt kér. mely utóbbi a legvalószínűbb válasszal ösztönzi a felhasználót a válaszadásra. fejezet Űrlapok Egy válasz a sok közül Ha éppen a saját utazási irodádat nyitnád meg. egyedi <option> tag-eket hozva létre. == $v .= "<option>" "</option>". de csak akkor. $output . és az ügyfeleidtől online szeretnéd megkérdezni. . A form_select() annyiban hasonló a jelen fejezet egyéb Gyors megoldásaiban használt kérdésformázó függvényekhez. és egy.9. a válaszra vonatkozó névre és egy alapértelmezett értékre van szüksége. és a következőkben bemutatott form_select()-függvény pontosan ezt teszi. = "Azerbaijan". Kell egy függvény.= "<option selected>" } else { $output . hogy melyik lehetőség legyen alapértelmezésben előre kiválasztva. ha a <select> tag-ben a multiple-paraméter hozzáadásával ezt megengeded. Először az országok listáját tartalmazó tömbre van szükség: $country[] $country[] $country[] = "Australia".

a form_select()-nek pedig te akarsz egy további paramétert továbbítani. melynek minden elemét az adott elem type-értékének megfelelő függvény dolgoz fel. hátha egyetlen elem sincsen a $list-ben. "default" => $country_default. mint itt: $country_default = "Anguilla". a select típusú. ezért a ciklus első lefutása előtt létrehozom a $output-ot. A $question kulcsértéke elnevezi a választ az azt fogadó szkriptben. Az alapértelmezett elem hozzáadásának biztonságos módját a következőkben mutatom meg. a name-től különböző paraméter egy egyszerű tömbben továbbítódik. Egy default nevű opcionális elemet is beszúrhatsz. A form()-ban a kérdéslista egy tömb. csak a default hozzáadásával: $question["destination"] = arrayC'type" => "select". és utána a $country_default-ot add a $country-hoz. A return()-függvény adja hozzá a neveket a <select> tag-hez. "üst" => $country) . Az <option> tag-ek a $output-sztringbe kerülnek. Amikor az "Anguilla" elemet hozzáadod a Scountry-listához. a questionelem pedig a kérdés szövegét tartalmazza. A következő példa az előző kérdést tartalmazza. Ezután az előző megoldásban kialakított form()-függvényt változatlanul hagyva használd azt az új kérdéstípushoz. amely a kérdésre adott alapértelmezett választ állítja be. amely a select típusú kérdések által generált <select>-tagben megjelenítendő válaszok listáját tartalmazza.Gyors megoldások tartalmaz. a default-ot közvetlenül a $country_default-ból add meg. a type meghatározza a kérdést formázó függvényt. és a $output-ban a <select> tag-gel körülveszi az <option> tag-ek listáját. "question" => "Which country do you want to visit?". típusát és a kérdést tartalmazó tömb. "question" => "Which country do you want to visit?". először a $country_default-hoz add. Ez az elem. A $question minden egyes eleme egy az elem nevét. beleértve a kisbetűs-nagybetűs írásmódot is. A form() továbbra is működni fog. Amikor az elemet hozzáadod a $question-höz. az elemlistát is tartalmazza. 315 . Az előző példák a name-et és default-ot továbbították a függvénynek. A <sdect>-listákban az alapértelmezett válasznak egyezni kell a listatömb egy elemével. $country[] = $country_default. Ezután az előző megoldásban használt form()-függvényen elvégzett kis módosítással könnyedén kezelhetők az ilyen típusú kérdések: $question["destination"] = array("type" => "select". "üst" => Scountry) . Az alapértelmezett választ a megfelelő <option> tag-be írt selected kulcsszóval lehet beállítani. Hogyan jeleníted meg az új kérdésed? Változtasd meg az előző példában használt űrlap kérdéstömbjét. így a default hozzáadódik. így az országokat tartalmazó tömb lesz a Üst-paraméter a select típusú kérdésekhez. Az elemlista egy olyan tömböt fogad be. mert az összes.

} else { $text .= $function($name. while (üst <$name. majd megjeleníti a változót: if(!isset($destination)) 316 . Hivatkozás: Alapértelmezett függvényparaméterek használata oldal 347 A következő kód egy külön sorral bővíti ki a táblázatot. a böngésződnek a 9.} if(strlen($text)) {$text . { $question) $v) = each ( $question) ) if ( !isset($v["default"])) {$v["default"] = "".</td><td>".9. és a jelenlegi form()-függvényt úgy változtatod meg. Spage . $text . ha egy rögzítetten három paraméteres listát használsz. amit a Squestiontömbben a kérdéshez beírtál). "</td>" . az Elküld gombot pedig a külön sorba helyezi.10 ábrán látható űrlapot kell megjelenítenie: function form($page. hogy az elfogadjon dummy-változót. } return("<form action=\"" .10 ábra Űrlap legördülő listával Ezután a kódnak meg kell jelenítenie a választást.= "<br>". if (isset($v["list"]) ) { $text . } $text . "<tr><tdx/td><td></td>" . < $text = "".= "<trxtd>" . "<tdxinput type=\"submit\" name=\"submit\"" . $v["default"]). így minden függvény pontosan három paramétert fogad el. $text .} $function = "form_" . $v["type"]. "<td>Snbsp.= n</td>". $v["list"] r $v["default"]).= 5function($name. "\" method=\"post\">" . Futtasd le a kódot az oldaladon. " value=\"Submit\"x/td></tr></table></form>") . $v [ "question" ] . "<table>" . fejezet Űrlapok A paraméterlistához alkalmazott tömb használatának egyik lehetséges alternatívája. hogy a $destination nevű változó létezik-e (mivel a destination az. A következő kód egyszerűen ellenőrzi.&nbsp. így az Elküld gomb a válaszbeviteli területtel lesz sorba állítva. Which country do you want to visit? | Anguilla Submit 9.

íme a form_radio(): function form_radio($name. a megjelenítendő lehetőségek listáját és egy opcionális default-mezőt kell megadni neki. mert az összes lehetséges válasz rádiógombokkal való megjelenítése nagyon sok oldalnyi helyet foglalna el. akkor a szkript a $pet-et a dog értéket tartalmazva látja. $destination). while (Üst <$k. utazási irodás példában szeretnél rádiógombokat használni. mert ekkor az összes alternatívát egyszerre láthatod. if (isset($parameters["default"]) and $v == $parameters["default"]) { $output . Ha az <input name="pet"> és valaki a beviteli mezőbe a "dog" szót írja. Szükséged van egy függvényre.vagy POST-mechanizmusokon keresztül elküldi az értéket a céloldalnak. $v . " value=V" . a céloldal PHP-szkriptje a változót az értéket létrehozó HTML-tagben használt name-paraméterben adott névvel látja.= "<input name=\"" . $v . 317 .Gyors megoldások print("<br>You selected " . } Amikor egy űrlap egy URL-en vagy a GET. = "Austria". "\'-". Ha az előző. és a következőkben bemutatott form_radio()-függvény pont ezt teszi. A rádiógombok akkor célszerűek a <select>-tagben. $parameters) { $output = "". "\"" . } $output . Az egyik ingázó embertársad ezt a lehetőséget megcsinálta HTMLben is a radio típusú <input>-tag hozzáadásával. egy az országok listáját tartalmazó tömbbel kezdenéd: $country[] $country[] $country[] = "Australia".= " checked". Ezzel szemben a kiválasztási lista a hosszabb listák esetén célravezető. Egy válasz a sok közül rádiógombokkal Ha a kocsidban utazol. " type=\"radio\"" . = "Azerbaijan". amely rádiógombokkal jeleníti meg a kérdéseket. amikor rövid listákat jelenítesz meg. ez utóbbiban az alapértelmezettként kiválasztott lehetőséget tudod beállítani. A tömb nevét. $name . az előre beállított rádiógombokat megnyomva azonnal választhatsz a rádióállomások között. } return($output).= ">" . $v) = each ( $parameters [ "list" ] ) ) { if(strlen($output)) { $output . "\n".= " $output .

9. fejezet Űrlapok

A form_radio() annyiban hasonlít a form_select()-hez, hogy egy a válaszmezőhöz tartozó nevet és egy alapértelmezett értéket fogad el, amely utóbbi a legvalószínűbb válasz előre történő megjelölésével válaszadásra sarkallja a felhasználót. A többi része új, hiszen egy <input>-taget hoz létre. A Gyors megoldások „Több válasz a sok közül" részében hasonló kódot használok egy < input type = "checkbox">-tag előállítására. Az új kérdésed megjelenítéséhez másold le az előző rész kérdéstömbjét, ahogy itt is látod, és tápláld be az előző megoldás formQ-függvényébe:
$question["destination" ] = arrayC'type" => "radio", "question" => "Which country do you want to visit?", "list" => Scountry);

A Squestion kulcsértéke elnevezi a választ az azt fogadó szkriptben, a type meghatározza a kérdést formázó függvényt, a question-elem pedig a kérdés szövegét tartalmazza. Egy opcionális, default nevű elemet is hozzáadhatsz, amely egy alapértelmezett választ ad a kérdésre.

Több válasz a sok közül
Az előző Gyors megoldások példában, amikor utazási irodát nyitottál, és arról kérdezted az ügyfeleket, milyen országokba akarnak utazni, megállapítottad, hogy jó lenne egy űrlap egy hosszú kiválasztási listával, amelyen az emberek több országot is bejelölhetnek, ahova szívesen utaznának. Ez a megoldás az egyes választások elfogadására HTML-űrlap bejelölődobozokat, egy az országok listáját tartalmazó tömböt, illetve egy a választások tárolására használt tömböt alkalmaz. A kód az „Egy válasz a sok közül" részben használt kód némileg módosított változata, amelyben a <select>-et <input type = \"checkbox\">-ra cseréltem. Ezt a kódot használva az egyetlen választást tartalmazó változó helyett a választások listáját tartalmazó tömböt kapsz eredményül, amikor a felhasználó visszajuttatja hozzád az általa kitöltött űrlapot.
Megjegyzés: Talán már kitaláltad, hogy kedvelem a PHP-tömböket, mivel űrlapok használatakor értékek listáját képesek továbbítani. A többdimenziós tömbök nem működnek: csak egy lehetőséged van, és ez nem más, mint a hagyományos name="fieldname>" HTML-tagnek a PHP-barát name="fieldnameO"-re cserélése (habár ez a megkötés a későbbi böngészőkkel és a PHP későbbi verzióival változhat).

Kezdj egy az országok listáját tartalmazó tömbbel:
$country[] $country[] $country[] = "Australia"; = "Austria"; = "Azerbaijan";

Szükséged van egy függvényre, amely minden egyes tömbelem köré helyezett <input type = "checkbox">-szál megjeleníti a tömbből a lehetséges válaszokat. A következőkben bemutatott form_checkbox()-függvény a tömb nevét, a kiválasztási listában megjelenő lehetőségek listáját és egy opcionális alapértelmezett mezőt fogad el. Az alapértelmezést az összes lehetséges válaszra beállíthatja, így olyan listát is létre tudsz hozni, amelyből minden ki van választva, és a vásárlónak azt kell megjelölnie, amire nincsen szüksége.

318

Gyors megoldások

Figyeld meg, hogy a <input>-tagban a name=""-paraméter []-t tartalmaz a mezőnév után, ezzel jelezve a PHP-nak, hogy az értéket a tömb következő elemébe rakja bele. A [] a name-paramétert a PHP-kóddal teszi ekvivalenssé, mint a példában:
$destination [ ] = "_the name of the country__";

Az <input>-tag value=""-paramétert is tartalmaz. HTML-ben a value-paraméter kihagyható, a böngésző pedig az <input>-tag és az </input>-tag közötti sztringet fogja használni. A PHP-ben és néhány böngészőben a value-paraméter elhagyása azt fogja eredményezni, hogy a tömbelem az on értéket tartalmazza majd. Kerüld el ezeket a problémákat azáltal, hogy használod a value-paramétert. Bejelölődobozok esetén a kiválasztott elemeknek selected helyett checked-nek kell, hogy lenniük, ne felejtsd hát a kódnak ezt a sorát megváltoztatni. A fejezet korábbi példáival szemben ez a függvény lineáris módszert használ a kimeneti sztring felépítésére, ami jobban használható a sok lehetséges opcióból épített nagy sztringek esetében. A tagösszetevőket részről részre adom a kódhoz, így a jövőben is könnyen szúrhatok be kódrészeket anélkül, hogy a már meglévő kódot, illetve annak logikáját megzavarnám. A sztring végére egy \n-t is beszúrtam, így könnyebb lesz a HTML-t a böngésző „forrás megtekintése" pontjában olvasni. Amikor egyéb sztringépítő függvényeket írsz PHP-ban, talán össze szeretnéd hasonlítani ezt a megközelítést a form_select()-ével. Nézd meg ezt itt: function form_checkbox($name, $parameters) {
$output = ""; while (list ($k, $v) = each ( $parameters [ "üst" ] ) ) { if(strlen($output)) { $output .= "
$output .= "<input name=\"" . $name . M [ ] . " type=\"<:heckbox\"" . " value=\"" . $v . " \ " " ; i f ( i s _ a r r a y ( $ p a r a m e t e r s [ " d e f a u l t " ] ) an d in_ arra y( $v , $ par am e ters ["d efa ult" ] ) ) { $output .= " checked"; } $output .= ">" . $v . "</input>\n"; } return{$output);

A form_checkbox() a kérdés nevét, a válaszok listáját, illetve az alapértelmezett válaszok opcionális listáját fogadja el. A while()-ciklus a $output-változóban állítja össze a listát, így az első dolgod a $output létrehozása legyen. A while()-ciklus végigfut a listán, és elemenként egy <input>-tagét hoz létre. Annak érdekében, hogy az elemek egy függőleges listában elkülönüljenek egymástól, egy sortörést <br> szúr be minden egyes <input>-tag elé. Az első elem előtt

319

9. fejezet Űrlapok

nincsen üres sor, mert csak akkor csinál sortörést, ha van szöveg a $output-ban: erre van az if(strlen($output)). Az <input>-tag egy nevet kap a válasz céloldalon való azonosítására, illetve a checkbox tipusát. A checkbox a 9.11 ábrán látható opciólistát hozza létre. Minden bejelölődoboz egy külön elem, így a látogató annyi dobozt jelöl meg, amennyit akar.
Which country do you want to visit? r Australia r Austria r Azerbaijan
' Subnriit | 9.11

ábra Űrlap többszörös kijelölődobozzal

Hogyan jelenítsd meg az új kérdésed? Megváltoztatod az ezekben az űrlappéldákban használt kérdéstömböt, így az országokat tartalmazó tömb Üst-paraméter lesz egy checkbox típusú kérdéshez, mint itt:
$question["destination"] = arrayC'type" => "checkbox", "question" => "Which country do you want to visit?", "üst" => $country) ;

Ha ez megvan, az előző példában használt form()-függvényt változtatás nélkül használva megjeleníted az országkiválasztási listát. Ehhez a következőt kell beírnod:
function form($page, $question) { . Stext = ""; while (üst ($name, $v) = each ($question) ) { if(strlen($text)) {$text .= "<br>";} $function = "form_" . $v["type"]; $text .= "<trxtd>" . $v [ "question" 3 . "</td>" . "<td>&nbsp;&nbsp;</td>" . "<td>" . $ function ($name, $v) . "</tdx/tr>";

return( " < f orm action=\"" . $page . "\" method=\"post\">" . "<table>" . Stext . "<tr><tdx/tdxtdx/td>" # . "<tdxinput type=\"submit\" name=\"submit\"" . " value=\"Submit\"x/tdx/trx/table>" . "</form>"); }

A form() a válaszokat megkapó oldal névét és a kérdések listáját kéri. A while()-ciklus a megfelelő HTML-t felépítve végigfut a kérdéseken. A return() az Elküld gombot szúrja be, majd a HTML-t az űrlap- és táblázattagek közé helyezi. Jóllehet, a legtöbb ember már bolondulni fog az űrlapodért úgy is, ahogy az a 9.11 ábrán megjelenik, néhányan hiányolni fogják a felülre igazítást, amit a 9.12 ábrán láthatsz. Ezt a kis változtatást, amely az összes űrlapra érvényes és könnyen módosítható a kód megvál320

Gyors megoldások

toztatása nélkül, a formázási opcióban, $option állíthatod be, mint itt:
$option["form"]["valign"] = "top";

Which countrv do vou want to visit?

r Australia r Austria r Azerbaijan Submit I

9.12 ábra Űrlap többszörös kijelölődobozhoz gondosan hozzáigazított kérdéssel

Ha ezt megteszed, egy külön sort kell beszúrnod az oszlopok közötti távolság kezelésére, amelyhez így könnyen adhatsz és vehetsz el belőle, ha a weboldalad fejlődése ezt megkívánja. A Soption-tömböt egy szokványos include-ból, egy adminisztrációs adatbázisból vagy egy site adminisztrációs oldal által generált XML-fájlból töltheted be. A változtatáshoz a következőt kell beírnod:
$option["form"l["separator"] = "Snbsp;&nbsp;";

Ezután meg kell változtatnod a form()-ot( hogy az a formázást az űrlap táblázatának összes cellájára alkalmazza, és a nehezen módosítható távolságigazító oszlopot a $option-ből betöltött értékkel helyettesítse. Más nyelvekben a változókat elég a szkript elején egyszer globálisnak nyilvánítani. PHP-ban egy változó addig nem globális, amíg a függvényeden belül egy global utasítással annak nem nevezed. Ez azt jelenti, hogy egyszerűbb egy tömböt egy global utasításban globálissá nyilvánítani és mindent a tömb elemeként eltárolni, mint minden értéket külön változóban tárolni, és az összes változóhoz külön global utasításokat rendelni. A $option-ből származó értékek használata előtt ellenőrizd az isset() használatával, hogy az érték be van-e állítva. Ezen felül állíts be egy használható alapértelmezést arra az esetre, ha valaki elfelejtett egy értéket. Az elválasztó sztring esetében megváltoztattam a kódot, hogy teljesen kihagyjam a táblázatelválasztó oszlopot, ha az elválasztási érték nincsen definiálva. Végül, de nem utolsósorban a formázott <td>-sztringet, a $td-t használtam az elválasztó oszlopban, hátha valaki úgy dönt, hogy további <td> formázó opciót, például bgcolor-t ad hozzá. Hogy lásd, mindez hogyan működik, nézd meg ezt:
function form($page, Squestion) global $option;
$td = "<td"; "*'■'

;

. ,

'•"'■*-'"■-■

if (isset (Soption["form"] ["valign"])) $td .= " valign=\"" . $option["form"]["valign";
} ~ , ■ ,

"V

$td .= ">"; $sep = ""; if(isset($option["form"]["separator"]))

321

9. fejezet Űrlapok

$sep = $td . $option ["forrn"] [ "separator" ] . "</td>"; } Stext = ""; while (üst ( $name, $v) = each ($question) ) { if (strlen($text)) {$text .= "<br>";} $function = "form " . $v["type"]; $text .= "<tr>" . $td . $v["question"] . "</td>" . $sep $text .= $function($name, $v["default"])

$td;

return("<form action=\"" . $page . "\" method=\"post\">" . "<table>" . Stext . "<trxtdx/td><tdx/td>" . "<tdxinput type=\ "submitV name=\"submit\"" . " value=\"Submit\" . "</form>");

A form() a $option-t globális változókét definiálja, így hozzáférhet a form()-on kívül definiált $option-höz. A $td=-vel kezdődő kód a táblázat celláinak definícióját állítja be. A <td>-tag a $optionben lévő beállításokból épül fel, így a $optíon-t használhatod a HTML-ed formázásának teljes ellenőrzésére. A példában csak annyit állítottam be, hogy a <td> valign-paraméter függőlegesen igazítsa a táblázni celláiban a szöveget. Ezt kiterjesztheted a színekre és további <td>-opciókra is.
Megjegyzés: Miért így alakítsd ki a formázást, és miért nem a CSS-t használva? Azért, mert nem minden böngésző képes a CSS feldolgozására. Vannak olyan böngészők, amelyek rossz dolgokat jelenítenek meg CSS-sel. Még a legújabb böngészők sem egységesek a CSS értelmezésének finom részleteiben.

A Ssep = -vel kezdődő kód egyszerűen egy cellát hoz létre a szöveget tartalmazó oszlopok elkülönítésére. Azért használok elválasztó oszlopokat, mert a képernyő széles, és az embereknek vízszintesen nagyobb térre van szükségük az adatok elválasztására, mint függőlegesen. A kód Stext="<tr>"-rel kezdődő sora a régi kód továbbfejlesztett változata, amelyben a rögzített <td>-taget $td-re cseréltem, a "<td>&nbsp;&nbsp;</td>"-t pedig $sep-re. A form()-függvényen végzett további munka, miként azt a kódot lefuttatva megláthatod, jobb és rugalmasabb űrlapot eredményezett. Ezen űrlap eredményeinek feldolgozását a következő kóddal kell kezdeni. Az adat a $destination-nek nevezett változóban van, így először azt kell ellenőrizned, hogy a változó létezik-e, ha létezik, akkor tömb-e, és ha igen, akkor egy ciklussal jelenítsd meg az értékeit. Az űrlap összes kiválasztott eleme a value=""ból kap értéket, ami tömbben tárolódik értékként. Bármilyen adatfeldolgozást elvégezhetsz, ha az adatok szerencsésen megérkeztek a szkriptedbe. A kód a következő:
$d = ""; i f ( isset($destination))
{

$d

=

$destination;

322

Gyors megoldások

if(is_array($destination)) { $d = ""; while (üst ( $ k , Sv) = each ($destination) ) $d .= "<tr><td>" . $v . " } $d = "<table>" . $d . "</table>";

A kód egy alapértelmezett értéket állít be a $d-nek, amely az a változó, ami a HTML-t és a szöveget kapja. Az if(IssetQ) ellenőrzi, hogy a $destination létezik-e (az oldalra való első belépéskor lehet, hogy nem létezik), majd a $d-hez a $destination-t rendeli (hiszen a $destination lehet formázott sztring). Ha a $destination tömb, akkor a $d-ből kitörli az értéket, a whileQ-ciklus végigfut a $destination-ön táblázatsorokat szúrva be, majd a $d-t <table>-tagek közé helyezi.

Válaszok megőrzése és hibák kiemelése
Az előző megoldás azt feltételezte, hogy a vásárló kitölti az űrlapot, és csak egyszer kattint az Elküldre. De mi történik, ha egy többoldalas űrlap első oldaláról a másodikra akarod az adatokat továbbítani, vagy az első oldalt hibaüzenettel együtt újra meg akarod jeleníteni? Ebben az esetben csak külön mezőket kell a Squestion-tömbbe és a feldolgozó függvénybe tenned. Ekkor egy újabb oszlopot is beszúrhatsz a hibaüzeneteknek, és piros szöveget szúrhatsz az egyes kérdések eíé, így a vízszintes elrendezés sem fog oldalról oldalra ugrálni. Végeredményben ugyanazt a $question-tömböt fogod használni, mint az előző példában, csak további értékeket adsz neki a feldolgozás alatt. A hibaüzenetek egyszerű teszteléséhez változtasd meg a kérdést úgy, hogy legfeljebb két országot lehessen kiválasztani, mint itt:
Squestion["destination"] = arrayC'type" => "checkbox", "question" => "Select up to two countries:", "list" => $country);

így összepárosíthatod a válaszokat a kérdésekkel, minden kérdést névvel indexelve. Majd amikor egy válaszmezőt dolgozol fel, amilyen például a $destination, a kérdésre hivatkozhatsz $question["destination"]-ként, és további elemként könnyedén beszúrhatsz válaszokat és hibaüzeneteket is. Amikor hiba van egy válaszban, és üzenetet akarsz a felhasználónak visszaküldeni, hogy felhívd a figyelmét a hibára, csak egy sorra van szükség a kódban, hogy az a Squestiontömbbe szúrja be a hibát. A következő példában megláthatod, hogyan működik ez, ha egy vásárló több, mint két országot választ ki. Természetesen kezelheted magad a saját hibáidat, amint az oldalad sikeresen megjeleníti a hibaüzeneteket. A $question-tömbbe így teheted be a hibákat:
if (count($destination)
{

>

2)

$question["destination"]["error"] =

323

9. fejezet Űrlapok

"You selected more than two countries." . "<br><em>(Hint: Two is the number after one.)</em>"; }

Arról is meg kell győződnöd, hogy a korábbi válaszokat továbbítottad, nehogy az embereknek újra be kelljen azokat gépelniük. Ehhez nem kell mást tenned, mint a korábbi válaszokat új default-értékként berakni a kérdéstömbbe, mint itt:
if (isset($destination) and is_array($destination) ) = $destination;

$question["destination"]["default"]

Mind az alapértelmezett list, mind a $list betölthető adatbázisból. Ha van egy adatbázisbeli táblázatod, amely a $list és az alapértelmezett lista adatait is tartalmazza, a két listát egy tömbben egyesítheted, és a tömböt SQL-ből feltöltheted. Ez azt jelentené, hogy a form_checkbox()-ban a $parameter["default"] eltűnne és a $v egy tömb lenne, mely tartalmazná egyrészt a megjelenítendő értékeket, másrészt valamit, ami azt jelzi, hogy az elemnek a selected alapértelmezett beállítását kell adni. Végül egy kicsit megváltoztatod a form()-ot, hogy a hibaüzenetet a kérdés elé tegye, mint itt:
function form($page, $question) global $option; $td = "<td"; if(isset($option["form"]["valign"])) $td .= " valign=\"" . $option["form"]["valign"] . "\""; $ t d . = " > "; _^ $sep = ""; if(isset($option["form"]["separator"])) $sep = $td . $option["form"]["separator"] . "</td>"; $text = ""; while(list($namef $v) = each($question)) if(isset($v["error"])) $v["question"] = "<font color=\"Red\">" . $v["error"] . "</font><br>" . $v["question"] ; $function = "form_" . $v["type"]; Stext .= "<tr>" . $td . $v["question"] . "</td>" . $sep . $td; if (isset($v["list"] ) ) $text .= $function($name, $v["list"], $v["default"]); 1 else í $text .= $function($namef $v["default"]); Stext .=

II

324

Gyors megoldások

return("<form action=\"" . $page . "\" method=\"post\">" . "<table>" . $text . "<tr><tdx/td><tdx/td>" . "<tdxinput type=\"submit\" name=\"submit\"" . " value=\"Submit\"X/td></tr></table></form>") ;

Az első változtatás a form()-on a kód, amely a $v["error"]-t dolgozza fel. Az error elem csak akkor létezik, ha egy kérdésre hibásan válaszoltak, így először ellenőrizni kell, hogy az elem létezik-e. Ha az error létezik, a kód kiveszi belőle a szöveget, pirosra állítja (a <font>tagben), és a vörös szöveget beszúrja a kérdés szövege elé.

í "i

325

10. fejezet
Függvények
Gyors megoldások Függvény létrehozása Globális változó deklarálása Statikus változó deklarálása Függvény tárolása változóban Alapértelmezett függvényparaméterek használata A függvény létezésének ellenőrzése A call_user_func{) használata A create_function() használata Afunc_get_arg() és a func_num_args() használata Afunc_get_args() használata Shutdown-függvény beiktatása
343 344 345 346 347 348 349 350 351 352 353

oldal:

10. fejezet Függvények

Áttekintés
Képzeld el, hogy kocsit tervezel. A motort és a karosszériát együtt kell megtervezned, mert ki kell próbálnod, hogy jól illeszkednek-e. Ha egy tervező csapattal dolgoznál együtt, akkor ez a csapat mind a motor, mind a karosszéria kialakításán egyszerre dolgozna. Most gondolj egy CD-lejátszóra, amely majd ebbe a kocsiba kerül. Mivel egy ilyen eszköz teljesen másfajta tervezési technikát igényel és teljesen másféle tervezési problémák merülhetnek fel, egy külön tervező csapat fog foglalkozni vele. A kocsit tervező csapat összeállítja az autót, egy szabványos méretű lyukat és néhány vezetéket hagyva a műszerfalon, ahova majd a CDlejátszó bekerül. A CD-lejátszót tervező csapat úgy alakítja ki a lejátszót, hogy az a lyukba és a vezetékekhez pontosan illeszkedjen, amikor elkészül. Ugyanezt teheted PHP-ban a függvényekkel. Válaszd ki a programod azon részeit, amelyek egyedül is megállnak, és tedd azokat függvényekbe. A függvényfejlesztői munkát kiadhatod másoknak, és a programfejlesztési időt csökkentheted a függvények más programokban való használatával. Amikor Jacques Nassar, az ausztrál szuperhős a Ford Motor Company világszintű műveletekért felelős vezetője lett, a 22 öngyújtó designt egy darab, három méretben gyártott designra cserélte. Jacques Nassar ma a Ford első számú embere. Gondolj bele, mivé válhatsz a kód megfelelő újrahasznosításával. Ez a fejezet a függvényeket és azok használatát mutatja be, illetve megtanít arra, hogyan alkalmazd őket saját magad. A következő függvényekkel fogok a fejezetben hangsúlyosan foglalkozni: • • • • • • call_user_func() create_function() func_get_arg() func_get_args() func_num_arg() register_shutdown_function()

Amikor a kód gyorsan változik, egyszerűbbnek találhatod a fejlesztést, ha először egyben hagyod a kódot, majd a kódrészeket függvényekre darabolod. Később fel fogod ismerni, hogy mi való leginkább függvénybe, és a kód megírása előtt létrehozod azokat a függvényeket, amelyeket használni fogsz. Az objektumokkal elkülönülő részekre bonthatod az adatok és kódok összetett elegyét. Ha hasznos függvények és adatok csoportjait alakítottad ki, gondold meg, nem lenne-e érdemes egy objektumba összerakni őket. (Az objektumokról a 17. fejezetben olvashatsz részletesen.) A függvények nagymértékű rugalmasságot biztosítanak. Annak érdekében, hogy a függvényírás minden apró részletét elsajátítsd, a következő részekben a legegyszerűbb függvényektől haladok a PHP4 összes opcióját kihasználó bonyolultabbak felé.

i

328

Áttekintés

A világ legrövidebb függvénye
Egy mintakód a legmegfelelőbb kiindulási pont a függvények tárgyalásához. A függvényeket egyszer kell a function utasítással definiálni, utána az egész kódban használhatóak. Az első lépés tehát - ahogy itt is láthatod - a függvény definiálása. A következő a világ legrövidebb PHP-függvénye:
function a() {}

A példában a function kulcsszóval kezdődik a függvény definiálása. Ezt követi a függvény neve (esetünkben a), a zárójelek (), amelyek az opcionális beviteli mezőknek adnak helyet, majd a kapcsos zárójelek {}, amelyek körülveszik a függvény kódját. Ne felejts el szóközt rakni a function szó és a függvény neve közé, viszont ne tegyél a függvény neve és az első zárójel, illetve a második zárójel és az első kapcsos zárójel közé. Ahol használhatsz szóközt, ott tabulátort, illetve új sorra ugrást is használhatsz. Minden függvénynek ez a felépítése, és ehhez beviteli mezők, feldolgozó kód és az eredmény megjelenítésére használt eszköz megfelelő keveréke adható. A függvényt a függvénynév és a zárójelek beírásával használhatod. Példánkban ez:

Az a() példafüggvény nem csinál semmit, és nincsen eredménye sem. Ezért hamisat ad eredményül, ha a következőkben if()-fel teszteled: A függvénynevek nem különböztetik meg a kis- és nagybetűt. így az a()-t a következőképpen is használhatod:

Megjegyzés: A beviteli mező, paraméter és argumentum mind ugyanazt jelentik: azt a mezőt, amellyel információt viszel a függvénybe. A beviteli mező technikailag nem helyes, hiszen a mezők kétirányúak is lehetnek. Vannak iskolák, amelyek a paraméter, és vannak, amelyek az argumentum kifejezést használják.

Ez a függvény ebben az állapotában nem tesz semmit, de a következő szakaszokban tárgyalt függvények már igen.

Értékek visszaadása
Az előző példában az a()-függvény nem csinált semmit, így végeredményben semmilyen haszna nincsen. Normális esetben a függvényt arra használod, hogy valamilyen feladatot elvégezzen, és valamilyen értéket adjon eredményül, amit a függvények a return()-utasításon keresztül csinálnak meg. A PHP nem kényszerít a változókra vagy függvényekre adattipizálást, így a függvényedből bármilyen típusú értéket kaphatsz eredményül. Ha nem ismernéd a tipizálás kifejezést, akkor elmagyarázom. Arra a folyamatra használják bizonyos nyelvekben, amikor valami az adatot meghatározott adattípusúvá változtatja. A 329

10. fejezet Függvények

PHP az adatokat általában nem tipizálja, amikor változóba helyezed őket, de azért ez is előfordulhat, mint a következő példa mutatja. A $b értéke a $a-ban lebegőpontos számként van eltárolva. Hogy esetleges zavarodottságod fokozzam, elmondom, hogy a lebegőpontos számokat hívják valósnak, illetve doubles-nek. Ez utóbbi a PHP-ban a legelterjedtebb:
$a = (double) $b;

Előfordulhat, hogy eredményként egy tömböt szeretnél, ha minden jól működik, és egy logikai hamis értéket, ha rossz valami. Ebben a részben arról lesz szó, hogyan ad a függvény eredményül értéket, hogyan jelenítsük meg a kapott értéket annak igazolására, hogy az megfelelő, majd hogyan teszteljük a kapott értéket a egyedi eredmények észlelésére és arra az esetre, ha a függvény hibát jelez. A következő példa olyan függvényt mutat be, amely egy <font> tag-et ad eredményül, amellyel egy hibaüzenet elkezdhető. Számtalan egyszerű formázófüggvényt találsz ebben a könyvben, mert azokkal megbízható HTML-oldalakat lehet létrehozni, amelyek minden böngészőben működnek: function red() {return("<font color=\"red\" > " ) ; } Ez a függvény mindössze egy a piros színt magában foglaló HTML <font> tag-et tartalmazó sztringet hoz létre, és a sztnnget adja eredményül. Használd a red() példafüggvényt print- vagy echo-utasítással (vedd észre a pontösszefűző karaktert), mint itt: print(red() . "my error message</font>" ) ; A print-utasítás egy sort hoz létre a weboldaladon, amely piros betűkkel jeleníti meg a következőt: my error message Ha a print()-utasítás használatával az értéket egyenesen a függvényből küldöd a böngészőbe, akkor nagyobb oldalformázó függvényekben nem használhatod a függvényt az egész honlap felépítéséhez. A következő példa azt mutatja meg, hogy némely programozók hogyan írnak üzenetfüggvényt beépített printQ-utasításokkal. Ekkor nincsen ellenőrzésed az üzenet megjelenése felett: function warning_message() { p r i n t ( " < f o n t
color=\"red\">Warning!< / f ont>");

Ehelyett kérdezd le az értéket a függvényből, majd tedd a függvényt olyan műveletekbe, mint a printQ. A következő példa az előzőnek egy változata, amelyben a printQ kikerült a függvényből, így a figyelmeztető hibaüzenetet sokkal rugalmasabban használhatod. Ha a printQ-függvény az oldal létrehozásának utolsó lépése, bármennyi szövegformázó függvényt egymásba ágyazhatsz:
function warning_message() color=\"red\">Warning!</font>");

return("<font

print(warning_message());

330

I
Áttekintés

A függvényből kapott eredményekkel kiterjesztheted a függvény használhatóságát. A warning_message()-függvényt bármilyen másik függvénybe bele lehet ágyazni, amelyik üzeneteket küld a weboldalra. így van egy központi hely, ahol megváltoztathatod a kiemelést és a figyelmeztetések szövegét. Ha a warning_message()-függvényt több másik függvény is meghívja, és „Figyelmeztetés"-ről „Vigyázz"-ra akarod az üzenetet változtatni, elegendő a változtatást egyszer végrehajtani. A következő sorban a hibaüzenet további kiemelést kap megjelenítés előtt: prir.t ( "<em>" . warning_message () . A PHP-függvények kódolásának másik szokványos módszere, ha a függvénnyel valamilyen műveletet végzünk, és a függvény siker esetén igaz, hiba esetén hamis eredményt ad. A fejezet későbbi részében használt fájlfüggvények vagy hamisat vagy fájlazonosítót eredményeznek, mely utóbbi nem más, mint egy nullánál nagyobb egész szám a megnyitott fájlok esetén. Ez a nulla értékű egészeket hamisnak értelmezi, míg minden más egészt, így a negatív értékeket is igaznak. Ez azt jelenti, hogy a fájlazonosító értékével úgy tesztelheted a sikert vagy hibát, mintha az igaz/hamis lenne. A következő példában láthatod, hogy hogyan használd a fopenQ PHP-függvényt és hogyan teszteld az eredményt. Vedd észre, hogy a fopen() előtti @ - például nem létező fájlok esetén - elrejti a PHP beépített hibaüzenetét, így megfogalmazhatod a saját üzenetedet:
$file_handle = @fopen("atestf ile.txt", if($file_handle) { p r i nt ( " < b r > F i l e o p e n " ) ; } eis e { pri nt (" < br> Fil e di d not o p e n " } ; } "r");

A PHP tudja if()-tesztben használni az érték-hozzárendelés eredményét. így a következőképpen egyszerűsítheted az előző kódot:
if( $ f ile_handle = {print("<br>File ("<br>File did not @fopen("atestfile.txt", o p e n " ) ; } else {print open");} " r " ) )

Figyeld meg, hogy a pontosvessző (;) eltűnik a fopen()-utasítás mögül. Az egyik leggyakoribb kódolási hiba az if()-be helyezett utasítás végén hagyott pontosvessző. PHP4-ben az ilyen hiba azonnal szintaktikai hibát okoz, így az első tesztelésen kijavíthatod.
Ötlet: A beágyazott fájlokban lévő kód mindaddig nincs szintaktikailag ellenőrizve, amíg valahova be nem ágyazzák a fájlt írj egy tesztoldalt, amely beágyazza, és így le is ellenőrzi az összes fájlt.

A PHP a nulla hosszúságú sztringeket hamisnak, minden más sztringet igaznak értelmez. Ha olyan függvényt készítesz, amely sztringet ad eredményül, és szeretnéd hibajelzésre használni, gondold meg, hogy a nulla hosszúságú sztringet használod-e hibajelzőként. Hogy folytassuk a bemutatást, a következőkkel egy olyan függvény eredményét tudod ellenőrizni, amely szöveget hoz létre, és nulla hosszúságú sztringgel jelzi a hibát: i f ( ge n e r a t e _ t e x t ( ) )

331

10. fejezet Függvények

Az a tény, hogy a függvény sztringet ad eredményül, problémát okoz. Mivel a PHP nem erőlteti a változók tipizálását (a változók típusáról a 2. fe]ezetben esett szó), a nullát tartalmazó sztrmget zéró egésznek értelmezi, azt viszont hamisnak. Ha sztringet eredményező függvényed érvényes sztringként előállíthatja az egyszerű zérót, akkor a következő tesztet kell használnod az üres sztring, a "" és "0" megkülönböztetésére:
if(generate_text() === " " )

Az == (egyenlő) összehasonlító operátor összehasonlítja, hogy a két mezőnek ugyanaz-e az értéke, de nem ellenőrzi, hogy ugyanolyan típusú változók-e, így a PHP automatikus típuskonverziója miatt különböző értékek ugyanolyannak tűnhetnek. Az = = = (azonos) összehasonlító operátor az értékek összehasonlítása előtt ellenőrzi, hogy a mezők ugyanolyan típusúak-e, és nem keveri-e össze a hamisat a 0-val, a ""-vei vagy a "0"-val.

Értékek bevitele
A függvényekbe a zárójelek között meghatározott mezőkön keresztül lehet értékeket bevinni. A következőken a red()-példát fejlesztjük tovább szöveg bevitelével és a szöveg <font> tag-ek közé helyezésével. így a red()-függvényt bármilyen szöveggel használhatod, és biztos lehetsz benne, hogy a szöveg a megfelelő <font> kezdő- és végtag között van: function red($text) {return( " < f ont color=\"red\">$text</font>");} A következő kódmintában használt red()-függvényt most könnyebb használni, ennek eredménye a függvények gyakoribb használata és a hibák csökkenése. print(red("my error message") ) ; Az eredmény változatlanul egy piros betűkkel írt sor a böngésződben: my error message A PHP alapértelmezésben értékként továbbítja a paramétereket (a függvényen belül lemásolja a beviteli mezőket). A beviteli mezőkön végrehajtott változások nem jelennek meg a függvényen kívül, mert a függvény az értékek másolatán végzi a változtatásokat. A másolatot jellemezhetnénk lokális változónak vagy lokális hatáskörűnek. A hatáskörről e fejezetben később még részletesen szó lesz. Ha az eredeti beviteli mezőt akarod megváltoztatni, tegyél &-jelet a beviteli mező elé. így a PHP hivatkozásként továbbítja az értéket, és a függvény a másolat helyett az eredeti változóval dolgozik. Ennek szemléltetésére próbáld ki a következő kódot:
function numbered_message(&$number, $text) { $number+-t-; return < "<brxfont color=\ " red\ " ><br>" . $number . " " . $text . "</font>"); } $message_number = 0;

332

Áttekintés

print("<br>The message number is " . $message_number) ; print(numbered_message($message_number, "bright red error message")) ; print(numbered_message($message_number, "another error message")); print("<br>The message number is now " . $message_number)■

A következő eredményt kell látnod. Az üzenetszám 0-val kezdődik, és a numbered_message()-függvénnyel 2-re nő. Ha a számot értékként továbbítottad volna, a numbered_message() a változó másolatát változtatta volna meg, nem magát a változót. Ekkor minden üzenet l-es számú lenne, és az utolsó sor a 0 értéket jelenítené meg:
The message number is 0 1 bright red error message 2 another error message The message number is now 2

Tetszőleges értékek
Ha a függvényedet állandóan ugyanarra a célra használod, érdemes egy olyan alapértelmezett beviteli értéket meghatározni, amelyet bizonyos esetekben persze figyelmen kívül lehet hagyni. Adhatsz alapértelmezett értékeket a beviteli mezőknek, és a függvényt használó ember eldöntheti, hogy más értéket ad meg vagy nem. A date()-függvénynek a mai dátum és idő az alapértelmezett értéke, ezáltal az input-mező kitöltése tetszőleges. Ha a date()-et használod, választhatod az alapértelmezett mai dátumot, vagy saját adataidat is megadhatod a függvénynek. Legtöbbször az alapértelmezett beállítást fogod használni, és az éppen aktuális dátumot adod az adatbázis rekordjába vagy a weboldalba, de megeshet, hogy más dátumokat, például születésnapokat vagy a következő hónap első napját adod meg. Például a red()-függvénynek lehet alapértelmezett figyelmeztető üzenete, de megengedheted, hogy a felhasználó határozza meg a használni kívánt színt.
Ötlet: Miért használnál a piros helyett más színt egy függvényben, amely piros szöveget kell, hogy előállítson? A hagyományos HTML-ben van egy RGB (piros/zöld/kék) szín, a UffOOOO, amely a 100 százalék pirosat, nulla zöldet és kéket jelöl. Ezt a színt bizonyos színvakság esetén nem látják az emberek. Ha ezt #ff3333 színre cseréled, amely némi zöldet és kéket is tartalmaz, akkor mindenki el tudja az üzenetet olvasni. Ez is minden böngészőben biztonságosan megjeleníthető, és még mindig piros. A részletekért látogasd meg a http://petermoulding.com/colour/colourblindness.html oldalamat.

A következő kód az alapértelmezett figyelmeztető üzenettel mutatja a red()-függvényt:
function red($text="Warning, unidentified error!")

Ha ezt írod a szkriptedbe: print(red()); ez lesz az eredmény: Warning, unidentified error!

333

10. fejezet Függvények

A kötelező és opcionális mezőket kombinálhatod is. Helyezd az opcionális mezőket a végére, így az emberek elhagyhatják azokat a mezőket, amelyeket nem használnak, vagy amelyekre az alapértelmezett értéket akarják használni. Ha egy függvény utolsó paraméterét használod, az összes előtte lévőt meg kell adnod. Ha az utolsó paramétert nem használod, elhagyhatod. Ha az azt megelőző paramétert sem használod, azt is elhagyhatod. A kevésbé használt paraméterek a sor végére helyezésével egyszerűbbé teheted elhagyásukat. A következő példában a $text kötelező, mert a szöveget mindig meg kell adni. A szöveg nélküli <font>-tag semmit nem csinál egy weboldalon, így a szövegmező kötelező, de a $color-paraméter opcionális, mert a legtöbb ember úgyis az alapértelmezett pirosat hasz> nálja: function message($text, $color="red")
return ( "<brxf ont color=\"" print(message("bright red . $color . »\»>» $text
11

</font>1

error

message")) ;

A $color-mező alapértelmezett értéket kap, amelyet akkor kell használni, ha a felhasználó nem ad meg Scolor-értéket a függvénynek. Az alapértelmezett érték logikailag ugyanaz, mintha a függvény első sora ezt tartalmazná:
if ( lisset(Scolor)) {$color = "red";}

A következő kódot nem olyan könnyű használni, mert egyik paramétert sem hagyhatod ki, ha bármelyiket is használod. Ha a paramétereket ilyen sorrendbe helyezed, nem hagyhatod el a $color-t, mert a $text-et mindig meg kell határozni:
function message($color-"red", color = \ " " $text) $color
" \ " >"

return ("<brxfont

$text

'</font>'

print(message(, "bright red error message"));

A print() a messageQ által eredményezett sztringet jeleníti meg, de a hiányzó colorparaméter miatt a message() szintaktikai hibát okoz.

Változó számú beviteli mezők
Jóllehet az opcionális értékek nagyon hasznosak lehetnek, előfordulhat, hogy nem tudod, hány paraméter kerülhet a függvénybe. A PHP4 lehetővé teszi, hogy megállapítsd, hány paramétere van a függvénynek, és ennek megfelelően használd. A függvényedben a paraméterek változó hosszúságú listájának kezelésére a func_num_args()-, func_get_arg()- és func_get_args()-függvényeket használhatod. A red()-függvényt megváltoztathatod erre:
function red() { $red_text = ""; $red_count = func_num_args(); :

334

Áttekintés

for($i = 0; $i < $red_count; {$red_text .= func_get_arg return ( "<brxfont color=\ " red\ " >"

$red„text

1

</font>1

A módosított red()-függvényben nincsenek az első, function red()-sorban meghatározott paraméterek, és a paraméterek dekódolása manuálisan történik. A func_num_args(), a red()-függvényben használt paraméterek számát adja meg. A for()-ciklus végigfut a paraméterek listáján, a func_get_arg() veszi a következő paramétert, ami a szöveg egy sora, majd az összes beviteli szöveget összegyűjti a $red_text-ben és megjeleníti a <font> tag-ek között. Minden sor szöveg végén a <br> beszúrásával sortörést hoz létre. Gondold végig a következőt: print(red("red text", "more red text")); Ez a következő két szöveges sort eredményezi: red text more red text A meghatározott paraméterekre a sorszámukkal is hivatkozhatsz, mintha a paraméterek egy tömb elemei lenének: $red_text = func_get_arg(3); Ezt a tulajdonságot kihasználtam az előző példában, a számot $i-vel adva meg. Mindig a számokat használd, ha a paraméterek pozícióját valami könnyen megjegyezhető és megszámolható dologhoz tudod kötni. Például használhatod ezt a tulajdonságot olyan függvényekben, amelyek sorszámozott listákat fogadnak el. Képzelj el egy függvényt, amely egy kocsi sebességfokozatait fogadja el paraméternek. A paraméter 1 az első sebesség, a paraméter 2 a második sebesség, és így tovább. Az összes paramétert eltárolhatod egy tömbben, majd használj tömbfeldolgozást minden egyes alkalommal, amikor az a legcélszerűbb. A func_get_args() a paramétereket tömbbe rendezi. Úgy futhatsz ciklussal végig a tömbön, ahogy csak akarsz. A func_get_args() így működik: $red_array = func_get_args() ; A rögzített stílusú kötelező paramétereket kombinálhatod az opcionális paraméterek változó listájával. Ha három normál beviteli mezőt határozol meg, majd a változó lista feldolgozást használod, az első három beviteli mező a névvel ellátott mezőkben lesz, nullától kettőig számozva. A lista változó részében levő mezőkhöz csak ezt a három elemet kell a paramétereket tartalmazó tömbben átugranod. A következő példa az előző red()-függvény három rögzített pozíciójú paraméterrel rendelkezik úgy mint a $date, $time és $place. A függvény a korábban is használt for()ciklussal fut végig az opcionális paramétereken, azzal a különbséggel, hogy a ciklus a 0 helyett 3-mal kezdődik:
A"

335

A függvényen belül a változó globális lesz. majd valaki másnak a függvényét ágyazod be a kódodba. for($i = 3.- Hatáskör A hatáskör (scope) szó a görög jel vagy cél jelentésű szkopósz szóból származik. ha &-jel van előttük. " " . ha ugyanolyan nevű globális változót definiáltál.= func_get_arg($i ) return ( "<brxf ont color=\ " red\ " >" $place " <br>". megszakíthatod a függvényt azáltal. ha azok is globálisként definiálják a változót. és mely részében lehet használni őket. amíg az ember megjegyzi őket. Ehelyett az adott függvé nynek megadod. • A függvények mindig globálisak. "</Eont>") . PHP-ban a hatáskör szabályai a következők: • A függvénybe változólistával bevitt változók lokális változók. kivéve. Microsoft Visual Basic-ben a változót ak kor deklarálod globálisnak. mint a mikroszkóp vagy teleszkóp. A Visual Basic-ben programozók ezért gyakran összetett elnevezési szabályokat alkalmaznak az ilyen hiba megelőzésére. ha paraméterként viszed be a függvénybe. amelyeknél eltart egy ideig. ^^r . Gondold végig például a következő kódot: $a = "A short sentence". Si+ {$red_text . hogy lokális vagy globális változót akar. hogy hogyan férjen hozzá a függvényen kívül definiált változóhoz. $time $red_count = func_num_args(). $time. A scope megtalálható az olyan szavakban. Ha a Visual Basic megközelítését használod. kivéve. fejezet Függvények function red($date. $place) { $red_text = $date . mint amilyet a függvény lokális változóként használ. függetlenül attól. • A függvényen belül definiált változók lokális változók. amelyek mind egy adott területre való ráközelítés eszközei. $i < $red_count.} $red_text . . A PHP-féle megközelítés biztonságosabb. amikor először definiálod a program elején. PHP-ban a függvényt író dönti el.10. így egy másik függvény belsejében definiált függ vény mindenhol elérhető. kivéve. mert nyelvenként eltérőek. Amikor ezt a kifejezést függvényekkel és változókkal kapcsolatban használjuk. ha global-utasításban nevezted el őket. a hatáskör azt jelzi. illetve ha global utasításban vannak defini álva. de a többi függvényben csak akkor. PHP-ban nem deklarálsz globálisnak egy változót a program fő részében. • A függvényen kívül definiált változók nem érhetők el a függvény belsejében. hogy függvényen belül vagy kívül definiálták őket. • A defineQ-utasítással definiált konstansok mindig globálisak. hogy a kód mely részében látod ezeket az elemeket. • A hatáskör egyike azoknak a dolgoknak.

$y. A $x tárolja a $a-ban lévő karakterek számát. A $a-változó tartalmazza a mondatot. nehéz lehet minden egyes előfordulásnál megállapítani. a substrQ pedig a függvényt. $y < $x. A global utasítja a függvényt.• // the character that separates words $c = 0. Az előző példában a $a-. for($y = 0 . Ebben a példában a $a.Áttekintés $b = " ". $y. $c) vagy a függvény hatáskörében ($x. $b. $b). A $x. $y++) { if(substr($input. így különítsd el őket a függvénybe. $b = " " . mint az előzőben. $b. hogy az adott helyen melyik kód állítja be a változót. } } re t ur n( $z) . tartsd hát meg őket a kód fő részében. $z = 0. $y++) if(substr($a. $b. Az egyetlen különbség abban van. Tartsd az egyes $x-ek elkülönített használatát a függvényen belül. 1) == $separator) { $ z + + . 1) == $b) {$c++. Jóllehet máshogyan is meg lehet a szóközöket számolni. így a $x és $y hatásköre a függvényre korlátozott. a $b a szóközkaraktert. for($y = 0. hogy a kód egyes előfordulásait mind meg kellene keresned. $y. } $c = count_spaces($a. $y < $x. // count of separation characters $x = strlen($a).} Ez a kód a szavak közötti szóközöket számolja meg egy mondatban. ezzel a példával könnyen meg lehet magyarázni a változók PHP-függvényeken belüli hatáskörét. amely minden egyes szóközt megtalált.és $c-változókra a szóközök megszámolása után is szükség van. // the character that separates words $c = 0. Ha egy hosszú szkriptben sokszor használod a $x-változót. $separator) { $x = strlen($input). $z). / - 337 .és $y-változókra viszont nincsen szükség a szóközök megszámolása után. a $c a szóközök számát. $y. hagyd ki őket a függvényfejből és global-utasítással add be őket. A változókat globális változónak nevezik. A kódnak a függvénybe való különválasztásával anélkül tudod azt a függvényben bármikor megváltoztatni. A beágyazott függvénnyel így néz ki a kód: $a = "A short sentence". amelyet módosítani kell. for() és substr() pontosan azt teszik. $c. és a hatáskörük mindenhova elér. létező változókat. Próbáld a kódot függvényekbe szétválasztani. Ha sok olyan beviteli mező van. hogy használja a függvényen kívül definiált. hogy hol láthatók a változók: a program fő részében ($a. A függvényben használt változókat is kiemelheted a függvényen kívüli kódból. $x. // count of separation characters function count_spaces($input. és a for()-ciklus végigfuttatja a substr()-t a $a karakterein.

de azt nem fogják látni. A PHP-ban az össze függvénynév globális. ha a szkript a függvények egyik felét egyféle célra. functíon numbered_message($text) global $message_count. A változónak nem kell az előtt léteznie. hogy a kód többi része az összes módosított változóhoz hozzáférjen.10. és egy global-utasításban nevezi el a változót. ha az eredménye hamis. majd minden olyan függvényben. A következő példában a belső bold()-függvény az error_message()-függvényen kívül is elérhető. ahol a global-utasításban elnevezed. globálisnak deklarálja. hanem a szkriptben lévő hibákat is problémás lesz észrevenni. fejezet Függvények A következő példa egy korábbi példában használt numbered_message()-függvény egy részét mutatja. A függvény a változók bármelyikét megváltoztathatja. a függvények globális jellege miatt az egymásba ágyazás ésszerűtlen. print (bold ("bold message")). Az előző példa egy változót definiált a global-utasításban. hogy a változó csak a függvény bizonyos részeinek használatakor jöjjön létre. igazat vagy hamisat adva a siker vagy hiba jelzésére. A függvényed az adatfeldolgozás után dönthet úgy.- Legfeljebb nagyon hosszú szkriptek esetén van értelme így használni a függvényeket. amelyhez a globalutasítással férhet hozzá: Smessage_count = 0.} return ("<brxf ont color = \ " red\ " >" . Habár egy függvény másik függvényen belüli definiálásával egymásba ágyazhatsz függvényeket. bold($text) . A globális változók használatát mindig körültekintően dokumentáld. amely azt használja. amely return()-utasítással siker esetén mindig igazat. hogy a függvényeket nehéz lesz megtanulni és megjegyezni. ahogy azt a következő példában látod. 338 . A globális változók révén a függvényed többszörös értéket is visszaadhat. hogy a változó megváltozott. hiba esetén mindig hamisat ad eredményül. annyiban megváltoztatva. Lehet olyan függvényed. így semmi ok nincsen a bold()-ot az error_message()-en belülre helyezni: function error_message($text) { function bold($text) {return("<strong>$text</strong>"). és csak akkor hoz létre egy hibaüzenetet tartalmazó globális változót. } print(error_message("bright red error message")). A változónak nem kell abban a pontban léteznie. egyszerűen az összes változónak egy global-utasításban történő listázásával. "</font>"). Az előző példában a változók globálissá tételének hagyományos módját láttuk: a változót a szkript elején definiálja. $message_count + +. és lehetővé teheti. A globális változók függvényekben való bonyolult használata nem csak azzal jár. hogy új változót hoz létre. illetve a global-utasítás lehet feltételes utasításon belül. hogy a global-utasításban definiálnád. A függvényedet használó emberek annyit fognak látni. másik felét pedig más célra használja. hogy hol. de bármennyit megnevezhetne. A numbered_message() a függvényen kívül definiált $message_count-változót használja. hogy globális változót használ.

" " </font>" $text . íme egy példa arra. hogy azokat az a. ahogy egy weboldal designját is fej. // raessage_count is used by nurabered_message() function numbered_message($text. hogy az értéket csak abban a függvényben használod. hogy a kódrészletet nehéz megérteni. Ha nagy szkriptet tervezel. hogy hogyan kezelheted a függvények nagy halmazait. Ha a legtöbb változó globális. b. ha másik függvénybe vannak beágyazva. és használj minél több korlátozott használatú változót.html"). Ezután használj a következő kódban lévő függvényhez hasonlót a megfelelő fájl behívására: function select_includes($model) { include("a. a kód bonyolulttá. 339 .Áttekintés A szkriptet kisebb. B függvényhalmazt az sportos terepjáró és C függvényhalmazt a felnyitható tetejű sportkocsik rendelésekor. akkor is. ahányszor a függvényt behívod. Éppen úgy. amely elvégzi a teljes oldalformázást. jobban kezelhető részekre bonthatod. abból egy könnyen érthető kódrészlet lesz. if($model == "Explorer") < include("b. ha a kódot eltávolítod a függvényből és visszahelyezed az eredeti pozíciójába. amelyet mindannyiszor használsz. és mindegyik részre függvényt készítesz. Ennél egyszerűbb és logikusabb azonban a statikus változók használata. Az értéket eltárolhatod egy globális változóban. return ( . $Inessage_count++. Ha számtalan gyakran használt változót továbbítasz a részek között. mert a függvények bárhol elérhetők. hogy legyen némi elképzelésed arról. és használat után értéket kell a következő használatba továbbítania. lehet. "<brxfont color=\" . a változók nyomon követése pedig összetetté válhat.html. de mindig figyelembe kell venni a használt változók hatáskörét. Statikus változók Tegyük fel. hogy a szkriptet elkülönült részekre bontod. Lehet egy olyan függvényed. Ha egy függvényben sok lokális változó és csak néhány globális változó vagy paraméter van. és egy másik. A példa azért működik. A függvényhalmazokat feloszthatod úgy.html"). Ügyelj az adatok hatáskörére. mérlegeld annak lehetőségét.html és c. mit kellene tenned. a szkriptedet is felbonthatod. hogy van egy függvény. ha nem lennének statikus változók: $raessage_count = 0 . $color $message_count . Azt is tételezzük fel. r A példa csak a kód részletét mutatja annak érdekében. ahogyan az a következő bekezdésekbe le van írva. Egy külön kérésre készített kocsi rendelésére használt szkript A függvényhalmazt használja az összes kocsi. amely minden adatot összegyűjt az adatbázisból.és törzsrészre bontod.html fájlok tartalmazzák. és jobban jársz. $color="red") { global $message_count. amelyet többször használsz a szkriptben.

$message_count . $color $text . print(numbered_message("another bright red error message")). Ez lesz az eredmény: 1 bright red error message 2 another error message A $message_count értéke megmarad a numbered_message() használatai között. 340 . ha a numbered_message()-t többször behívod? Ellenőrizd a statikus változót a numbered_message() két print-utasításban való használatá val. ha a változó be van állítva. $color="red") static $message_count. ha az értékeket statikus változókban őrződ meg. így a $message_count értéke a numbered_message()-en belüli használat után megmarad. és lefuttatja a hosszú kódot (amit itt a három pont jelképez): If(!isset($message_count)) { $message_count = . A numbered_message()-függvényen belül global-utasítással férhetsz hozzá a $message_count-hoz. és nem érhetők el a függvényen kívül. amikor használja a függvényt. " " . Újra és újra létrehoz egy hagyományos változót. hogy az érték be van-e állítva. A következő példa a hiányzó változó tesztelését mutatja. és nem jelenik meg a numbered_message()-en kívül. hanem helyettesítsd a global-utasítást a static-változódefiniálással. "\">" "</font>" Mi történik a $message_count-tal. így csökkentve a műveleti időt. az !isset()-függvény eredménye pedig akkor igaz. Ha a $message_count kiinduló értéke egy hosszú kód eredménye lenne. fejezet Függvények A $message_count-változót létrehozhatod a numbered__message()-függvényen kívül. de a statikus változó változatlan marad. $message_countT+. Ha olyan függvényt írsz. jobban jársz. ahogy azt a következő példa kiemelt sorában láthatod: function numbered_message($text. Az issetQ-függvény igazat ad eredményül. . A statikus és hagyományos változók minden másban teljesen megegyeznek. return ( "<brxf ont color=\"" . A statikus változók lokális hatáskörűek.. mint itt: r print(numbered_message("bright red error message")).. amely minden egyes használatakor hosszadalmas műveletekkel kiszámolja ugyanazokat az értékeket.10. Statikus változókkal nincs szükség a $message_count külső definíciójára. amikor még nincsen. a kiinduló érték újraszámolását megspórolhatod. így nem oszthatók meg a függvények között. ha leteszteled.

akkor . Ha a következő karakter is pont... hogy eltávolítsa az első pontot. mert a szknptet soronként dolgozza fel...... " ) {Stext = substr(Stext. 18 csésze kávé és 200 oldalnyi szöveg kell ... így az értelmezés eredményét elmenti és újra használja. A példa következő részében a kód egy nem mutatott része eldönti...behívhatják saját magukat... a függvény behívja saját magát..} Rakhatsz a szkriptbe olyan kódot. ez a legkevésbé összetett példa.a következő használathoz ..} {.. amely több adatbázishoz hozzáfér. -1) == " .} if{substr{$text... print(remove_dots($string_with_lots_of_dots)).a rekurziónak nevezett művelettel . 0... " : 341 .. hogy melyik adatbázis van használatban... . (Ahhoz..és ez csak a kód első sorához elég.} return($text}. Ebben a részben egy példán megyünk végig. majd a megfelelő függvényt választod ki használatra.. utána pedig elmondom az előnyeit és a dokumentációt. így óvakodj tőle. hogy a rekurzióra igazán hasznos példát találjak.. hogy éppen melyik adatbázissal dolgozol.. hogy eltávolítsa a következő pontot: $string_with_lots_of_dots = "dots ........ PHP3-ban a rekurzió különösen lassú.. Vagy ellenőrizheted az adatbázist egyszer.. amely ellenőrzi.ugyanabban a sorban behívja a második substr()-t..... hogy megtámadja. -1) == " ...tárolhatod egy változóban. amit ki tudtam találni..... és rekurzió nélkül gyorsabban futna. A harmadik substrQ a kiemelt sorban a második pontot vizsgálja. és megnehezíti a kódod megértését. és ha van pont. A PHP4 inkább compiler típusú nyelvként működik.... így a rekurzió itt kevésbé időigényes. " .. A példa olyan függvényeket tartalmaz... és behívja a remove_dot()-ot. -1).. function remove_dots($text) í if(substr($text.. és az eredményt . és egy függvény rekurziója rengeteg CPU-időt használ a függvény újraértelmezésére....... Itt van egy szkript példája. Az első substrQ megkeresi az első pontot. ennek is kevés előnye van.. amelyek hibainformációt kapnak a MySQL-től és az Oracle-től: function mysql_error ( ) function oracle_error () {.) A következő példa egy pontot távolít el a sztring végéről. A következő példa rekurziót használ.Áttekintés Rekurzió PHP-ban a függvények . így a változóba a MySQL hibafeldolgozó függvény neve kerül: $database_error = "mysql_error" ... Hasonlóan a rekurzióhoz..... Habár egyszerűbben is meg lehet ezt csinálni.. A példában ez a MySQL.. Változóban elnevezett függvények A függvényneveket lehet változókban tárolni. " ) {Stext = remove_dots(Stext) ... A rekurzió nehézzé teheti kódod megértését..

Mielőtt a PHP megpróbálja elvégezni a függvényt. Például: print($database_error())• Figyeld meg a Sdatabase_error() részt. A call_user_func() nevű különleges függvénnyel máshogyan is be lehet hívni változókban elnevezett függvényeket (erre a fejezet „Gyors megoldások" részében találsz példát). mert a kódodon dol gozó következő emberek számára a használata már nem lesz egyértelmű. mielőtt a függvény használná. a hivatkozást nem kell megváltoztatni. Példákat a 3. A választás az információ terjedelmétől és a használat gyakoriságától függ. és a szkript nem fog működni.vagy switch{)-utasításokban. hogy egy. De mi történik azokkal a változókkal. fejezet Függvények Most már kiegészítheted a kódot a $database_error()-re való hivatkozással. és ha új adatbázist adsz hozzá. a behívott függvény paramétereit tartalmazó tömböt használj. Ha behívsz egy függvényt. a call_user_func_array() egy lépéssel tovább megy. és a teljes kód kezelhetetlen lenne if(). és azokat is. és lehetővé teszi. míg PHP3-ban a függvénydefiníció meg kell. az állapotinformációkat tömbökben. Egy új függvény. ellenőrizd. Ezután elvégzi az mysql_error()-t. amit a függvény global-utasításon keresztül ér el. mivel a $database_error a mysql_error()-t tartalmazza. Sztring típusú változóba könnyen kerülhet érvénytelen input. Definiáld az összes függvényt egy helyen. ha a változó érvénytelen változónevet tartalmaz. hogy a változó létezik-e. amit a legegyszerűbb megértened. Ha egy függvény változót használ. hogy előzze a függvény használatát. Azt használd. a $database_error()-t a $database_error() tartalmára cseréli. és mérlegeld a gyakran használt függvények külön fájlba való elhelyezését. hogy a változó csak érvényes függvényneveket kaphat. A függvénynevek változóba tétele akkor működik. Bizonyos szkriptek esetében jobb megközelítés a hagyományos függvények szokásos használata. hogy az összes olyan változót létrehoztad. megvalósítanod és elmagyaráznod.. amikor nagy számú vagy nagyméretű függvénnyel kell dolgozni. adatbázisokban vagy XML-ben tárolva.10. hogy az összes szükséges értéket megadtad-e a paraméterekbe. Rendkívül hasznos eljárásnak bizonyul olyankor. mert minden egyes függvényen dolgozhat más-más személy. amelyet beágyazhatsz az egyes oldalakba. gondosan ellenőrizd. Ez a technika skálázható. kerülve a változókban elnevezett vagy a call_user_func()-hoz hasonló függvények használatát. és 20. amelyeket global-utasítással ér el? Bizonyosod) meg arról. amelyeket a függvényed által behívott függvények érnek el. ha a függvénynév egy állapotot vagy műveletet ír le. Havonta bukkannak fel új megoldások. \ Sorrend PHP4-ben bármilyen sorrendben definiálhatod a függvényeket. könnyen megjegyezhető módon. A függvénynevet tartalmazó változó használatát dokumentálnod kell. amelyekkel több-kevesebb kódot megspórolhatsz. 5. így győződj meg róla. 342 . fejezetben találsz.

tabulátor vagy új sorok. még nullát is beírhatsz. Nem kell paraméter a dateQfüggvénybe. if(isset($PATH_INFO)) { return($PATH_INFO) . de némi üzenetszöveget tesz hozzá: 343 . vess egy pillantást a következő függvényre. ha a függvényt a honlapod php/-könyvtárának indexoldalára rakod be. amely egy honlap aktuális oldalának elérési útját adja vissza: function path_to_page() { global $PATH_INFO. hogy mindkettő hiányzott volna. } elseif(isset($PHP_SELF)) { return($PHP_SELF) . így nem hozhatsz létre Car() néven függvényt. mert az a szükséges inputot a rendszerórából kapja. de a név és az első zárójel. Ezzel ellentétben egy grafikus képet létrehozó függvény több tucat paramétert fogad a színek és koordináták meghatározására.$PHP_SELF.és nagybetű között. A következő' az előző példát folytatja. zárójel. mint itt: function any_name(] A függvénynévnek egyedinek kell lennie. és közülük bármelyik hiányozhat.Gyors megoldások Gyors megoldások Függvény létrehozása Függvény létrehozásához a function kulcsszó. majd kapcsos zárójel szükséges. 0 Ezután. egy függvénynév. egy vagy sok szóköz. illetve a második zárójel és az első kapcsos zárójel között lehet nulla. ha a car()-t már korábban definiáltad. Paraméterként bármilyen értéket. A function szó és a függvénynév közé szóköz kell. htinl Megjegyzés: A $PATH_INFO és $PHP_SELF ugyanazt az információt adják. Olyat azonban még sosem láttam. A függvénynév nem tesz különbséget a kis. Egy értéket a returnQ-utasítással kaphatsz vissza. Hogy lásd. hogyan működik. a path_to_page() a következőt írja ki: /php/ index.

function numbered_message($text. Globális változó deklarálása Ha sok olyan beviteli mező van. " " . $text . Ahhoz. A következő példában a $message_count a numbered_message()-en kívül van definiálva. hagyd ki őket a függvényfejből és global-utasítással add be őket. A függvény is létrehozhatja a változót. fejezet Függvények function path_to_page($part_a. amit változtatni kell.html. hogy egy l-es és egy 2-es számú üzenetet eredményez: print(numbered_message("bright red error message")). " . $part_a . " < / f ont>"). hogy a függvény által létrehozott változó mindenki számára elérhető globális területen van tárolva a függvény lokális területe helyett. print(numbered_message("another bright red error message")). A global-utasítás biztosítja. $part_b elseif(isset($PHP_SELF)) return("<p>" . hogy van egy /php/Índex. if(isset($PATH_INFO)) return("<p>" . .$PHP_SELF. $color="red") { g l ob al $ me ss ag e_ co un t . $message_count . $part_b . amitől azt várhatod. "\">» Teszteld a globális változót a következő két kódsorral. "</p> Tételezzük fel.html nevű oldalad. return( "<brxfont color = \ " " . ahol a global-utasításban megnevezik. Ezeket a változókat globális változónak nevezik. és a hatáskörük mindenre kiterjed. $message_count++. $PHP_SELF . $part_b) global $PATH_INFO. és a következő' kódot tesztként rakod az oldalra: print(path_to_page ("This page is ". 344 . $color . " ) ) . nevezd meg a $message_count()-ot a kiemelt global-utasításban: $message_count = 0. hogy a numbered_message() új változó létrehozása helyett a $message_count-ot használja. Ez lesz az eredmény: This page is /php/index.10. $part_a . $PATH_INFO . A változónak nem kell azon a ponton létezni.

hogy kitalálják. } return(true). $text . hogy amikor a függvény egyik használatából származó értékeket el akarod menteni a következő használatig. $color="red") static $message_count. ha a szkriptet valami hasonlóval kezded: $new_text = // This variable is fiiled with text by create_text Statikus változó deklarálása Minden egyes alkalommal. »\">" $text . A statikus változók ezen segítenek. és azt jelenti. ha az if () igaz: function creat e_t ext($t ext ) { and strlen($text)) if(isset($text) global $new_text. print(nuinbered_message("another bright red error message")) = ipa?' 345 ■ . return ("<brxf ont color = . "</font>". hogy a változók a függvényben is elérhetők legyenek.Gyors megoldások A következő példában a $new_text csak akkor jön létre. $new_text . amelyet a numbered_message() állít elő.= "<font color=\"red\" . Ha lemásolod az előző példát. A kód a global-utasítást használja. A numbered_message()-függvény úgy ír ki üzeneteket. és a globális változókat csak akkor definiálod. ha függvényszöveget talál a $textváltozóban. hogy nem tudod az értékeket a függvényen belül elmenteni. Előfordul. hogy minden egyes üzenet egyedi számot tartalmaz. mások számára probléma lesz. illetve a global-utasításokkal. "</font>") A változtatást a következővel ellenőrizheted: print(numbered_message("bright red error message")). " . A creat_text()-példát lehet fejleszteni. ami időveszteséget okoz. a függvényben minden ideiglenes adattárból jön létre. rengeteg időt töltesz a változók függvényen kívüli definiálásával. és a $new_text-változót akkor hozza létre. A $message_count statikussá deklarálásával a $message_count megőrzi értékét a numbered_message() behívásakor: function numbered_message(Stext. a numbered_message() minden elindításakor nullát tartalmazna. $message_count:++ . mely változókat használsz a függvényben. Ha a numbered_message() hagyományos változó lenne. amikor függvényt használsz. amikor azok adattal töltődnek fel. $color . $message_count .

A $result változó igaz vagy hamis értéket kap a fájlírás sikerétől. íme a függvény.10. így nem kell a kulcsértéket meghatároznod: function add_mysql($part. és a kulcs auto_increment-re van állítva. amely a rekordot a movements. így ellenőrizheted az eredményt: Hivatkozás: Szövegfájl megjelenítése oldal: 279 A következő kód a rekordot a movements nevű MySQL-táblázathoz adja. amellyel ugyanazt a feladatot szekvenciális Comma Separated Variable fájllal (CSV) vagy MySQL adatbázistáblázattal lehet elvégezni. íme a kód. A feldolgozófüggvény változóban való tárolásával a példa automatikusan kiválasztja a megfelelő fájlt és feldolgozófüggvényt. hogy céged raktárkészletének változását akarod rekordokkal nyomon követni. A MySQLkapcsolat már létezik. egy leíró ($part) és egy mennyiségi ($quantity) elemet tartalmaz: $part = "bolt". és az adatbázis nevét pedig a $database globális változó tartalmazza. és ez a változó jut vissza hozzád. a második paraméter. A táblázat kulcsa egy egész szám. az "a" pedig új rekordokat ad a létező fájl végéhez. $quantity = 3.csv". A példarekord két. " a " ) ) $result = fwrite($file. $quantity). illetve sikertelenségétől függően. az fwrite() pedig az azonosító használatával sztringet ír a fájl végéhez.csv nevű fájlhoz adja: f unc t i on a dd_fi l e( S pa r t. fejezet Függvények EZ az eredménye: 1 bright red error message 2 another error message Függvény tárolása változóban Tegyük fel. $part fclose($file). Spart 346 . $qúantity) { $sql = "insert intő movements set part='" . $qua nt i t y) { $result = falsé. i f ( $ f i l e = fopen("movements. és a rekordokat lemezen vagy adatbázisban akarod tárolni. hogy mások hozzáférjenek. A $file változó egy a megnyitott fájlra vonatkozó azonosítót kap. Az fopen()-függvény megnyitja az első paraméterében megnevezett fájlt. } return($result). Az fclose() bezárja a fájlt.

hogy hol történt a hiba. $delete_stock = "delete_" . A szkript legalább azt azonosítja. $sql)). quantity='" . Squantity . akkor a következő egyszerű figyelmeztetés jelzi. $add_stock = "add_" . $file_type. hogy a kód elért a red()-függvényhez. $count_stock = "count_" .Gyors megoldások . 3). amikor a felhasználó nem határozza meg a paramétereket. Ha ezt megtetted. return(mysql_db_query($database. $file_type. A kötelező és opcionális mezőket kombinálhatod. "'". hogy az add_file()-t vagy az add_mysql()-t használja: $add_stock = "add_mysql". color=\"" red print(message("bright message")). A kötelező mezők kerülnek előbbre. error $color . $file_type. return ( "<brxf ont $color="red") . hogy valami nem működik: Warning: Unidentified error! (Figyelem: ismeretlen hiba) Egy ehhez hasonló alapértelmezett beállítás jelzi. még ha az okát nem is. "</font>"). Ezután egy kis logikával rögtön testre szabhatod a teljes készletnyilvántartó alkalmazásodat. $print_stock = "print_" . a készletváltozásokat a megfelelő fájltípushoz ezzel adhatod meg: $add_stock("bolt". a Scolor pedig opcionális: function message($text. A következő példában a red()-függvény alapértelmezett figyelmeztető üzenete az alábbi: function red($text="Warning. amely meghatározza. $file_type. $text . A következő példában a $text kötelező. hogy az a függvényekbe a megfelelő' fájlfeldolgozást rakja: $file_type = "mysql". } Valahol az alkalmazás-alapbeállításokban definiálsz egy változót. 347 . hogy ezáltal a PHP összepárosíthassa a mezőket. "\">" . Alapértelmezett függvényparaméterek használata Az alapértelmezett függvényparaméterek a függvény által akkor használandó értékeket tartalmazzák. de elfelejtettél vagy nem tudsz hasznos értelmező üzenetet megadni. "'. unidentified error!") Ha a szkriptedbe ezt írod: p ri n t (re d ()).

html-t és a c. ha a létrehozás előtt ellenőrződ. mi az. hogy a függvény létezik-e.$text) return ( "<brxf ont color=\"" p ri n t( m e s s a g e ( . mert a message()-ben nincsen megadva érték az első paraméternek. ha hajnali háromkor felhangosítod a magnód. ha a print_message() már definiálva van. ahogy itt: if{!function_exists("print_message")) function print_message($message) print ("<p>" . Hogy megtudd. próbáld ki a következő példát: if(function_exists("red")) {print("Function red exists.html-t beágyazza a d. $color . amelyet még másik követ: function message($color="red".} function red($text) return("<font color=\"red\">" $text "</font>"). Az eredmény a következő piros betűs szöveg: bright red error message Ez is mutatja. előfordul. A kód létrehozza a print_message()-függvényt. $message . Itt van egy egyszerű prínt-függvény definiálása a biztonsági ellenőrzésbe ágyazva. Később valaki a b. Megelőzheted ezt. fejezet Függvények V .html. amelyet a b.html-be. ami olyan hibához vezet.10. A következő példa nem működik. A PHP-ban az utolsó megadott paraméter előtti összes paraméterre szükség van. "</ p> "). $text . 348 .) else {print("Function red does not exist. e rr o r "\">» ."). mint a szomszédjaid.html-be és a c. Az eredmény a kétszeresen beágyazott a. . egyetlen olyan paramétert sem hagyhatsz ki. ha a print_message() nem létezik. A function_exists() igazat ad vissza. és leállítja a szkripted értelmezését. " b ri g h t red .html-t. A !function_exists() pedig akkor eredményez igazat. Erre a PHP úgy reagál. .html-be is beágyazol. hogy a függvény tökéletesen működött a második paraméter nélkül. m e s s a g e ") ). -} Van egy nagy különbség a PHP3 és PHP4 között. és a függvénydefiniálásnál meghatározott alapértelmezett pirosat használta. Hibaüzenettel reklamál."). hogy egy függvényt kétszer hozol létre. Ez akkor gyakori. "</font>"). A függvény létezésének ellenőrzése Ha fájlokban hozol létre olyan függvényeket. amelyek más fájlokba is be vannak ágyazva. ha létrehozod az a. ami a szkript futását leállítja.

Ha egy függvény esetleg több helyen . $function_parameter_l. a függvény összes definíciójának tesztbe ágyazva kell lennie. A pontosvessző a Windows-t jelzi.. amely a tesztszerveren jelenleg használt operációs rendszer nevét tartalmazza.kerül létrehozásra. amely több függvénydefiníciót tartalmaz. Function red exists. A következő kód ellenőrzi a fájlnévben a pontosvesszőt. Először definiálj egy változót. lehet nulla is.például beágyazott fájlokban . de a számnak meg kell felelnie az alkalmazott függvénynek.) A $function_name egy sztring. kérheted a felhasználókat. a függvény nevét alkotóelemeiből építheted fel. ahogy olvassa a szkriptet. Ennek számtalan összetett módja van. Ezért az eredmény a következő: Function red does not exist. és meg akarod előzni a hibákat. Mivel a $function_name sztring típusú változó. Function red exists. hogy az include() új. hogy a fájlneveknek xr (meghajtó és pontosvessző) formátumú meghajtónevük van-e. Ha egy beágyazandó fájlt hozol létre. és beállítja a $os-t. " ) . include_once() nevű változatát használják. A PHP4 viszont a függvényeket a kód végrehajtása előtt lefordítja. } else {print("Function red does not e x i s t . " ) .Gyors megoldások íf(function_exists("red")) {print("Function red e x í s t s . A call_user_func() használata A call_user_func()-függvény segítségével változóban elnevezett függvényeket használhatsz. ahogy itt: $os = "unix". A $function_parameter bármilyen paraméter.. amit a $function_name-ben elnevezett függvénynek akarsz továbbítani. hogy a Windows-t jelezze: 349 . Ezzel a példával elérheted. } A PHP3 úgy fordítja a függvényeket. vagy a nevet adatbázisból is betöltheted. Lehet sok függvény paraméter is. de ebben az esetben elegendő egy gyors ellenőrzés. hogy az alkalmazásod minden operációs rendszeren működjön. így a red()-függvény csak az első teszt után van lefordítva. és nem akarsz az összes függvény koré function_exists()-t rakni. minden más Unix. . A paraméterei a következők: call_user_func ($function_name. Ezután szúrj be kódot a jelenlegi operációs rendszer megállapítására. amely a használni kívánt függvény nevét tartalmazza. Ennek megfelelően az eredmény: Function red exists. Segítségével bármilyen operációs rendszernek megfelelő formátumú fájlneveket építhetsz.

a call_user_func()-függvénnyel most már behívhatod a megfelelő formázófüggvényt. A függvénynév dinamikusan generálódik. A format_text()-függvény két paramétert fogad el. mint itt: $full_name = call_user_func("file_name_" . a második pedig a kapcsos zárójelek{} közé kerülő kódot tartalmazza: 350 . "\\" . Ha az NT az egyetlen Windowsverzió a webszervereden. A create_function() két sztringet fogad el. $file) return($path . A create_function() szintaktikája a következő: create_function($parameters. == ":") Most minden operációs rendszerre írj formázófüggvényt. $text) Sx = "<hl>" . a $heading-et és a $text-et. $file). "index. $text . Vess egy pillantást a formázófüggvény Unix-os és Windows-os verziójára. Megjegyzés: A Windows NT mindkét karaktert elfogadja. fejezet Függvények c ': C V i. $code). $file) return($path. A következő ugyanezt a formázófüggvényt hozza létre a create_function() használatával.1. A create_function() használata A create_function()-nel menet közben tudsz függvényeket felépíteni. A $os változóból felépítve a függvénynevet. $heading Sx . így a név nem ütközik össze a kód egyik függvényével sem. hogy első szintű HTML fejrészformázást állítson be. ^ if(substr($DOCUMENT_ROOT. $os.= "<p>" .10. $file). majd a Sheading-et <hl> tag-ek közé teszi. A formázás befejezésére ezután a függvény bekezdéstag-ek közé teszi a szöveget: function format_text($heading. . function file_name_windows($path. akkor használhatod a Unix-os elválasztó karaktert. return(Sx). Az első sztring a függvényfej zárójelei () közé kerülő paraméterek listáját. Ez a példa a create_function()-nel hoz létre egy egyszerű formázófüggvényt.html"). "/" . "help". hogy fűzik össze a helyes elválasztókarakterrel az elérési utat és a fájlnevet: function file_name_unix($path.1) $os = "windows".

íme egy egyszerű függvény. ' \ \ " > " . ' $x . - ötlet: A kétszeres idézőjelek helyett (") használj egyszerest (") a sztringek körül. Miután ezt megtetted. és mindkettőt használnod kell a returnQ-utasításban.= "<p>" . két könyvtárparamétert kell a függvényben definiálnod. A formázófüggvény használatához a következőket írd be: $formátted_text = $format_text("A poem". "</p>".és a func_num_args()-függvény csak PHP4-ben használható. "The cat sat on the mat"). $t . A látási problémákkal küzdő ügyfeleid nagyobb betűméretet választhatnak a profiljukban. Afunc_get_arg() és a func_num_args() használata A func_get_arg()-függvénnyel olyan függvényt hozhatsz létre. ha a végeredményt sokszor használod a szkripten belül. és változtatás esetén nagyobb a hiba bekövetkezési valószínűsége. az adatbázis információját felhasználva dinamikusan építheted fel a formázófüggvényt.Gyors megoldások $format_text = create_function('$heading. $format_te xt = create_fun ction('$headin g. majd próbáld a kódot idézőjelekbe rakni. A következő példában a betűméret manuálisan került be a $font_size-ba. A függvények dinamikus létrehozásával feldolgozási időt takaríthatsz meg.e-ot session-változóként mented. hogy a paraméterlistában definiálnod kellene őket. . így elkerülheted a speciális karakterek elé szükséges jelek használatát. Akkor töltőd be a $font_size-ba. ' . majd ezt a fontméretet megadhatod a formázófüggvénynek. A func_num_args()-függvénnyel a feldolgozandó paraméterek számát kapod meg. amelyet a func_get_arg()-gal majd továbbfejlesztünk: function file_name ($directory. $t "<font> $font_size . $text $font_size ■$x = "<hl>" . amely korlátlan számú paramétert elfogad anélkül. Ennek ára a kód összetettsége.' Ha ezek a vissza-perjelek és idézőjelek összezavarnak. $t = ' "<font size = \ \ " ' . hogy a függvény könyvtárak két szintjét kezelje. $text . $heading . Ha azt akarod. A kiterjesztett formázófüggvény a következő: $font_size = " + 2 " .= "<pxfont size = . $heading ' $x . 'return($x). ' ) . majd a $font_siz. A func_get_arg(). " < / h l > " . ha a felhasználó bejelentkezik. $text'. '$x = "<hl>" . $file) return($directory $file). ' . return ($x) . írj egy példafüggvényt először kézzel. ' . Mit 351 . $t = ' $text ' .

és a szintek száma változó? A válasz a paramétereken keresztül vezető út számolása a func_get_arg() és a func_num_args() használatával. "</p>"). $f ruits [ $i] . Megjegyzés: Az elválasztó változóba az elválasztó karakter az első ciklus végén töltődik be. A file_name()-függvényes példa kibővített változatában nincsen definiált paraméter. A / elválasztót raktam az elérési út összetevői közé. mint azt itt megmutatom. return("<p>" . A következő példa az egészséges gyümölcsök és zöldségek listáját ábécé-sorrendben íratja ki: functi on fruí t_li st () { $fruits = func_get_args(). $i < func_num_args Spath . amelyeket a func_get_arg() gyűjt össze: function file_name() Spath = "". Ezt megváltoztathatod az operációs rendszertől. Ezt megváltoztathatod az operációs rendszertől. $fruit_list . sort($fruits). hogy a fájlnév az aktuális könyvtárhoz viszonyítva relatív vagy abszolút.= "<br>" . illetve attól függően. return(Spath). hogy a fájlnév az aktuális könyvtárhoz viszonyítva relatív vagy abszolút Afunc_get_args() használata A func_get_args()-függvény egy tömbbe teszi a függvény összes paraméterét. A függvény nulla. for($i = 0. Sseparator = "" ■ for($i = 0 . A func_get_args()-függvény csak a PHP4-ben érhető el. illetve attól függően.= Sseparator Sseparator = " / " . ha több könyvtárszint is lehet. func_get_argi Megjegyzés: Az elválasztó változóba az elválasztó karakter az első ciklus végén töltődik be.10. fejezet Függvények tegyél. így nincsen kiindulási <br>. egy vagy sok paramétert is elfogad. $i < $c. így nincsen kiindulási /. így egyszerű tömbműveletekkel dolgozhatsz a paraméterek hosszú listáján. $fruit__list . $fruit_list = " " . $c = count($fruits) . 352 .

Hárítsd el az abnormális jelenségeket. hogy mi történik. és a későbbi elemzéshez naplózd az eredményeket. Van olyan. 353 . jól jöhet egy kód.Gyors megoldások Shutdown-függvény beiktatása Ha egy óriási szkriptet készítesz. // Code to close files and databases. amely rengeteg fájlt tölt fel és hatalmas weboldalt hoz létre. amely mindig lefut a szknpt végén. amelyeknek új rekordjaik vannak a kimeneti pufferekben. de alkalmanként nem sikerül befejeződnie. Ellenőrizd a használt adatbázis dokumentációját. Mi a teendőd? Be kell zárnod a be nem fejeződött adatbázis-tranzakciókat és azokat a fájlokat. A böngésző HTTP session-e lezárul még mielőtt a shutdown függvény elkezdődne. függetlenül attól. Csak az abnormális dolgokat kell kezelned. menti a session-információt. és letisztítja a memóriát. amit nem érdemes megcsinálni? A szkript végén a PHP automatikusan bezárja a MySQL adatbázisokat. A következő példában a függvényt special_code()-nak nevezem: function speciai_code() { // Code to terminate transactions. A special_code()-ban egy dolgot kivéve bármit csinálhatsz: nem írhatsz a böngészőnek. Ilyen esetben a register_shutdown_function() a neked való megoldás. } A függvényt a következővel iktatod be: register_shutdown_fuction("special_code").

JPEG.vagy PNG-képekben . fejezet Képek Gyors megoldások oldal: 384 384 385 391 392 394 395 Képek listázása Képinformációk gyűjtése Képinformáció kiíratása Szöveg létrehozása PDF-dokumentumban ClibPDF-fel Szöveg létrehozása PDF-dokumentumban PDFIib-bel Szöveg létrehozása GIF-.11.vagy PNG-képekben Diagram létrehozása GIF-. JPEG.

fejezet Képek Áttekintés Ebben a fejezetben képeket tartalmazó fájlokról lesz szó: a GIF-. PDF-eket cpdf_-. mint például a imagecreate(). de a PHP-ben csak egy könyvtárban voltak GIF létrehozására alkalmas függvények.és PNG-fájlok olyan image előtagú PHP-függvényekkel hozhatók létre. amelyet az Unisys szabadalmaztatott. fdf_. de a PNG összes jellemzőjét tartalmazó új PNG létrehozása nem biztos. miért kínlódnál? Ezek a böngészők támogatják a PNG azon tulajdonságait. de olyan újdonságokkal. úgy van egyre nagyobb sikere. keress a weben egy olyan régebbi könyvtárforrást. mint az alfa-csatorna.org/pub/png) a GIF-ek helyettesítésére hozták létre. és mivel a legtöbb modern böngésző támogatja a PNG-t.és pixelábrázolása van. és tudsz COM-ot használni. majd egy külső batch-programmal átalakíthatod őket GIF-formátumra.11. mert a GIF-formátum egy része szabadalom alá esik. A GIF-nek meg van az az előnye. GIF A Graphics Interchange Format-ot (GIF) a . de a szkriptedben nem hozhatsz létre új GIF-eket. de jobb. így a getimagesize() a szabadalmi jogok megsértése nélkül használható GIF-ek beolvasására. A GIF 8 bites színes diagramokra. hogy mindenhol működik. amely tartalmazza a GIFtámogatást. A vele rokon Multiple-Image Network Graphics. míg SWF-eket swf_-függvényekkel hozhatsz létre.(PNG-) formátumot (www. (A külső programokkal a 7. JPEG. kereshetsz olyan COM-os képszerkesztőt. Ha valamilyen ok miatt mégis GIF-et kell a szkriptedből előállítani. Ez a formátum különböző színmélységet enged 8 bitig.libpng.libpng.org/pub/mng) az animált GIF-ek helyettesítésére alakították ki.(MNG-) formátumot (www. így mindet ismerned kell. hogy a legmegfelelőbb formátumot választhasd. PDF-. ha GIF-et használsz. és használd azt.) Ha lefordítottad a PHP-dat.és SWF-formátumokról. A képeidet létrehozhatod PNG-ként. hogy kicsi. ha valaki azt szeretné. Rengeteg munkával jár. amikor a Unisys pénzt kért a jogokért.(PNG-) formátumot. Ezek közül néhányat biztosan használni fogsz. gondjaik vannak. Ahogy a böngészőkben terjed a PNG-támogatás. és pontos szín.jelenleg az AOL tulajdonában lévő CompuServe számára alakították ki. amelyek a GIF-ben is megvoltak. A képolvasó függvények. PNG A Portable Network Graphics. és ezeket is törölték. fejezet foglalkozik. PNG. A GIF-. és tartalmazza az LZW-nek (Lempel-Ziv-Welch) nevezett tömörítési technikát. Emiatt a GIF-ről PNG-re való konverzió mindig működik. fejlesztők egy baráti csoportja létrehozta helyette a fejlettebb Portable Network Graphics. vagy tudj a nem megfelelő formátum ellen érvelni. Amikor a Unisys szabadalmi díjat kért az LZW-ért. hogy olyat használj. rajzokra és szöveg alapú bannerekre korlátozza a GIF-ek használatát (a fényképekre a JPEG-formátum a megfelelő). JPEG-. amely képes GIF-ek előállítására. ha áttérsz a PNG-re.és pdf_-függvényekkel. 356 .

. ezért lógókra nem használható. Most állítsd a fehér hátteret átlátszóra. használd a JPEG-et nulla százalékos tömörítéssel. akik azt gondolhatják. A „tömörítés" az információ lineáris módon történő eltávolításával valósul meg. Jegyezd meg a legfőbb dolgokat: . . A JPEG tömörítése a színeket is megváltoztatja.A JPEG-tömörítés megváltoztatja a színeket. . 357 . az eredeti színeket közelítő színek listájából cserélve. függetlenül annak nagyságától és a hálózat sebességétől.html címen). félrevezette az embereket. A JPEG-et úgy fejlesztették ki.Minél ismertebb a kép. nem pedig éles vonalakhoz és élekhez. hogy te állíthatod be a tömörítést 0 és 100 százalék között.A JPEG-tömörítés alacsony kontrasztú képekhez való. Próbáld ki a JPEG-det több tömörítési szinttel is. vagy használj más formátumot. majd használd a anti-aliasinget az élek kisimítására. fényes színekhez. nem pedig erős. így nagy képeket is a lehető legkisebb minőségromlással továbbíthatsz hírcsoportokon és e-mailen keresztül. de a GIF csak az egyszínű átlátszóságot támogatja: egy színt átlátszónak foglal le. annál jobban észre lehet venni a tömörítést. A GIF átlátszóságával nem hozhatsz létre félig átlátszó árnyékot. PNG-vel az élek mentén a fokozatosság az eredeti háttérkép színe helyett a háttérszínbe halványul. JPEG A Joint Photographic Experts Group (JPEG) az európai telekommunikációs szabványhivatal (CCITT) és a Nemzetközi Szabványhivatal (ISO) közös erőfeszítéseinek eredménye. hogy a fájl mérete végtelenül csökkenthető a minőség romlása nélkül. hogy a JPEG-re való konverzió előtt a PNG az ideális módja az eredeti képed tárolásának (a JPEG magasabb szintű tömörítése a képek böngészőbe való továbbítására hasznos). Vedd észre az anti-aliasing miatt megmaradt fehér részeket. akárcsak jó néhány szoftverreklám.Áttekintés I A PNG-nek olyan előnyei is vannak. Az információvesztést eredményező tömörítési rendszereket nem lenne szabad tömörítési rendszernek hívni! A JPEG szóhasználata. és ez minden. Számtalan hibaészlelőt építettek bele. A PNG segít ezen az alfa-csatorna-átlátszósággal. amellyel fokozatos átlátszóság is elérhető. amelyek a GIF-fel nem elérhetők: alfa-csatorna-átlátszóság. 24 bites szín és szöveges mezők (mint a JPEG-ben).A JPEG-tömörítés lágy képekhez és fényképekhez való. hogy képes legyen a fényképek online megjelenítésére. így a fájl mérete az eredeti fájlméret és néhány bájt közé esik. A GIF-nek a JPEG-gel szembeni egyik előnye az átlátszóság. így a fokozatos leromlás végül használhatatlan foltokat eredményez.com/jpegcompression. és ez a lista a tömörítés növelésével zsugorodik. A PNG 24 bites színei a veszteség nélküli tömörítéssel azt eredményezik. A JPEG úgy működik. majd helyezd a képet egy fekete lapra. Próbálj egy GIF-et létrehozni fehér háttérrel és kék szöveggel. Ha egy meghatározott RGB-színt kell a vásárló lógójában használni. mielőtt online használnád (egy jellemző tesztet találsz a petermoulding.

az egy milliméterben levő pontok számát definiálja: de fi ne C in c h" .'ff f <£■: 11. amelyet a dokumentáció szerint a PHP-tól külön kell letölteni. A ClibPDF dokumentációja szerint a PDF-ben a mértékegység a PostScript-pont. a ClibPDF-et használják. define("miIlimetre". így definiáltam néhány konstanst arra az esetre.-t az extension = php_cpdf. 2.dll elől. de a PHP 4.fastio. amely alapértelmezésben 72 egységre. ha a könyvtárakat üzleti projektekben használják. 3.5 cm-es kép tényleges méretben megjelenítve körülbelül 5x5 cm-en tűnt fel. 72). Amikor legutóbb megnéztem. A második define() . ha a tényleges méret van alapértelmezésként beállítva. Az alapértelmezett megjelenítési méret megváltozik. az Adobe Acrobat olvasója ettől teljesen függetlenül fogja a dokumentumot megjeleníteni. mielőtt hozzáférne az oldalhoz.az amerikai. 90-110 pixel per inch-esek).a világ többi részén .dll-t a c:/winnt/system32-be. Indítsd újra az Apache-ot. A cpdf_-függvények a FastlO Systems (www.0.5 Win32 bináris állományában ez is benne van. és csak akkor kell licencet vásárolni. Az első define() .com). és az egyes FDF-formátumok legyenek elérhetők hagyományos formátumokban is. és azt találtam.com) írt és a PHP-ban könyvtárként lévő PDFlib-et használják. 2. de újabb technológiai korlát kerül az ügyfeleid és a honlapod közé. azaz 1 inch-re van állítva. tedd egy átlagos képernyőn a pontokat és pixeleket egyenlővé (a képernyők kb. A PDF-formátum friss kiegészítése a Forms Data Formát (FDF).ini-ben távolítsd el a . Vannak elméleti előnyei a PDF-iormátummal szemben. libériái és myanman emberek számára — egy inchben definiálja a pontot. hogy mindig pontokat használ. és ha egy grafikát PDF-ben és más formátumokban is használhatóra akarsz megírni. A felhasználónak ugyanis egy plug-int kell letöltenie. hogy egy 10x12. Mielőtt FDF-et használnál.com) ClibPDF-könyvtárát használják. A pdf_-függvények a Thomas Merz által a PDFlib GmbH-nál (www. A PDFlib pontokat használ alapértelmezésben. nonprofit célokra mindkét könyvtár ingyenesen használható volt. 4. az Acrobat reader még akkor is felnagyítja a kis képeket. ha alapértelmezéseket adok egy dokumentumnak. győződj meg arról. hogy az ügyfelek a hagyományos formátumokon keresztül elérnek téged. Azt tapasztaltam.pdflib. A php. Kipróbáltam az alapértelmezést. Hiába állítod be pontosan a dokumentum méreteit. 358 . ClibPDF A cpdf_-függvények a kereskedelmi PDF-könyvtárat. fejezet Képek PDF A PDF az Adobe Portable Document Format-ja (http://adobe. az inch (hüvelyk) 1/72-ed része. Állítsd le az Apache-ot. A php/extensions-ből másold a php_cpdf. A ClibPDF NT4 vagy Windows 2000 alatti telepítéséhez a következőket kell tenned: 1.83464567).

vagy a függvényben megnevezve a fájlt. Ezen függvények szerzői azt javasolják. tájolásjelző. A jelenlegi ClibPDF nem teszi lehetővé. a leírtakat vonatkoztathatod a pdf_ megfelelelőjükre. A fejezet példáiban a fájlnév nincsen a cpdf_open()-ben megadva. A cpdf_save_to_file() segítségével fájlba mentheted a dokumentumot. A cpdf_output_buffer() a memóriapufferből a képernyőre küldi a dokumentumot. például egy adatbázist konvertálsz egy jelentésbe. ezért a dokumentum egyszerű szövegként jelenik meg. ezért a php. (Hiba feldolgozása során. 359 .Áttekintés Megjegyzés: A Windows más verzióiban a c:/winnt/system32 helyett használd a c:\windows \system-et. aki az új dokumentumok PDF-es változatát készíti el. hogy menet közben dinamikusan hozza létre az egyes weboldalakat. de PHP 4. Dokumentumfüggvények A cpdf_open() egy új dokumentumot nyit meg és dokumentumazonosítót ad. Választhatsz. a cpdf_output_buffer() elé a következő kódot szúrd be: Header("Content-type: application/pdf"). hogy a dokumentumot memóriában építed fel.5 összeomlik.5-ben ebben a függvényben nincsenek benne a megfelelő fejlécek ahhoz. az befejezi a dokumentum felépítését. A Gyors megoldások PDF-es példái pdf_-függvényeket használnak. és a PostScript-pontokban meghatározott opcionális mértékegység kerülhet. Jelen állapotban a PDF-dokumentumok előállítása egy website-adminisztrátorra korlátozódik.0. hogy a dokumentumot PDF-fájlként dolgozza fel. mielőtt az cpdf_close()-zal bezárnád a dokumentumot. és bár oldalszintű függvény. Én a példákban a dokumentumokat a memóriában hozom létre. ha az első oldal inicializálása nélkül próbálsz írni egy dokumentumba. különben a megjelenítéskor a dokumentum a következő üzenetet eredményezi: Error processing a page. oldalszám. szélesség. amelyet minden más ClibPDF-függvényben használnod kell.0. A ClibPDF-fel nemrégiben vált lehetővé egyszerre több dokumentum megnyitása. hogy egyszerre egynél több dokumentumot hozz létre. A cpdf_close() bezárja és törli a memóriából a dokumentumot. de a PDF többletráfordítása miatt nem célszerű a PDF-et arra használnod. Font has not been set. Ha nagyon hosszú fájlt hozol létre. Ezt azelőtt kell lefuttatnod.ini-ben a memory_limit-paraméterrel több memóriát juttatok a PHP-nek. egyenesen abba írod. Oldalfüggvények A cpdf_page_init()-be dokumentumazonosító. amelyet legalább dokumentumonként egyszer használni kell. akkor jobb egyenesen a fájlba írni. és a cpdf_save_to_file()-t használom. Ebben a fejezetben gyorsan végigszaladok a cpdf_-függvényeken. mert a PHP 4. Ha HTML-oldal helyett PDF-oldalt küldesz. de a későbbi verziókban ez majd lehetővé válik. A cpdf_page_init() új oldalt kezd. hogy használat előtt olvasd el a ClibPDF-dokumentációt. A betűtípus nincs beállítva. mégis itt említem. A cpdf_set_font() olyan szövegszintű függvény.) az oldal A cpdf_finalize()-nak egy dokumentumazonosítót adva. magasság.

hogy a kis felbukkanó képernyőket PDF használatával hozod létre. Az ennek a résznek az elején bemutatott define-utasítások használatával megadhatsz millimétert is. ahogyan elmentetted őket.1 ábra azt a tipikus képernyőt mutatja. A beállításokat elmented. A tájolás 0 az álló és 1 a fekvő kép esetében. a méretet és minden egyebet. hogy legyél az összes mértéket inchben megadni. például a betűméret. így képes kell. egy részét megváltoztatod. mielőtt PHP-val próbálnád a feladatot automatizálni. majd újra visszaállítod a beállításokat arra. a cpdf_restore() pedig visszatölti az elmentett környezetet. rajzolsz néhány ábrát. de bizonyos mértékek. majd a következő oldalra visszatöltöd az állandó oldalbeállításokat. először egy PDF-et kezelni tudó böngészőben tervezd meg őket. Szövegfüggvények Ha a következő függvényekkel teszel rövid dokumentumokba szöveget. 1).11. fejezet Képek A PostScript-pont az inch 1/72-ed része. amelyet akkor kaptam. Találd ki a betűtípust. Ezért ha úgy döntesz. az oldalt ettől eltérően alakíthatod ki. 0).1 ábra PDF-dokumentum hibás szövegbeállítással 360 . hogy könyebben megjegyezhetővé tedd a beállításokat: define("landscape". A beállításokat elmentheted egy oldal elején. A 11. define("portrait". mégis pontot használnak. A cpdf_save() az aktuális környezetet a memóriába menti (nem lemezre). bele fogsz őrülni. Használd a következő definíciókat. amelyekben egyszerű hibák vannak (például a betűméret egy kicsit nagyra van állítva). amikor olyan PDF-oldalakat próbáltam megjeleníteni. •) Illegaí operation 'Tj' outside texí object ÖK 11.

a kitöltő szín az egész alakzatra. Úgy gondolj a path-ra.A betűtípust és a méretet állítja be.A simaságot állítja be.Egy körvonallal körbevett karakternek vonalak vannak a külse jén. és belül vagy van kitöltés vagy nincsen. ami kitölti a körvonalak közötti részt.Az aktuális oldalt állítja be.Limitet állít be az összes dokumentumra. mint az egyszínű szöveget létrehozó „karakterkitöltés".Vonás (Stroke) . olyan lehetőségekkel. a negatív alsó indexet hoz létre.A szavak közötti távolságot állítja be. . használhatsz más színt a kitöltéshez. például egy vastag vonalat rajzolsz.A szöveg vízszintes léptékét állítja be. Amikor egy alakzatot. cpdf_set_current_page() .A szaggatott vonalak mintáját állítja be. mint az út mentén lévő árkok. cpdf_set_horiz_scaling() . .A következő szöveg indexelését állítja be. így használhatsz fekete körvonalban piros belsejű karaktereket. hogy először felfested a középvonalat. Ha először körvonalat használsz és utána töltőd ki az alakzatot. így a körvonalra is vonatkozik. a rajzolással outline-t hozol létre a path körül. cpdf_set_font() . A pozitív szám felső.Egy dokumentum X. 361 . az.Kitöltés (Fill) .Mátrixot állít be az aktuális szöveg transzformálására. majd ehhez hozzáadod az utat és az azt szegélyező árkot. Az út példáját folytat va.Amikor karakterek sorozatát hozod létre.A szövegsorok közötti távolságot állítja be. cpdf_set_text_rise() .A szöveg renderelését állítja be. cpdf_set_text_matrix() . Ha kitöltő színt használsz egy egyszínű alakzat vagy karakter rajzolásakor. azok folytonos görbét követnek.A karakterek közötti távolságot állítja be. cpdf_scale() .Áttekintés íme néhány kifejezés azoknak. cpdf_set_word_spacing() . cpdf_set_text_rendering() . cpdf_set_char_spacing() .Folytonos görbe (Path) .A kitöltő szín az út aszfaltja. mint a vonás színe és vastagsága. cpdf_set_leading() . mint egy út közepére felfestett középvonalra. cpdf_setflat() .Körvonal (Outline) .A körvonal egy másik neve. cpdf_setdash() . így körvonalak széles választéka áll ren delkezésedre. A path-ot egy széles vonal rajzolásakor alapvonalként használod. . Képzeld el.Az egyes oldalak megjelenítése közötti időt állítja be (másodpercben). A ClibPDF-szövegfüggvények a következők: cpdf_global_set_document_limits() . cpdf_set_page_animation() . Ha vonalhúzással készítesz egy vonalat vagy karaktert. Ekkor olyan dolgokat állíthatsz be. akiknek újdonság a következőkben leírt eszközökkel való képrajzolás: .és Y-tengelyeinek léptékét állítja be. az outline kicsit olyan. akkor tulajdonképpen egy körvonalat rajzolsz.

gömbölyítettre vagy ferdén metszettre állítja. .cpdf_setrgbcolor_stroke() . fejezet Képek .A rajzolási és kitöltési színeket RGB-színekben álltja be. hogy működjön.Lezárja a szöveget. . .ívet rajzol. akik jobban szeretik a színeket.cpdf_stringwidth() .cpdf_setmiterlimit() . Vonalfüggvények A vonalfüggvények a következők: 362 cpdf_translate() .A kitöltési színt RGB-színben állítja be. . .cpdf_setlinewidth() .Kulcsszavakat ad a dokumentumhoz.11. itt vannak a színfüggvények .cpdf_set_title() .A linejoin-paramétert adja meg.A koordináták által meghatározott pozícióban jeleníti meg a szöveget. . .cpdf_text() .A következő sorban folytatja a szöveget.cpdf_add_annotation() .cpdf_setlinejoin() . . Ahhoz.cpdf_setlinecap() .Szövegrészt kezd el.Vonalat rajzol egy abszolút ponthoz.A linecap-paramétert állítja be.Az X. amikor két vonal hegyesszögben metszi egymást.cpdf_setrgbcolor() .cpdf_set_keywords() . . mindkét koordinátának a cpdf_begin_text().Beállítja a dokumentum tárgymezőjét.cpdf_setrgbcolor_fill() . . cpdf_arc() .Megjegyzést ad a dokumentumhoz. amely a sorok végét szögletesre vagy kerekre alakítja.Az aktuális pozícióban jeleníti meg a szöveget.cpdf_begin_text() .Könyvjelzőt ad az aktuális oldalhoz.cpdf_end_text() . . cpdf_rlineto() . . . cpdf_lineto() .és Y-koordináták által meghatározott pozícióban jeleníti meg a szöveget.Beállítja a szövegpozíciót a következő cpdf_show()-ra.A rajzolási színt RGB-színben állítja be.cpdf_continue_text() . Színfüggvények Azok számára.A sorszéleséget állítja be.A létrehozó mezőt állítja be a dokumentumban.cpdf_add_outline() . . .Beállítja a ferde illesztés korlátját. hogy mi lyen éles lehet egy metszéspont. .cpdf_set_text_pos() .cpdf_show() .cpdf_set_subject() .Beállítja a koordinátarendszer origóját.Beállítja a dokumentum címmezőjét. .és cpdf_end_text()-függvények között kell lennie. . az Acrobat reader a következő hibaüzenetet jelzi: Illegal operation *Tj' outside text object.A szöveg szélességét adja meg az aktuális betűtípusban. .cpdf_set_creator() .cpdf_show_xy() . ami meghatározza. Ha a cpdf_show()-t az cpdf_begin_text() eló'tt használod.Vonalat rajzol egy relatív ponthoz. amely a vonalak metszéspontjait 45°-ban íllesztettre. .

Négyszöget rajzol. cpdf_fill() .-t az extension=php_fdf. cpdf_setgray() . . cpdf_fill_stroke() .ini-ben^távolítsd el a . cpdf_rect() . cpd£_rmoveto() .Kitölti a görbét.Kivágja az aktuális görbét. cpdf_stroke() .dll-t a c:/winnt/system32-be.Áttekintés - cpdf_curveto() .Lezárja a görbét.html oldalon felsorolt doku363 . és kitöl ti a görbét.Segítségével JPEG-dokumentumot nyithatsz meg.Lezárja a görbét.Beállítja a fokokban meghatározott forgatást. és vonalat húz a görbe mentén. cpdf_clip() .cpdf_import_jpeg() . FDF Az FDF-opció Windows NT4 alatti telepítéséhez a következőket kell tenned: 1. 5. és vonalat húz az aktuális görbe mentén. A php/extensions-ből másold a php_fdf. Az Adobe Forms Data Formát (FDF) teljes megértéséhez célszerű elolvasni a http://partners.Új görbét kezd. hogy a do kumentumba importáld. Indítsd újra az Apache-ot.Az aktuális pontot relatív pozícióra állítja be. cpdf_newpath() .Kört rajzol. vonalat húz a görbe mentén. cpdf_closepath() .Görbét rajzol.Az aktuális pontot abszolút pozícióra állítja be. Állítsd le az Apache-ot. Képfüggvények A következő két függvény dolgozik a képekkel: .Beállítja a rajzolási színeket. 3. cpdf_setgray_fill() — Beállítja vonalak vagy alakzatok rajzolásával létrehozott körvo nal kitöltési színét. A php. 4. cpdf_circle() .Lezárja az aktuális görbét. A php/dlls-ből másold a FdfTk.dll elől.dll-t a c:/winnt/system32-be.Vonalat húz a görbe mentén.Kitölti az aktuális görbét. cpdf_rotate() . cpdf_closepath_stroke() .cpdf_place_inline_image() . cpdf_closepath_fill_stroke() . cpdf_setgray_stroke() . cpdf_moveto() .Képet helyez az oldalra.com/asn/developer/acrosdk/forms. 2.adobe.Beállítja a rajzolási és kitöltési színeket.

Az FDF jónéhány területet érint. amelyet a többi FDF-függvény használ. 0). A következő példában két mező van. fejezet Képek • í: meritumokat. "r")). az adat egy speciális formátumban van bezárva. Ebben a példában az FDF azonnal megjelenítődik. • Header("Content-type: application/vnd. amit a böngészőnek el lehet küldeni. hogy valaki írni fog egy kódot. $fdf = fdf_create() . akkor a következő kóddal linkelhetsz egy oldalra. A hivatkozás azért URL. de mivel az FDF egy vásárlói rendelési űrlap. Ha nincsen. A példában lévő teszt URL-t olyannal helyettesítsd.fdf"). Lehet linkkel kezelni. hogy a fájl egy FDF. fdf_set_value($fdf.00". fdf_set_file($fdf. ha a webszerver be van állítva a fájltípus kezelésére. $orders . ami működik a honlapodon. "1". a másik a mennyiségnek. "price". "quantity". Az fdf_create() létrehoz egy FDF-et a memóriában. 0). amely egy lépésben kikódolja az ada364 . és az fpassthru() elküldi a böngészőnek: <?php $orders = "i : /orders/". Az fdf_set_value() egy mezőt és egy alapértelmezett értéket ad az FDF-nek. Először egy olyan FDF-dokumentumot hozol létre. majd megpróbálja a PDF-et beolvasni a böngészőből. esetleg meg akarod tartani és használni egy darabig. az FDF-adatot további FDF-függvények használatával elolvashatod. amelyeken az Adobe Acrobat telepítve van. Az fdf_close() segítségével felszabadíthatod az FDF-re osztott memóriát (ami nem sok. Az FDF megjelenítése Az FDF-et böngészőben kell megjeleníteni. majd amikor az adat visszajut a szerveredre. r Az FDF-adat beolvasása Ha a felhasználó kitölti az űrlapot és az eredményeket visszaküldi a honlapodnak.fdf").fdf-t küld. mert az Adobe Acrobat reader a böngészőben beolvassa a hivatkozást. "http://test/order. "order. az egyik az árnak. Az fdf_set file() egy PDF-re mutató URL-hivatkozás beszúrásával a PDF-hez kapcsolja az FDF-et. "\$0. fel kell. mint bármelyik fájlt. így az adat helyreállítása két lépésben történik. hogy ismerjék. és az olyan böngészők. "order. és egy azonosítót ad vissza.pdf"). ?> V . hiszen a legtöbb információ a PDF-ben van): $orders = "i : /orders/". Az FDF létrehozása Az első lépés az FDF-fel egy olyan FDF-fájl létrehozása. amely egy HTML-űrlaphoz hasonló dolgot csatol a PFF-dokumentumhoz. fpassthru(fopen($orders .11. A header()-függvény egy MIMÉ típusú application/vnd. A lemezre való mentés több megjelenítési és tesztelési lehetőséget is ad. Az fopen() sztringként adja vissza a fájlt.fdf". (Biztos vagyok benne. fdf_set_value($fdf. fdf_close($fdf) . Az fdf_save() lemezre menti az FDF-et a későbbi felhasználásra. fdf_save($fdf.

Ha az adott állományt egy megrendelés rekordjaként akarod kezelni. "price").Áttekintés tokát.) Határozz meg egy könyvtárat.Egy mező megjelenését állítja be.Opciókat állít be egy mezőhöz. fdf_close($fdf). fdf_set_status() . A következő függvényekkel az Adobe-dokumentációban leírt opciókat lehet beállítani: fdf_set_ap() .A /STATUS-kulcs értékét állítja be az FDF-dokumentumban (a részleteket az Adobe-dokumentációban keresd). hogy írhass is a fájlba. az fdf_get_file()lal tudod azt visszakeresni. $field). vagy használj ideiglenes könyvtárat. Azon az oldalon. Most már van egy FDF-fájlod. fwrite($fdf. $price = fd f_get_v alue($fdf.A HTML-űrlap Elküld gombjához hasonló műveleti - 365 . . vagy használd az fdf_get_file()-t. "quantity"). $values[$field] = fdf_get_value($fdf. utána pedig zárd azt be: $replies = "i:/orders/replies/". strlen($HTTP_FDF_DATA)). Nyiss meg egy új fájlt az fopen()-nel a w-opció beállításával. Az fdf_next_field_name() az első mező nevét adja.fdf" .A /STATUS-kulcs értékét adja meg.fdf". és azonosítani akarod az FDF-fel használt PDF-et. így vagy PDF-enként egy FDF-et hozz létre. Nyisd meg az fopen()-nel beolvasásra a fájlt. A fdfnextfieldnameQ következő használata a következő mezőt adja. "areply. majd az fdf_close()-zal zárd be a fájlt: $fdf = fdf_open($replies . fdf_set_opt() . ha második paraméternek az előző mezőt állítod be. "areply. amely fogadja az adatokat. amelyet beolvashatsz. "w"). Hogy mi történik. Ha újra be kell hívnod az FDF-ben fdf_set_file()-lal beállított PDF nevét. Elméletben FDF-dokumentumban egy ciklussal mezők hosszú során tudsz végigfutni a következő mintakód használatával. Az fwrite()-tal írd a $HTTP_FDF_DATAsztringet a fájlba. $HTTP_FDF_DATA. while($field = fdf_next_field_name($replies. . fclose($fdf). amikor sok PDF-hez egy FDF-et csatolsz. fdf_set_flags() . "r").Jelzőket állít be egy mezőhöz. ha a függvény túlmegy az utolsó mezőn. amely megkapja az FDF-től a választ. $quantity = fdf_get_value( $ f df. $fdf = fopen($replies . Az egyik lehetséges használat. az meghatározatlan.fdf_set_submit_form_action() . ha a fdf_next_field_name() második paramétere üres. így a jövőben ez változhat: $field = fdf_next_field_name($replies) . az FDF neve egy utaló sztringben lesz a PGF helyett. $field)) { $values[$field] = fdf_get_value($fdf. hogy a megrendelési űrlap válaszait megkapd. olvasd be a mezőértéket a fdf_get_value()-vel.fdf_get_status() . akkor a fájlnév tartalmazza mondjuk a dátumot és az időt. $field).

a libswf és a Unix. A Macromediának két böngészőbővítménye van.11. ha csak lemásolta volna a HTML tag-paramétereket). a Flash (www. I 366 . Indítsd újra az Apache-ot.JavaScript-műveletet csatolhatsz egy mezőhöz.) A Flash-fájlokat a Macromedia Flash-ével. a Flash használhatóbb módja az egylapos brosúrák megjelenítésének.com/software/flash) és a Shockwave (www. A Flash jobb interaktivitással rendelkezik a hosszú dokumentumokban való navigálásra. fejezet Képek mezőt állít be (az Adobe egyszerűbbé tehette volna az életet.com/grafica/flash) csatlakoznak.fdf_setjavascript_action() . amelyek a Macromedia Flash. .org) található. Amire szükséged van az swf_-függvények. hogy bonyolult Flashekkel próbáljalak lenyűgözni. Az SWF-függvényekkel azonban összetettebb Shockwave-fájlokat nem hozhatsz létre. (A Shockwave-player a Flash-playert is tartalmazza.com/software/flash-) böngészőbővítőkkel olvashatóak.macromedia. Flash és Shockwave A Shockwave-fájlformátum (SWF) leírása az OpenSWF oldalán (www. A libswf-könyvtár a Flash-fájltípust alkalmazza. melyek hasonlóak a cpdf_-függvényekhez. 4. A php.com/software/shockwaveplayer).-t az extension=php_pdf. hasonlóan ahhoz.dll elől. a „Szöveg létrehozása PDF-dokumentumban PDFlib-bel" részben mutatom meg.macrornedia. Állítsd le az Apache-ot. 2. A php/extensions-ből másold a php_pdf. Rengeteg nálam jobb Flash-művész van. A PDF-függvényeket. A JavaScriptet például az input-adat érvényesítésére használhatod. és a Flash-sel nincs annyi gond.macromedia.ini-ben távolítsd el a . a Shockwave-fájlokat a Macromedia Directorral lehet létrehozni. mivel a könyvtár jelenleg még nem érhető el Windows vagy Windows NT alatt. 3. Megjegyzés: A Windows más verzióiban a c:/winnt/system32 helyett használd a c:\windows\system-et.sgi. így nincsen értelme annak. de jelen pillanatban egyik jelentősebb keresőmotor sem indexeli a Flash-fájlokon belüli szöveget. Mivel a Flash a legtöbb böngészőn telepítve van. Ezekkel a függvényekkel hozhatsz létre olyan fájlokat. mint a gyakrabban használt PDF. PDFIib A PDFlib-opció NT4 vagy Windows 2000 alatti telepítéséhez a következőket kell tenned: 1.dll-t a c:/winnt/system32-be. mind a PDF-fájlokkal.openswf. A PHP SWF-függvények Paul Haeberli libswf-moduljához (http://reality.(www. a PHP-függvények pedig ezt a nevet vették fel. így a PDF előnyben van ezen a területen. ahogy egy HTML tag-hez tennéd.

akkor az opcionális 1 megadja a függvénynek. de a PHP az operációs rendszer szerverének báziscíméhez viszonyítottan relatív fájlneveket használ. A következő példában látható swf_labelframe()-mel nevezd el a képkockát. hogy erőforrásokat szabadítson fel: swf_closefile() .swf" ) ./veryflash. $flash["width"]. $flash["framerate"]. $flash["background"]["green"] = 20. akkor az SWF-fájl a php://stdout speciális fájlnév használatával a képernyőn nyílik meg: swf_openfile("php://stdout".) Ha az előző példában használt swf_openfile()-t a következő példában találhatóval cseréled ki. hogy a Flash-fájlt sztringként adja vissza. $flash["background"]["green"]. $flash["background"]["green"]. A következő példa egyszerűen ezt csinálja. hogy a Flash-prezentáció elmenjen arra a címkére. az swf_closefile()-lal be kell zárnod a meglévőt. Ha az előző példában használt swf_closefile()-t a következő példában találhatóval cseréled ki. Az swf_openfile()-t kell az első swf-függvényként használni. $flash["background"]["red"] = 20. swf^openfile($flash["file"] . $flash["height"]. $flash["height"] = 500. amilyet egy weboldalon használsz. $flash["framerate"]. $flash["background"]["blue"]). különben a könyvtár hibaüzenetet jelenít meg. amely egy olyan típusú relatív fájlnevet fogad el. Sflash["width"]. $flash["background"]["red"]. A következő swf_openfile()-példa lemezen nyit meg egy fájlt: $flash["file"] $flash["width"] = realpath(". akkor mielőtt újat szeretnél létrehozni. vagy létrehozhatsz e-mail csatolt állományt: $flash["data"] = swf_closefile(1) . az swf_actiongotolabel()-lel megoldhatod. $flash["background"]["blue"]). és ezt a PHP-függvényekben használt abszolút névre konvertálja. A függvényben nincsen a fájlazonosítónak megfelelő valami. Képkocka A fájlon belül 0-tól számozott és tetszőlegesen címkézett képkockákkal dolgozol. $flash["height"]. Az swf_actiongotolabel() megjeleníti az adott képkockát és megáll: 367 r- . $flash["framerate"] = 20. $flash["background"]["blue"] = 20. Ha már van címke egy képkockán. \r A fájl beállítási kódja a realpathQ-függvényt használja. így a fájlt elmentheted egy adatbázisban. (Egy weboldalon a fájlnevek a honlap címéhez viszonyítottan relatívak. Ha végeztél egy Flash-fájllal. így nem nyithatsz meg egyszerre több fájlt. $flash["background"] [ " r e d " ] . = 400.Áttekintés A fájl Kezdjünk egy Flash-fájl swf_openfile()-lal való megnyitásával.

a harmadik pedig a kék értékét adja meg. így olyan módosításokat is megcsinálhatsz. Az objektumokat 1-től 65535-ig menő számokkal azonosíthatod. Az swf_placeobject() egy objektumot rak . A 255. hogy meglévő objektumot tegyél tönkre. fejezet Képek fi ■ 1 swf_labelfrarae("First frame"). -1. HTML-ben #FFFFFF (hexadecimális számként). így a képet világosíthatod (sötétítheted). 5) Az swf_modifyobject() a meghatározott mélységben lévő objektum pozícióját vagy színét változtatja meg (ebből adódik. Mindkettő működik külön a piros.11. az swf_getframe() pontosan ezt adja eredményül: swf showframeO swf_setframe( 5 ) $flash["frame"] = swf_getframe(). 14). swf_modifyobject() és swf_addbuttonrecord() által előállított színeket: swf_addcolor( 3 . . 0 és 255 közötti számként tárolja a gép. és az utána következő műveletek már erre a képkockára vonatkoznak. mint a kép szépia-tónusokra való konvertálása.255 a fehér. A következő szabad objektumazonosító számot az swf_nextid()-del találod meg. Mindkét függvény tartalmazza az alfa-módosítást. a zöld és a kék színeken is. Ezt HTML-ben #000000-ként kell írni. Az swf_setframe() egy szám által meghatározott képkockára ugrik.255. swf_actiongotolabel("First frame") Az swf_showframe() bezárja az aktuális képkockát. amelyek szintén 1-től 65535-ig számozódnak. a példa az 5 mélységben lévőt törli: $frame["object"] = swf_nextid() swf_placeobj ect($frame["obj ect" . Ha nem tudod az aktuális képkocka számát. elküldi megjeleníteni. A számok együtt alkotják az RGB-színeket. Az első szám a piros. 60) Objektumok Készíthetsz képobjektumokat. 22. és az objektumokat képkockába helyezheted. swf mulcolor(22. hogy az egyes objektumokat célszerű külön layerbe tenni. Az swf_removeobject()-tel törölhetsz objektumokat. A színeket három. így beleveheted az átlátszóságot is.példánkban az 5 számú . a második a zöld. Mindkét függvény megváltoztatja az swf_placeobject().0. és különböző mélységű layerekbe (layer: egymást átfedő. az swf_addcolor() és az swf_mulcolor() használatával állíthatod be a színeket. 11. A következő műveleteket az új képkockán végzi el.0 a fekete. A 0. Szín Ha bármilyen színes elemet raksz egy képkockára. külön szerkeszthető képelem) helyezheted. Az swf_mulcolor() segítéségével szorozhatod (oszthatod) a színértékeket. így növelve (csökkentve) a kontrasztot. swf_removeobject( 5 ) . és ezután új képkockát nyit meg.layerbe. Az swf_addcolor() segítségével hozzáadhatsz (kivonhatsz) a színek értékéhez (értékéből). és ezzel elkerülheted. A színeket az egyedi számokon végzett aritmetikai műveletekkel változtathatod.

110. swf defineline($line.yl és x2. 1. mint a sorok vagy az swf_defineline()-. illetve a vonalvastagságot tartalmazza. akár az swf_definerect() esetében a vonalvastagságot 0.10) és x2. Az swf_defineline() az xl. amelyet a Gyors megoldások „Diagram létrehozása GIF-. 75. swf_shapelinesolid(50. Az swf_definerect() téglalapot rajzol az xl. Az swf_shapefillbitmaptile() szintén bittérképpel tölti ki az alakzatot. és beállítja a kitöltő színt (75. A példa 7 pontot és 2-es vonalvastagságot alkalmaz: $polygon = swf_nextid(). a második paraméter pedig a meghatározott módosítás: lehet MOD_COLOR a szín aktuális mulcolorral és addcolorral való módosítására. Az swfshapefillbitmapclipO bittérkép használatára állítja a kitöltést. mint a vonalas példa. 0. az alfa csatornát (0) é$ a vastagságot (1) állítja be. 270 . 7. $points. swf endshape(). 10.50). Az swf_shapefillsolid() beállítja az alakzatkitöltést.vagy PNG-képekben" részében történetesen nyíl rajzolására használok. de a téglalap két szemközi sarkaként tekinti a pontokat. amely a használt pontokat. 50.y párok tömbjét fogadja el. a körvonal kitöltésével a függvények egy egyszínű objektumot hoznak létre: $rectangle = swf_nextid0. 110. 3) Az swf_definepoly() x. 270. 2).0-ra állítod. 50. 0) 1). 140. 380. 10. swf_definerect($rectangle. A következő példa a $points nevű tömböt használja.75. 200. 101. Az swf_shapefilloff() kikapcsolja az alakzatkitöltést: $shape = swf_nextid() .110) között hoz létre vonalat. 2 7 0 .50.y2 (példánkban 101. Az alakzat az swf_startshape{)-pel keződik és az swf_endshape()-pel végződik. 230. 230. A vonal vastagságát meghatározhatod (a példában ez 3): $line = swf_nextid(). 270. 75. nem fog vonalakat rajzolni. swf_shapefilloff() . MOD MÁTRIX | MOD_COLOR: swf_modifyobject( 5 . 1. 170. ahogy azt a következő kódban láthatod. lehet MOD_MATRIX. Akár az swf_definepoly(). 170. mely a aktuális mátrix használatával megváltoztatja az objektum pozícióját. illetve lehet mindkettő. JPEG. 2 6 0 ) . 380. swf_shapefillsolid(75. Az swf_shapelinesolid() a vonal színét (50. A shape-parancsokkal összetett alakzatokat hozhatsz létre. swf_definepoly()-és swf_definerect()-függvényekkel létrehozott egyszerű alakzatok. 3). Ha a vastagságot 0.0-ra állítva.y2 pontokra a megadott vonalvastagságban. de ezt csempeszerűen teszi: 369 .yl (példánkban 1. $points = array(200. 101. Az első paraméter a mélység. s wf_ d e f i n e p o l y( $ p o l yg o n .75) és az alfa-csatornát (0).■r ti Áttekintés hogy egymástól függetlenül megváltoztathasd őket. Az objektumok olyan elemek. swf^startshape($shape) . MOD_COLOR). A példa ugyanazokat a koordinátákat használja.

Az swf_perspective() a látvány perspektivikus kivetítését transzformálja. Az első paraméter a képmező szög az y irányban. az x maximumát. swf_shapefillbitmaptile($bitmap). segítségével például szöveget forgathatsz el.100) keresztül a második x. Az swf_shapemoveto() az aktuális pozíciót az x. az x maximumát. az swf_rotate() pedig mindhárom tengely körül elforgatja az aktuális transzformációt. Az swf_shapearc() ívet rajzol az elsó' két paramétert a kör középpontját mutató x. 250). 200..100). 30. Az swf_scale() az aktuális transzformációt méretezi az x-. swf_shapearc(200.350) x. 340. a második az x maximuma. az y minimumát és az y maximumát kén a függvény: swf_ortho2( 1 0 0 . a negyedik pedig a távoli kivágásé.y-pontba (250. 300.11. y. az y minimumát. 100. az swf_translate() mindhárom tengelyen végez egy másik transzformációt.y-ponton keresztül. majd az aktuális pozíciót az utóbbira állítja be.250). f^™. A kerekítés olykor segíti a képtisztaságot. Az swf_lookat() nézőpont-transzformációt hajt végre. a harmadik a közeli kivágás síkja.300) és második (350. Az swf_posround() az objektumok elhelyezésénél vagy mozgatásánál használt kerekítést változtatja meg. 300). f f Az swf_viewport()-tal a teljes oldal egy téglalap alakú alhalmazába helyezheted a rajzodat. a harmadik paraméter a sugár. 100. A paraméterek sorrendje különbözik a normál téglalap függvényekbeli sorrendtől: az első paraméter az x minimuma. swf_shapelineto(100. 200.és z-tengelyeken. 350.. 100. 200). Az swf_shapecurveto3() egy harmadfokú Bézier-görbét rajzol az aktuális pozícióból az első (300.és y-koordinátaként használva. az y maximumát. 100). 200. a negyedik pedig az y maximuma: swf_viewport(100. Az x minimumát.y-pozícióba viszi. 100. majd az aktuális pozíciót az utóbbira állítja be. 40).y-ponton (100. a negyedik a kiindulási szög. 340).. 200.y-ba teszi az aktuális pozíciót. 50. Az swf_shapecurveto() egy másodfokú Bézier-görbét rajzol az aktuális pozícióból az első x. Az swf_ortho() a felhasználói koordináták aktuális látványba való háromdimenziós ortografikus leképezését határozza meg. Az swf_polarview() polár koordinátákkal határozza meg a látvány nézőpontját. 350. fejezet Képek Ir swf_shapefillbitmapclip($bitmap). 250. swf_shapecurveto(100. Az swf_shapelineto() vonalat húz az aktuális pozícióból az x. 300). a harmadik az y minimuma.y-pozícióba (ez példánkban 100. 100. a z minimumát és a z maximumát kéri a függvény: swf_ortho(100. majd az aktuális pozícióból az x.™. az utolsó paraméter pedig a végső szög: swf shapemoveto(25. 370 . Az swf_ortho2() a felhasználói koordináták aktuális látványba való kétdimenziós ortografikus leképezését határozza meg. swf_shapecurveto3(300.. de nem mindig. Az x minimumát. 40). a második a látvány oldalaránya. 300.

a szélességét pixelben (width) és a magasságát pixelben (heíght) tartalmazza: $image = swf_nextid() . Az swf_popmatrix() visszaállítja a verembó'l a korábbi transzformációs mátrixot. A betűtípusfüggvény 1 típusú PostScript-fontot igényel. és opcionális harmadik paramétert fogad el a szöveg középre rendezésére (ahogy a példában használtam). a nagybetűs A magasságát pixelben. így elmentheted azt későbbi felhasználásra. 1) $width = swf_textwidth("test string"). hogy a pozitív szám növeli. Az swf_setfont() a meghatározott típusúra állítja az aktuális betűtípust. Az swf_definetext() egy a meghatározott szöveget tartalmazó objektumot hoz létre. az swf_fontslant() az aktuális betű dó'lését (ami lehet pozitív vagy negatív). mind Macintosh-ra. amely az adott szöveg aktuális betűtípusban és betűméretben vett szélességét adja vissza: $font_serif = 1. swf_setfont( $ f ont_serif) . a kisbetűs x magasságát pixelben. és a xheight-et. A legtöbb embernek True Type fontjai vannak. az swf_fontsize() az aktuális betűméretet határozza meg.sourceforge. $font__size = swf_getfontinfo (). Van egy nyílt forráskódú átalakító a http://ttf2ptl.jpeg")). amelyek Flash fájlformátumra lesznek konvertálva.Áttekintés Az swf_pushmatrix() verembe teszi az aktuális transzformáció mátrixot. Ehhez bármilyen PostScriptbetűtípust használhatsz. realpath (". Az swf_getfontinfo() egy asszociatív tömböt ad eredményül. A példában használt swf_definefont() a Times-Roman PostScriptbetű használatával egy talpas betűtípust határoz meg. a negatív pedig csökkenti a távolságot. Az swf_fonttracking() az aktuális betűtípus karakterei között távolságot állítja be úgy. mely a bittérkép méretét bájtban (size). amely tartalmazza az Aheight-et. $text = swf_nextid() . Inputként JPEG-. hogy neked is konvertálni kell a fontjaidat. Bittérképek és szimbólumok Bizonyos függvényekben bittérképeket használsz./test. 371 . A szövegelhelyezés megtervezését segíti a swf_textwidth(). swf_definefont($font_serif. "Times-Roman"). amelyeket az swf_definebitmap()-pel hozhatsz létre.5 ) . GIF. így lehet. Szöveg A szövegírást a betűtípus definiálásával kell kezdened. "This text is Flash".net-oldalon. swf_fontslant ( . $image info = swf getbitmapinfo($image) . swf_fontsize ( 3 0 ) . illetve számtalan nem ingyenest találhatsz mind Windows-ra.vagy RGB-képeket használhatsz. swfdefinebitmap($image. swf_definetext($text. swf fonttracking(2). A swf_getbitmapinfo() egy tömböt ad eredményül.

A következő kód ellenőrzi. hogy a minőséget megváltoztatták-e. A szimbólumok olyan apró Flash mozgóképek. A _levelO az aktuális mozgóképet az URL-lel helyettesíti: swf_actiongeturl("http://test. fejezet Képek t. az swf_actiontogglequality()-vel lehet a jobb és rosszabb minőség között váltani. és ha nem. így szúrva be oda őket. képkockára. a 4. akkor megváltoztatja: 372 . így szerkesztheted. Az swf_actionplay() az aktuális képkockától játssza le a Flash mozgóképet. swf_actionprevframe(). a swf_actionprevframe() pedig az előzőre. swf_enddoaction(). swf actionstop (). Ragadd meg az URL-t az swf_actiongeturl()-lel. Egy szimbólum definiálását a swf_startsymbol()-lal kezded és az swf_endsymbol()-lal fejezed be.11. Az swf_actionnextframe() a fájl következő képkockájára ugrik. képkockára ugrik. "_levell"). kis animált szimbólumokat használhatsz az egyes autómárkákra. és lejátssza a mozgóképet. ahogy azt a következő kódban látod. Ha a General Motors weboldalára készítesz Flash-animációt. majd visszaugrik az 1. közöttük pedig Flash-függvényeket használsz a szimbólum meghatározására: $symbol = swf nextid().htm l". swf_endsymbol(). amelyeket nagyobb Flash mozgóképben használsz objektumként. képkockára helyezi az swf_actionstop()-ot. megjelenítheted vagy lejátszhatod a képkockát. swf_actiongotoframe(1). A Flash reader a képkockákat kétféle minőségben képes megjelentetni. swf startsymbol($symbol). A műveleteket szkriptként rögzíted a Flash-fájlban. és hogyan hajtasz végre egy műveletet? A példában a kód a 4. és jelenítsd meg a mozgókép előtt a _Ievell-paraméter használatával. majd a szimbólumokat teljes képkockán rakod össze. ahogyan a példában is van: swf_actionnextframe(). hogy azonnal végrehajtódjon. Keverheted az URL-információt Flash képkockákkal és mozgóképekkel. az swf_actionstop() pedig az aktuális képkockánál állítja meg. swf_startdoaction().com/test. Műveletek A műveletekkel a képkockák a böngészőben való megjelenését szabályozhatod. Flash-terminológiában a képkocka lejátszása a böngészőbe teszi a képkockát. hogy az swf_actionstop() a képkockára kerüljön ahelyett. és megjeleníti azt (példánkban a 4. képkockát). Az swf_actiongotoframe() a meghatározott képkockára ugrik. Hogyan teszel műveletet egy képkockára. Ha azt akarod. swf_actiongotoframe(4). a mozgókép lejátszása pedig folytonos képkocka-megjelenítési módba teszi a képkockákat. tedd a függvényt az swf_startdoaction() és swf_enddoaction() közé. swf_actionplay().

amely több mozgóképet játszana. a több mozgóképet olyan figyelmet zavaró dolognak tartom. akik úgysem vásárolnak semmit. A logikáját fordítottnak találtam: ha nincs még kész a képkocka. Eddig még nem láttam ennek a kódnak igazán jó példáját. A további részleteket keresd a dokumentációban a www. Az swf_oncondition()-függvény a gomb típusától függően két lista egyikéből fogad konstansokat. swf^actiongeturl( " " . és ha nem.IdletoOverUp . jobb lenne visszafele ugrani a szkriptben. egyszerre játszott Flash mozgóképet irányíthatsz. A gomb kialakítása a swf_startbutton()-nal kezdődik. miközben a képkockák még töltődnek. egy objektumazonosítóval és a gomb aktuális frame-ben értelmezett mélységével. " leveli"). c o m /t es t. Különböző swf_oncondition(). éppúgy. 2 0 ) . Az swf_actionwaitforframe() ellenőrzi. Remélem. Az igazat megvallva. Az sw£_actionsettarget()-tel műveletek célját állíthatod be. Gombok A gombok lehetnek TYPE_MENUBUTTON vagy TYPE_PUSHBUTTON típusúak.OverUptoIdle 373 . ". hogy egyszerűbb legyen a megfelelő műveletre való ugrás: swf actionwaitforframe(5. s w f ^ a c ti o n g e tu r l ( " h t tp : // t es t. végül pedig az swf_endbutton()-paranccsal befejezed a gomb definiálását: $button = swf_nextid(). h t m l swf^oncondition(ButtonExit) . ahol a TYPE_MENUBUTTON elengedi a fókuszt a gombról. a jövőben lesz ilyen fejlesztés. swf_oncondition(ButtonEnter) .Áttekintés if(!isset($flash["quality"]) or !$flash["quality"]) { swf_actiontogglequality() . vagy olyan weboldalt. TYPE^PUSHBUTTON) swf_addbuttonrecord(BSDown. Ezt használhatod üzenet megjelenítésére. " _ l ev e ll " ) . így több. akkor átugorja a második paraméterben meghatározott számú (ebben az esetben 3) műveletet.és műveleti függvényekkel meghatározod a gomb műveleteit. swf_endbutton(). $flash["quality"] = true. BSOver és BSUp közül). A konstansok a HTML mouseover. 3). Sshape. és olyan unott tizenéveseket vonz az oldalra. ahogy a műveleteken is lesz címke. képkocka) be van-e töltve. a TYPE_PUSHBUTTON pedig még ilyenkor is a gombon tartja a fókuszt.openswf. amikor az egér nincs rajta. swf_startbutton($button. amely elűzi a vásárlókat.és mouseout-jához hasonló műveleteket jelentenek. BSDown. Az swf_addbuttonrecord() az első paraméterrel információt ad a gomb használatáról a gomb állapotainak megadásával (ami lehet egy vagy mind a BSHitTest.org-oldalon. hogy a képkocka (példánkban az 5. A TYPE_MENUBUTTON a következőket fogadja: .

Ebben a pillanatban a folyamatábrák és hálózati diagramok jutnak eszembe. Ekkor is gond nélkül tárolhatod a diagram szerkezetét és az összes képi összetevőt egy adatbázisban.11. amelynek gyors az olvasáshoz való hozzáférése. a képeket pedig egy külön könyvtárban. MySQL A kezdők számára a MySQL a legegyszerűbb adatbázis. mint maga a grafikus megjelenítés. így nagyon megfelel az olyan dokumentumrendszerekre. mint a PDF-dokumentumok egy halmaza. mérlegeld annak lehetőségét. Egy jól megtervezett adatbázis alapú megközelítés jobb keresési opciókat kínál. hogy a szöveget és a képeket párhuzamosan tárolod egy adatbázisban. Ha egy üzleti diagramot képi összetevőkből építesz fel. fejezet Képek - OverUptoOverDown OverDowntoOverUp IdletoOverDown OutDowntoIdle MenuEnter (IdletoOverUp | IdletoOverDown) MenuExit (OverUptoIdle | OverDowntoIdle) A TYPE_PUSHBUTTON a következőket fogadja: IdletoOverUp OverUptoIdle OverUptoOverDown OverDowntoOverUp OverDowntoOutDown OutDowntoOverDown OutDowntoIdle / ButtonEnter (IdletoOverUp | OutDowntoOverDown) ButtonExit (OverUptoIdle | OverDowntoOutDown) Képadatbázisok Ha egy dokumentum-formátumban. ahol a legtöbb hozzáférés weboldalról érkezik. és egyszerűbb. például PDF-ben vagy Microsoft Wordben szövegben tárolsz képet. vagy a szöveget egy kereshető adatbázisban tárolod. A MySQL nem rendelkezik hosszú bináris mezőkkel a képek 374 . ezek az összetevők lehetnek parányiak. és a számítógépnek sem kerül sok idejébe az egyes diagramok megrajzolása. Az ilyen diagramok adatbázis alapú megjelenítése sokkal kisebb lehet. ahol a képelemek apró ikonok. amelyeket különböző szövegcímkével számtalanszor újra felhasználnak. mint dokumentumok sorozatához egy adatbázist indexként illeszteni. a szövegben a képekre mutató linkekkel.

és ekkor már használd ki az alkalmat a PDF-modul telepítésére. A getimagesize()-zal információt szerezhetsz a képfájlokról. hogy a php/extensions-ből Windows NT és Windows 2000 alatt a c:/winnt/system32be.dll-t is.ini-t. és az adatbázisban csak a képekre vonatkozó hivatkozásokat tárolod. például a képértékesítőknek. Hyperwave A Hyperwave egy a dokumentumok kereshető objektumként való tárolására kialakított adatbázis. amelyekkel az egész profinak íog tűnni. ne pedig belső bináris objektumként. Ha valaki ragaszkodik az adatbázisból való képazonosításhoz. ha külső fájlként tartod meg a képeket. így használhatod a read_exif_data()-t. A dokumentumnak bármilyen képformátumot tudnia kell tartalmazni. így jobban jársz. Egyéb SQL-adatbázisok Az olyan egyéb adatbázisok. Ha online árulsz képet. A képi modul telepítése Unix-rendszerben a letöltések listája megtalálható a telepítési utasítások között. fejezetben mutatom be részletesen. hogy újra beolvassa a php. újra kell indítanod a webszervert. másold le a php_exif. vannak olyan trükkök. és senkit sem ismerek. használj a képi adatbázishoz is Oracle-t. Csupán annyit kell tenned. A CRC-t a 8. tárold a képhosszúságot és a CRC-t az adatbázisban. A lista tartalmazza a képi modul és a különböző extrák. 375 . és vannak olyan PHP-függvények. mint a PostgreSQL. fejezetben magyarázom el. Mialatt másolsz.Áttekintés tárolására. Oracle és SQL Server. amelyek segítségével egyszerűen tökéletessé teheted az oldalad. a Windows más verziói alatt windows/system-be másolod a php_gd.): "• extension=php_gd.dll-t. például a JPEG tömörítő rutinok forrását. Windows és Windows NT alatt a képi modul letöltésben érhető el.íni következő sorai elől távolítsd el a pontosvesszőt (. A Hyperwave-et a 6. Egy jó Linux-disztribúcióban az összes rész RPM-ként benne van. hivatkozási integritást és egyéb értékes tulajdonságokat nyújtanak az üzleti alkalmazásoknak.dll Ha a PHP-t modulként futtatod. A hivatkozási integritásból és a többi hasznos szolgáltatásból következő magas többletráfordítások miatt itt is inkább külső fájlként tárold a képeket. Ezután a php. aki a PHP-telepítési listában az összes opciót kiválasztaná. és a számlázási szoftvered Oracle-t használ. de kevesen telepítik alapként a PHP-t.dll extension=php_exif. Képek megjelenítése Ha egy oldalon belül képet jelenítesz meg. mert a kereshető referenciák a dokumentumokkal párhuzamosan vannak tárolva.

Ha van egy olyan képszerkesztőd. és számukra az image-tag alt-paramétere a legjobb iránytű a képekhez. és tökéletesen működött. 376 . fejezet Képek A függvény a fájl nevét kéri az elérési úttal együtt. Clinton" alt-paraméter hozzáadása kicsiny segítség.és egyéb mezőket is. A GNU Image Manipulation Program (Gimp) segítségével. és az 5. az alább látható hibaüzenetet kaptam. fejezetben leírt függvényekkel férsz hozzá ezekhez. hogy a Gimp későbbi verziói megjelenítik és törlik az EXIF. $extra)-ban. és egy szerzői jogi figyelmeztetést. hogy alt="2000. &$extra)-ban. Amikor kipróbáltam ezt PHP 4. január 20. mint a getimagesize($file. ha nem fájlt használsz a képekre. és 6. Megemlítettem néhány további mezőt is a fejlesztőknek. megváltoztathatod a JPEG-megjegyzéseket. az alt="Mrs..". az nagyon hasznos lehet.ami akkor fordulhat eló'. Ugyanakkor tárolhatod a jPEG-fájlban a leírásokat szöveges mezőben is. a getimagesize()-ba pedig képet tartalmazó sztringet is betehetsz . mint a getimagesize($file. JPEG. Ezt az extra paramétert bizonyos dokumentációkban „hívásidőátadás hivatkozással" ("call time pass by reference") paraméterként jelzik. ha másként mented el a fájlt (File. hogy a getimagesize() a hivatkozás által átadott paramétert belsőleg azonosítja: Figyelem: Ha hivatkozással kívánod átadni a paramétert.org címen érhető el (Unix. amelyikkel szöveget rakhatsz az extras-mezőbe. eredményként pedig . és így mented el adatbázisba. ami általában üres. és getimagesize()-zal keresheted vissza őket.0. Windows és Windows NT alá). Mindig használd az Alt-ot az image tag-ben A vakok mindig a szövegre támaszkodnak. állítsd át az allow_caU_time_pass_reference értékét true-ra (igaz) az INI fájlban. amellyel további infromációkat tudhatsz meg a JPEG-képekről.0. például ha egy e-mailhez csatolt állományból olvasod be a képet. amely a gimp. Hillary Rodham Clinton lányával a Fehér Ház lépcsőin áll. A JPEG-fájlok leírásait tárolhatod adatbázisban. Bármilyen fájlhivatkozást. míg ha valami olyasmit írsz. amikor a weboldaladat látogatják. tedd be az alt-szöveget. így elképzelhető. A getimagesize()-nak van egy opcionális második paramétere. így (PHP 4. Ezután kipróbáltam a kódot & nélkül. Ha az oldaladon van egy kép Hillary Rodham Clintonról.ha a fájl GIF. Ha engedélyezni kívánod a hivatkozással történő hívásidő átadást.11. Későbbi verziók azonban nem feltételenül fogják ezt támogatni. PNG vagy SWF típusú képfájl . A getimagesizeQ egy extrás nevű mezőt tartalmazó tömböt ad eredményül. ami azt jelzi.5-ben. Savé As). hiszen nagyon kevés képszerkesztő engedi meg.egy a fájlról információkat tartalmazó tömböt ad.5-től felfelé) URL-eket is használhatsz. módosítsd a getimagesizeQ deklarációját. hogy ténylegesen szöveget írj a mezőbe.

és a meghatározott színnel kitölti. Az első hozzárendelt színt a háttérre alkalmazza. Vázlatképek létrehozása Amikor egy kép olyan nagy. hogy a körcikket kitöltve egy kördiagram egy részét hozod létre. ha az ellipszis magassága és szélessége megegyezik. Ha kihagyod ezeket a paramétereket. majd egy további paraméter alapján eldöntheted. . az imagefill()-lel teheted meg. Ha más színűre akarod állítani a hátteret.imagechar() .imagearcQ . ha a nagy képeket kis vázlatokkal helyettesíted. JPEG.6-ban.Ellipszist rajzol.0.Törli a szín-hozzárendelést.imagestringO . A imageellipse()-hez hasonlóan az imagefilledellipseQ is kört rajzol. Sokkal színvonalasabb az oldalad megjelenése.Ellipszist rajzol.imagestringupO .Függőlegesen ír egy karakterekből álló sztringet.imageellipse() . JPEG.imagefilledelh'pse() . . . . . mint az imagearc().imagecolorallocate() . illetve amennyiben a magasság és a szélesség meg egyezik.imagecharupQ . és az olvasó a vázlatra kattintva kapja meg a teljes méretű képet. a látogatód böngészője az egyes képeknek megfelelő téglalapot fog megjeleníteni.Színt rendel egy képhez. alfa-csatorna információt tartalmazó kép (PNG) színkeverési módját állíthatod be vele.Ugyanazt az ívet rajzolja. hogy az egész látszódjon. majd az oldal elemei ugrálva igazodnak újra. jobban jársz.Függőlegesen ír egy karaktert. rágd át magad a „Szöveg létrehozása GIF-. .imageAlphaBlending() . ahogy az a kis ikonnal megfelelő.Vízszintesen ír egy karaktert.Egy ellipszis mentén rajzol egy vonalat. milyen könnyű ezekkel a függvényekkel egyszerű képeket létrehozni: . 377 . akkor egy körívet kapsz.Vízszintesen ír egy karakterekből álló sztringet. hogy egy átlagos képernyőn görgetni kell.vagy PNG-képekben" Gyors megoldások részeken. ha a kép letöltődik.24 bites. ahol a képnek kellene megjelenniük. . hogy megérezd. .vagy PNG-képekben" és „Ábra létrehozása GIF-. majd beszúrja a képeket. a height és width egyenlő. A beállítás a rákövetkező.imagecolordeallocate() . így újra hozzárendelheted vala mihez a színt. ha azok letöltődtek.imagefilledarcQ . . két képpel dolgozó függvényeket is érinti. akkor kört. ha használod a height-et és a width-et. Ha két paraméter. vagy az ív elejét és végét a húrral összekötve a húr és az ív által határolt területet tököd ki.Áttekintés Használd a méretinformációt az image tag-ben Ha megadod a height = "" és width = ""-paramétereket az <img> tag-ekben. Képek létrehozása Következzenek az image-függvények és használatuk összefoglalása. . A függvény új a PHP 4. úgy formázza az oldalt. a böngésző kis ikont helyez oda. Miután ezt elolvastad.

Segítségével megkapod az adott pixelben levő szín színkódját. Talán egy későbbi verzióban átírják ezeket a függvényeket. mint az imagecolorresolve(). imagecolorstotal() — A színskála színeinek számát adja vissza. hogy adott pixelméretben mentse el a képet. majd a szkriptet úgy megírni. 378 F . majd menet közben visszakonvertálnád Macintosh gammára. így a Macintosh-ról vett képet kijavítva megjelenítheted más gépeken vagy fordítva. zöld és kék összetevőket tartalmazó tömb formájában ad vissza egy színt a színskálából.0-s gammával beszkennelni. A függvénynek a bemenő kép gammájára.0. hogy 2. így egyelőre be kell érni a -1-gyel.2-del másolja őket egy könyvtárba (amelyet nevezz images-nek). míg a PC-ké 2. imagecolorresolve() . De a nulla szabályos színkód. hogy az valódi színből legyen). imagecolortransparentQ .Ugyanúgy működik. imagecolorexactalpha() . illetve a -1-et. mint az imagecolorclosest(). az imagecolorat() a színt adja vissza. imagecolorclosestQ . A GIF támogatja az átlátszóságot. elmentenéd az images-könyvtárba. és a szín színkódját adja vissza. és a szín vagy a legközelebbi változatának színkódját adja vissza. ezzel eldöntheted.8-es gamma-beállítást tartalmaz.Egy színt fogad el.RGB-színt fogad el. és a legközelebb álló szín színkódját adja vissza (nem szükségszerű.Segítségével gamma-korrekciót hajthatsz végre egy képen.fi 11. Az Apple RGB-meghatározása 1. és 1.8-del egy másik könyvtárba (ezt pedig nevezd imagesmac-nek). imagecolorsforindexQ . hogy valódi hibát adjanak vissza. Ekkor ugyanis legrosszabb esetben egy Macintosh-ról származó JPEG-et átkonvertálnál PC-s gammára. imagecolorresolvealpha() . Ha olyan weboldalt készítesz. amelyik különböző képeket jelenít meg PC-n és Macintosh-on. imagegammacorrect() .6).2-est.Egy színt és egy alfa-értéket fogad el. Ez két konverziót és sokkal több hibát jelentene. így használhatod a színt máshol is. Ez az egyszerű átváltás kevesebb erőforrást használ. illetve a kimenő képre alkalmazott gammára van szüksége. Jelenleg az imagegifQ and imagepng() függvényekben nincsen olyan opció. ha a szín nincsen a színskálában. és az adott szín kódját adja vissza. akkor célszerű a képeket 1. imagecolorexact() . de másmilyen kiválasztási módszert használ.Színt állít be a színskálán. vagy -1et.Egy színt és egy alfa-értéket fogad el. Úgy tűnik. imagecolorcIosestalphaQ . ha nem találja a színt. egy alfa-paraméterrel kiegészítve. a PNG-képekben azonban azt jobban szabályozhatod az alfa-értékekkel. illetve azt is. és a legközelebbi szín színkódját adja vissza. mintha oda-vissza konvertálnál a formátumok között. mivel a nullát a PHP hamisnak értelmezi. hogyan mentsd el a képet. illetve kevesebb színbeli torzulást okoz. fejezet Képek 0 i II imagecolorat() . imagecolorset() . hogy pixelenként hány bit legyen.RGB-színkódot fogad el.Egy a piros. hogy az imagecolorresolve() ugyanazt a műveletet végzi el. Amikor a képet színskála helyett valódi színekből készíted (PHP 4.Átlátszónak állíthatsz be egy színt. ha az ilyen színekre nullát vagy hibát adna vissza. Logikus lenne.

Színskála alapú képet hoz létre (8 bites szín).Képet hoz létre egy sztringben tárolt képből. mint az impagecopymerge(). imagetruecolortopaletteQ -True color (24 bites) képet palettaképre konvertál (8 bites színmélység).PNG-fájlból vagy URL-ből hoz létre képeket.JPEG-fájlból vagy URL-ből hoz létre képeket. imagelineQ .Valódi színekből hoz létre képet (24 bites). vagy PNG-formátumban fájlba menti. imagedashedline() . imagecreatefromwbmpO -Windows bitmap-fájlból vagy URL-ből hoz létre képeket. mint az imagecopy(). Ahelyett.Ezeket a függvényeket az „Átméretezés és újbóli mintavételezés" című részben tárgyalom. az ilyen fájlok beolvasása nem korlátozott.GIF-fájlból vagy URL-ből hoz létre képeket.y-pontból a másikba. amikor végeztél vele. imagegifQ . hogy milyen képformátumokkal működik.Ugyanazt csinálja. Jóllehet a szerzői jogi helyzet nem teszi lehetővé. így beolvashatsz adatbázisokba mentett vagy e-mailek csatolt állományaiból dekódolt képeket. Az összeolvadás 0tól 100-ig terjed. imagedestroyO . így nem próbáltam ki. imagepngQ . így nem mutatok rá példákat. amelyben egyszerű sima színeket használ. imagecreatefromjpegO . hogy a PHP szerzői GIF létrehozására alkalmas kódot tegyenek a programba.Elküldi a képet a böngészőnek. imagecopyresízed() és imagecopyresampled{) . 0-nál gyakorlatilag semmi nem történik. imagecreatefromgif() .Ugyanazt csinálja. egy extra lehetőséggel: a célterületet először szürke árnyalatúra konvertálja.y-pontból a másikba. imagesetpixel() . 100-nál pedig teljes a helyettesítés. imagewbmpO . próbáld a bannert PNG-be (vagy GIF-be) másolni. imagecopymerge() .Egyszerű pontot írhatsz vele.Szaggatott vonalat rajzol az egyik x.Elküldi a képet a böngészőnek. imagecreatetruecolor() . vagy GIF-formátumban fájlba menti. ha egy hirdetőd JPEG-ben küldi a bannerjét. imagecreatefromstringQ . imagecreatefrompngQ . hogy betömörítenéd a bannert. imagejpegO .Áttekintés imagecopyO . 379 . ennek akkor veheted hasznát. A függvény jelenleg még fejlesztés alatt áll. egy extra lehetőséggel: a másolat az általad meghatározott mértékben olvad bele a képbe.Egy kép téglalap alakú részét a kép egy másik részébe másolja. vagy JPEG-formátumban fájlba menti. Új függvény. vagy Windows bitmap-formátumban fájlba menti. így az összes szín a másolt képből jön. amelyet utána PNG-ként menthetsz.Elküldi a képet a böngészőnek.Eltávolítja a képet a memóriából. így könnyedén írhatsz szkriptet GIF beolvasására. amely még fejlesztés alatt áll.Vonalat rajzol az egyik x.Elküldi a képet a böngészőnek. imagecopymergegrayO . imagecreateQ . és ezzel kockáztatnád a színhelyességet.

A téglala pokat. amikor rengeteg betűtípust egyszerre használsz a szkriptben. imagepsextendfont() .PostScript-betű karakterkódolási vektorát változtatja meg. sokszögeket és ellipsziseket a Gyors megoldások „Diagram létrehozása GIF-.77. imagepstext() . imagefontheight() .Sokszöget rajzol a tömbben meghatározott pontok listájából. imagepsfreefont() .PostScript-betűtípust tölt be egy fájlból.Kiterjeszt vagy tömörít egy PostScript-betűtípust.Az egész képet egy színnel tölti ki. imageloadfont() . amellyel a vonalrajzoló függvények hez választhatod ki a vonal vastagságát. használat előtt teszteld.Ez is új függvény. imagepolygon() . imagepsbbox() . vonalak rajzolásához választ hatsz vele ecsetképet. imagesettile() . imageinterlaceQ .vagy kikapcsolhatod azt. Segítségével pszeudó ki töltési színt adhatsz meg a képnek. előfordul. Mivel sok kép esetében ennek nincs értelme. imagepsslantfontQ . hogy az interlace-opció be van-e kapcsolva a képen. imagefilledrectangle() . imagefontwidth() .Megmutatja. imagettfbbox() . imagepsencodefont() . Az imagefilltoborder()-hez hasonló függvényekben való kitöltéshez egyszerűen válaszd a IMG_COLOR_TILED színt. haszna.Téglalapot rajzol. és a képet használhatod alakzatok kitöltésére. Bizonyos képek esetén az interlace lehetővé teszi a kép teljes letöltése előtt annak nagy vonalakban történő megjeleníté sét. imagefilledpolygon() .vagy PNG-képekben" című részben mutatom meg.TrueType-betűtípussal ír szöveget. hogy a függvénynek nin. imagettftext() .Sokszöget rajzol. fejezet Képek g If - - - - imagerectangle() -Téglalapot rajzol két sarokpont közé. 380 . akár a imagesetbrush(). a függvény színparaméterével választhatod ki vonal vagy sokszög rajzolására. imagefilltoborder() — Meghatározott színnel tölt ki egy képet a szín által meghatáro zott keretig.Egy betűtípus szélességét adja vissza.PostScript Type 1 betűtípussal készült.A PostScript betű által használt memóriát szabadítja fel. imagesetthickness() .PostScript-betűtípust használva szöveges sztringet ír egy képre. és segítségével be.Szintén egy új függvény. JPEG. amire akkor lehet szükséged. imagesetbrushQ . és kitölti a kiválasztott színnel.Dőlést ad egy PostScript-betűtípusnak. imagefill() . és mivel pszeudoszínként van definiálva.Ez a függvény fejlesztés alatt van. ezer. és kitölti a kiválasztott színnel. Bizonyos fájlformátumoknál az interlacing megnövelheti a fájlméretet. A kép a memóriában levő bármelyik kép lehet. téglalappal határolt szöveg méreteit adja vissza.Az imagettftext()-tel írt szöveget határoló téglalap méretét adja vissza.Egy speciális formátum használatával bitmap-betűtípust tölt be fájlból.Egy betűtípus magasságát adja vissza. imagepsloadfont() .

A PHP által támogatott képtípusok listáját adja vissza.0. így a szín nem lesz pontos. Hozz létre egy images nevű könyvtára a weboldaladon. Segítségével dinamikus kódot írhatsz.0. Amikor a PNG 8 bites színt használ. Színek változtatása A GIF 8 bites színt (256 különböző' szín). és utána már csak a 381 . a PNG pedig mindkettőt használhatja. ahol mind a 256 színnek lehet 24 bites értéke. így lehetett velük GIF. és a opcionális minőségi paramétert 100-nál kisebbre állítod (az alapértelmezett érték a 100). ahol ezt a PHP újabb verziói támogatják. A LCD-monitorok a 24 milliónál sokkal kevesebb színt képesek megjeleníteni. De vajon a szín pontosan ugyanaz marad? A GIF és a PNG pontos színeket tárol. illetve az oldaladon kívül egy originals-nak nevezett másikat. Az images-hez bárki hozzáférhet. te pedig bármilyen fájlformátumban használhatod a színt. így a PC-n készített képek túlságosan világosnak tűnnek a Macintosh-on. Majd az új képet úgy hozd létre. mind a GIF. Ha folyamatosan változtatsz egy képet. A PHP 4. Az imagesx(). Az olyan képek esetében. Hogyan tudsz hát ezen segíteni? Mindig eredeti képből dolgozz. Csábító lenne megnyitni az eredetit. amely GIF-eket használ a PHP régebbi verzióival működő oldalakon. Ha változtatást akarsz végrehajtani. például #f2334c-t. hogy az eredeti képen hajtsd végre az összegzett változtatásokat. Ha használod a imagejpeg()-t. A PHP 4. különösen ha egy JPEG-et. Ez azt jelenti. ahogy növeled a tömörítést). veszítesz a színhelyességből. de JPEGeken nem. Ez az olyan függvényekkel betöltött képek esetén nagyszerű. imagesyO . A Macintosh-nak és a PC-nek különbözik a gamma-beállítása. mint a céglogók.és JPEG-képeken. imagetypesQ . míg a PHP mindkettőhöz hozzáfér. A JPEG viszont egy közelítést tárol (amely egyre pontatlanabb lesz. de az originals-hoz nem. de a tömörítés alacsony foka mellett ez nem észrevehető. így a színek kevésbé pontosnak tűnhetnek. a Macintosh-on készített képek pedig túlságosan sötétek PC-n. mind a PNG olyan színskálát használ.és 8 bites PNG-képeken dolgozni. hogy az ügyfelek minden alkalommal a megfelelő színt lássák. tartsd meg az eredeti fájlt és a változtatások listáját. hogy a gondosan elkészített grafikai munkából zavaróan rossz kép válik. nyisd meg az eredetit és írj rá mindent. Mindezek a technikai problémák nehezítik.A kép magasságát adja vissza.Áttekintés imagesx() . Képek változtatása A képek változ