Kirjautuminen

Haku

Tehtävät

Opasarkisto: Käytännön PHP-opas: Osa 9 - Vinkkejä ja vihjeitä

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat ja taulukot
  3. Osa 3 - Komentorakenteet
  4. Osa 4 - PHP ja Internet-sivut
  5. Osa 5 - Tiedostojen käsittely
  6. Osa 6 - Funktiot
  7. Osa 7 - Evästeet ja istunnot
  8. Osa 8 - Tietokannat (MySQL)
  9. Osa 9 - Vinkkejä ja vihjeitä

Kirjoittaja: Antti Laaksonen. Vuosi: 2003.

Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi.

Tähän oppaaseen olen kerännyt vastauksia kysymyksiin, jotka esiintyvät usein PHP-aiheisilla keskustelupalstoilla ja joihin ei löydy kunnollista vastausta opassarjan aikaisemmista osista. Joihinkin kysymyksiin liittyy myös vääriä uskomuksia, joita pyrin oikomaan. Mainittakoon vielä, että Ohjelmointiputkan PHP-FAQ-listasta löytyy vastaus mm. moniin lomakkeisiin ja evästeisiin liittyviin kysymyksiin.

Miten voin muuttaa PHP:n asetuksia?

Monissa oppaissa ja artikkeleissa kehotetaan tekemään muutoksia PHP:n asetustiedostoon, mutta harvemmin muistetaan kertoa, missä tällainen tiedosto on ja kuinka sitä pystyy muuttamaan. Joten tässä kerrottakoon. Asetustiedosto löytyy siitä hakemistosta, johon PHP on asennettu, ja sen nimi on php.ini. Joskus hakemistossa saattaa olla ainoastaan php.ini-dist-niminen tiedosto, joka sisältää PHP:n oletusasetukset. Tällöin voit vaihtaa tiedoston nimen php.ini:ksi.

Asetustiedosto on tavallinen tekstitiedosto, ja sen rivien rakenne on:

; kommentti
asetus = arvo

Miksi lomakemuuttujat, evästeet jne. eivät (enää) välity skriptille?

PHP:n versiosta 4.2.0 eteenpäin register_globals-asetus on oletuksena kytketty pois päältä. Tästä johtuen ns. superglobaalit muuttujat (mm. lomakemuuttujat ja evästeet) eivät ole samannimisissä muuttujissa vaan ne on kaivettava esiin erillisistä taulukoista. Tämä muutos, joka on aiheuttanut melko monelle PHP-ohjelmoijalle aluksi harmaita hiuksia, johtuu siitä, että vanhalla tavalla toteutettuihin skripteihin saattaa helposti jäädä salakavalia tietoturva-aukkoja.

Muuttujat on jaettu taulukoihin niiden tyypin mukaan: $_GET- ja $_POST-taulukoissa on lomakkeiden kautta tulleet muuttujat, evästeet ja istunnot löytyvät $_COOKIE- ja $_SESSION-taulukoista ja $_SERVER-taulukko sisältää palvelimen tietoja. Muita superglobaaleja taulukkoja ovat $_ENV (ympäristömuuttujat), $_FILES (lomakkeen kautta lähetetyt tiedostot) ja $_REQUEST (lomakemuuttujat ja evästeet samassa taulukossa).

Esimerkiksi post-metodilla lähetetty lomakemuuttuja, jonka nimi on otsikko, löytyy nyt taulukosta $_POST['otsikko'].

Mikä on vikana, kun tulee virheilmoitus "Parse error"?

Todennäköisesti skriptissäsi on kirjoitusvirhe. Tarkista, että:

Virheilmoituksen kertoma rivi ei välttämättä ole täysin oikea, koska tämäntyyppinen virhe saattaa vaikuttaa vasta myöhemmillä riveillä.

Miksi heitto- ja lainausmerkkien eteen tulee kenoviivoja?

Todennäköisesti kysymys on lomakkeen kautta lähetetystä tekstistä. Ratkaisu ongelmaan on yksinkertainen: funktio nimeltä stripslashes poistaa juuri oikeista paikoista ylimääräiset kenoviivat.

