Kirjoittaja: Antti Laaksonen (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.
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
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']
.
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ä.
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.
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).
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.
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.
Ä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.
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.
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.
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
Nyt se loppu :(
"Kumpi on nopeampi: echo vai print?"
Jäin kaipailemaan oikeata vastausta :)
Print ja echo on toistensa aliaksia joten luulisin että molemmat on aika tarkkaan yhtänopeita.
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.
olen käyttäny enemmän echoa koska olen tottunut siihen
lainaus:
olen käyttäny enemmän echoa koska olen tottunut siihen
Hmm, kerrotko lisää?
ei kait siinä ole kertomista :)
Antti, pystyisitköhän tehdä näistä kaikista php-oppaista sellaisen että ne voisi imuroida omalle koneelleen vaikkapa yhdessä zip- paketissa.
print ja echo? sama se on, kumpaa on tottunu käyttää, nii sitä sit käyttää..
Kirjoittajalle paljon kiitoksia tästä loistavaakin loistavammasta opassarjasta! :)
Hyvä opas kiitokset ! :)
Hieno opas kokonaisuudessan, paljon oon oppinut.
Eikös echo ole nopeampi, koska php:tä tulkataan? Sillä sehän on yhden merkin lyhyempi. :)
Mulle toi nopeus on ihan sama... Aika lailla samalla tahdilla ne toimii.
hatunnosto sille joka kirjoittaa esimerkin skriptistä josta puolimegasen verkon yli tulkattaessa on havaittavisa printin ja echon ero edes millisekunteina.
sekuntti kello käteen ja mittailemaan.
Näiden oppaiden avulla sitä on harjoteltu php:tä n. 1,5v ja nyt sen taitaa kun omat taskunsa :)
Hyvät oppaat. Toivottavasti tulee jatkoa
<offtopic>
No nyt onkin kiva tunne ;). Ensimmäisellä vilkaisukerralla en mitään tajunnut, sitten harjoittelee oppaan läpi (2h), ja vilkaisee uudelleen....
</offtopic>
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
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)
Ei tää PHP ookkaan niin vaikeeta.. :o
kiitoksia oppaista!
Kiitokset erittäin hyvästä opassarjasta, nyt vaan tekemään korttipelisivua :lol:
Kiitokset myös täältä, hyvä opas!
Nyt pääsen lisäämään listaan PHP.
Siisti opas!!!
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."
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
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);
Aivan mahtava opas !
Nyt pääsin paremmin jyvälle peehoopeestä. Kiitos!
Olisiko mahdollista että tulee uusia osia joskus kun tämä on niin paras php tuto?
No loppu se siihe.
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.