Mikä ovat oikeat oikeudet ("chmod-arvo") tiedostolle?

Yleisesti ottaen: mitä vähemmän oikeuksia tiedostoon, sen parempi. Esimerkiksi jos skripti pelkästään lukee palvelimelle tallennetusta tekstitiedostosta pari riviä, tiedostoon ei varmaan tarvita kirjoitusoikeuksia. 777 eli täydet oikeudet on hyvin harvoin oikeasti tarpeellinen. Jos haluat pelata varman päälle, kokeile omalla palvelimellasi, mitä oikeuksia tiedostoon täytyy myöntää, jotta PHP pystyy lukemaan tai kirjoittamaan siihen (virheilmoitus "Access denied" kertoo, että oikeudet eivät ole riittävät).

Miten PHP:llä voi näyttää viesti-ikkunan, lukea hiiren koordinaatit jne.?

Ei valitettavasti mitenkään niin kauan kuin skripti suoritetaan palvelimella. Kun sivu lähtee palvelimelta matkaan käyttäjälle päin, mahdollinen PHP-koodi on jo suoritettu, eikä sivun lähdekoodissa pysty edes näkemään merkkejä PHP:n käytöstä. Näin ollen se pystyy saamaan aikaan yhtä paljon toiminnallisuutta käyttäjän puolella kuin tavallinen HTML-sivu. Tietysti sivu voi sisältää esimerkiksi JavaScript-koodinpätkän, joka aikanaan suoritetaan käyttäjän selaimessa.

Miten md5-funktio oikeastaan toimii?

Funktion toiminta on minusta helppo ymmärtää vertaamalla sitä jakojäännökseen. Esimerkiksi kun luku 12345 jaetaan 19:llä, jakojäännös on 14. Luvun 12345 jakojäännös 19:llä on siis aina 14, mutta luvusta 14 ei ole mahdollista saada selville, että alkuperäinen luku oli 12345. md5-funktio toimii samoin: se muodostaa merkkijonosta 32 merkkiä pitkän tarkistussumman, josta käytetään englanninkielistä nimeä hash. Toisin kuin jakojäännöksessä, käytännössä jokaisen merkkijonon hash on erilainen.

Esimerkiksi merkkijonon "Näin toimii md5-funktio" md5-hash on f7a5f38eba14b31c0656b6f3c7341dc3.

Turvallinen tapa tallentaa käyttäjien salasanat on tallentaa tiedostoon tai tietokantaan salasanojen md5-hashit. Kun käyttäjä kirjautuu sisään, hänen antamansa salasanan hashia verrataan alkuperäiseen hashiin. Jos ne ovat samat, salasana on oikea. Kuitenkin on hyvä muistaa, että näinkin tallennetun salasanan voi saada helposti selville kokeilemalla kaikkia vaihtoehtoja, jos salasana on lyhyt.

Kumpi on nopeampi: echo vai print?

Älä turhaan yritä optimoida PHP-skriptiä muutaman mikrosekunnin tähden, sillä sivun siirtäminen Internetin yli ja näyttäminen selaimessa kestää joka tapauksessa paljon kauemmin. Pyri ennemmin koodin selkeyteen. Vasta silloin, kun käyttäjä pystyy havaitsemaan ylimääräistä hitautta, skriptiä on syytä optimoida. Tällöin syynä ovat useimmiten huonosti suunnitellut tietokantahaut tai silmukkarakenteet.

Kummat ovat parempia: evästeet vai istunnot?

Ensinnäkin sensuuntaiset väitteet, että "istunnot toimivat useammalla käyttäjällä kuin evästeet", kannattaa jättää omaan arvoonsa, sillä useimmiten istunnon id-numero kuitenkin tallennetaan evästeeseen (toinen vaihtoehto on kuljettaa sitä URL-osoitteen mukana). Istuntojen käytössä on kuitenkin se hyvä puoli, että kaikki käyttäjän tiedot id-numeroa lukuun ottamatta tallennetaan palvelimelle. Näin tietoihin pääsee käsiksi ainoastaan PHP-skripti; ulkopuolelle jäävät niin tutkimushaluinen käyttäjä itse kuin ilkeämielinen hakkerikin.

Kumpia pitäisi käyttää: tiedostoja vai tietokantaa?

Riippuu tilanteesta. Jos tietoa on vähän tai se on muuttumatonta, tiedosto on oikea valinta. Tiedostoissa on myös se hyvä puoli, että niiden käyttö on mahdollista kaikilla palvelimilla. Jos tietoa taas täytyy jatkuvasti lisätä, muuttaa ja poistaa, ja sitä on tarkoitus näyttää sivulla eri tavoin järjestettynä ja karsittuna, tietokanta on varmaankin tarpeen. Esimerkkien avulla ilmaisten: Lapin-matkakertomus kannattaa tallentaa tiedostoon ja jalkapallojoukkueen pelitulokset tietokantaan.

Viimeiset loppusanat

Yhdeksän osan ja seitsemän kuukauden jälkeen alkaa opassarja olla lopussa. Oppaisiin on mahtunut melko paljon asiaa, ja toisin kuin aluksi suunnittelin, mukana on paljon muutakin kuin pelkät perusteet. Toivottavasti oppaista on myös ollut hyötyä sinulle PHP-opiskelussasi! Kuitenkaan oppaiden lukeminen ei yksinään riitä, vaan paljon tärkeämpi osa on omilla harjoituksilla ja kokeiluilla.

Palautetta voit lähettää sivun alareunassa olevalla lomakkeella tai sähköpostilla. Kerro samalla, mistä PHP-ohjelmointiin liittyvistä aiheista haluaisit jatkossa lukea Ohjelmointiputkasta.

Loppu.

Antti Laaksonen, 14.9.2003


Kommentit

Gwaur [14.09.2003 22:43:44]

Lainaa #

Nyt se loppu :(

ottis [15.09.2003 23:44:49]

Lainaa #

"Kumpi on nopeampi: echo vai print?"
Jäin kaipailemaan oikeata vastausta :)

Tulilintu [16.09.2003 16:00:07]

Lainaa #

Print ja echo on toistensa aliaksia joten luulisin että molemmat on aika tarkkaan yhtänopeita.

odys [24.09.2003 22:23:45]

Lainaa #

echo on nopeampi, koska se ei palauta TRUE/FALSE kuten print. Ero on kuitenkin aika mitätön :)

echossa on myös jotain pieniä eroja kuten: echo "Moi", " Hoi", " Hei"; // Toimii

Print "Moi", " Hoi", " Hei"; // Ei toimi

Ja Tulilintu Print ja echo ovat eri asia ei toistensa aliaksia.

makeuu [13.10.2003 22:19:32]

Lainaa #

olen käyttäny enemmän echoa koska olen tottunut siihen

-Teme- [27.11.2003 12:31:18]

Lainaa #

lainaus:

olen käyttäny enemmän echoa koska olen tottunut siihen

Hmm, kerrotko lisää?

makeuu [09.12.2003 21:10:47]

Lainaa #

ei kait siinä ole kertomista :)

jonsku [18.01.2004 23:21:24]

Lainaa #

Antti, pystyisitköhän tehdä näistä kaikista php-oppaista sellaisen että ne voisi imuroida omalle koneelleen vaikkapa yhdessä zip- paketissa.

irwinace [16.05.2004 23:23:58]

Lainaa #

print ja echo? sama se on, kumpaa on tottunu käyttää, nii sitä sit käyttää..

mozak [05.06.2004 22:10:29]

Lainaa #

Kirjoittajalle paljon kiitoksia tästä loistavaakin loistavammasta opassarjasta! :)

vOmpatti [08.02.2005 06:38:59]

Lainaa #

Hyvä opas kiitokset ! :)

Matso [12.09.2005 21:55:11]

Lainaa #

Hieno opas kokonaisuudessan, paljon oon oppinut.

Puhveli [17.09.2005 18:58:09]

Lainaa #

Eikös echo ole nopeampi, koska php:tä tulkataan? Sillä sehän on yhden merkin lyhyempi. :)

Smappa [24.10.2005 21:47:13]

Lainaa #

Mulle toi nopeus on ihan sama... Aika lailla samalla tahdilla ne toimii.

tomaattigeeni [24.11.2005 18:18:54]

Lainaa #

hatunnosto sille joka kirjoittaa esimerkin skriptistä josta puolimegasen verkon yli tulkattaessa on havaittavisa printin ja echon ero edes millisekunteina.

stere [05.07.2006 14:58:55]

Lainaa #

sekuntti kello käteen ja mittailemaan.

Tontsa-san [18.07.2006 20:18:59]

Lainaa #

Näiden oppaiden avulla sitä on harjoteltu php:tä n. 1,5v ja nyt sen taitaa kun omat taskunsa :)

harma [06.01.2007 22:22:22]

Lainaa #

Hyvät oppaat. Toivottavasti tulee jatkoa

Codeprofile [14.01.2007 15:36:25]

Lainaa #

<offtopic>
No nyt onkin kiva tunne ;). Ensimmäisellä vilkaisukerralla en mitään tajunnut, sitten harjoittelee oppaan läpi (2h), ja vilkaisee uudelleen....
</offtopic>

zedo [06.04.2007 10:29:58]

Lainaa #

Wow...
aina se niitten loppusanojen lukeminen vaan tuntuu yhtä mahtavalta/hienolta(/surulliselta). Melkein tulee tippa linssiin, vai pitäskö sanoa ruutuun...

Tän avulla mäki opin Php:tä sen verran ku nkyään osaan...

------------------

mä veikkaan et echo ois kyl nopeempi.
-onhan se 1 merkin lyhykäisempi
-ei palauta truefalseja

Kurko [15.05.2007 17:28:04]

Lainaa #

PHP:ssä echo toimii myös näin:

<?php
$nimi = "Kalle";
?>
<html>
<body>
Nimi: <?=$nimi?>
</body>
</html>

Kätevä kun tulostetaan muuttujia html koodin seassa.
(Täytyy olla short_open_tag:it päällä jotta toimii)

Nizbu [22.09.2007 10:28:07]

Lainaa #

Ei tää PHP ookkaan niin vaikeeta.. :o
kiitoksia oppaista!

z3zim4 [02.04.2008 18:56:44]

Lainaa #

Kiitokset erittäin hyvästä opassarjasta, nyt vaan tekemään korttipelisivua :lol:

KMS [09.06.2008 19:05:51]

Lainaa #

Kiitokset myös täältä, hyvä opas!

Pollapoju [03.07.2008 14:33:08]

Lainaa #

Nyt pääsen lisäämään listaan PHP.

apsu [05.07.2008 07:35:22]

Lainaa #

Siisti opas!!!

viltsu [16.08.2008 00:08:38]

Lainaa #

Kiitokset selkeästä oppaasta!

Sain tehtyä näillä ohjeilla sivut itselleni, yksi asia jäi kuitenkin vaivaamaan:

Mistä mahtaa johtua, että Å, Ä ja Ö näkyvät tekstissä � -merkkeinä?

"Teemu Sel�nne on j��kiekkoilija, h�n voitti Stanley Cupin vuosi sitten."

Dexter [21.01.2009 21:33:55]

Lainaa #

Hyvä opas. Tän ansiosta sain jo vieraskirjan koodattua niin et se listaa viestit alas päin =) Pitäs kesksii miten ylös :P
Mut tosi hyvä opas

ankzilla [26.03.2009 18:58:20]

Lainaa #

Dexter kirjoitti:

Hyvä opas. Tän ansiosta sain jo vieraskirjan koodattua niin et se listaa viestit alas päin =) Pitäs kesksii miten ylös :P
Mut tosi hyvä opas

$include = file_get_contents($filu);
unlink($filu);
$asd = fopen($filu);
fwrite($asd, $teksti . $include);
fclose($asd);

Tietovirus [16.06.2009 23:37:55]

Lainaa #

Aivan mahtava opas !
Nyt pääsin paremmin jyvälle peehoopeestä. Kiitos!

ItEliasPro [14.03.2011 19:03:42]

Lainaa #

Olisiko mahdollista että tulee uusia osia joskus kun tämä on niin paras php tuto?

ErroR++ [28.04.2011 15:37:26]

Lainaa #

No loppu se siihe.

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta