Heippa kaikille.
Rakentelen nettisivuilleni kirjautumismahdollisuutta käyttäen keksejä. Minulla on index.php, jossa sijaitsee kirjautumisformi, jota käsittelee tunnista_kirjautuminen.php:
# tämä ei ole koko tiedosto, mutta oleellisimmat osat rakenteesta $kayttajanimi = $_POST['kayttaja']; $salasana = $_POST['salasana']; # ... # avataan tiedosto, joka sisältää tunnukset (public_html-kansion ulkopuolella) # ja tutkitaan, antoiko käyttäjä olemassaolevaa tunnusta $tunnukset = file("../tunnukset"); # ... # menikö salasana oikein # jos meni, niin setcookie("kaurapala", $kayttajanimi, 0, "/", "http://www.osoite.fi"); echo '<p><a href="kayttajasivu/">Hyppää käyttäjäsivulle!</a></p>'; die();
Jostain kumman syystä keksiä ei kuitenkaan ikinä luoda, vaikka salasana ja käyttäjätunnus menevätkin oikein. Lueskelin, että setcookie pitää kutsua ennen tulosteita, mutta kaikki html-aiheiset tulostukset tehdään vasta kutsun jälkeen, joten siitä ei pitäisi ainakaan kiikastaa.
Keksien luomisessa vika ei voi olla, koska tein tiedoston cookie.php, joka kutsuu vain setcookie(...)-komentoa, ja se onnistui firefoxin mukaan luomaan keksin ongelmitta. Vika on siis tunnista_kirjautuminen.php:ssa, mutta en keksi, missä siellä. Ko. tiedostossa ei tehdä mitään salasanojen hashauksien purkamisesta poikkeavaa.
PHP:n versio on 5.3.
Ei vian tarvitse olla juuri tuossa PHP-tiedostossa. Riittää, että tulostus tapahtuu ihan missä tahansa vaiheessa suoritusta ennen setcookie()-kutsua. Whitespace ennen <?php-avaustagiakin riittää. Kannattaisi tosin laittaa output buffering päälle, koska se parantaa suorituskykyä. Haittapuolena sitten tällaiset suunnittelu- tai huolimattomuusvirheet jäävät piiloon.
Nyt en aivan ymmärtänyt.
Tiedostossa tunnista_kirjautuminen.php ei tehdä tulostuksia ennen setcookies()-kutsua. Whitespaceja ei ole, ellei editorini niitä kätke jostain syystä.
Kirjautumisen rakenne on:
index.php (form action) -> tunnista_kirjautuminen.php -> /kayttajasivu/index.php -> ../ulos.php
index.php sisältää aivan perinteisen formin:
<form action="tunnista_kirjautuminen.php" method="post"> Tunnus: <input type="text" name="unam"><br /> Salasana: <input type="password" name="pass"><br /> <input type="submit" value="Kirjaudu"> </form>
Minun pitää googlettaa tuo mainitsemasi output buffering.
No heität exitin kirjautumisprosessin loppuun ennen uudelleenohjausta, niin näet, mitä kaikkea skriptisi onkaan tulostanut ennen setcookieta. Ei ollenkaan vaikeaa.
Mutta kun uudelleenohjausta ei tapahdu. tunnista_kirjautuminen.php:sta siirrytään manuaalisesti käyttäjäsivulle, joten kaikki tulosteet näkyvät kyllä.
Onko siitä haittaa, jos tulosteita tehdään php-lohkon jälkeen?
<?php ... ?> <p>Tekstiä</p>
Sanoin jo, että mikä tahansa tuloste ennen setcookie()-kutsua rikkoo keksin asettamisen, mikäli ob ei ole päällä. Yksikin välilyönti jne.
Koodia tehdessä pitäisi lisäksi aina olla virheraportointi päällä ja tiukoilla asetuksilla:
Kytkin virheraportoinnin päälle, starttasin ob:n, eikä siltikään keksiä synny. Ennen setcookiesia ei ole tulosteita, ellei sitten index.php:n html:ää lasketa, mitä epäilen suuresti.
Kokeilin myös sijoittaa setcookies-kutsun tiedoston toiselle riville (eli heti <?php:n jälkeen), mutta siltikään mitään ei synny.
Keksille pitäisi määrittää päivämäärä tulevaisuuteen.
Moi Burton!
jätä se path ja domain pois niin rulaa elikäs:
setcookie("kaurapala", $kayttajanimi, 0);
-Nea-
Merri kirjoitti:
Keksille pitäisi määrittää päivämäärä tulevaisuuteen.
php.net sanoo expire-parametrista näin:
https://www.php.net/manual/en/function.
If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).
Eli arvolla 0 olen yrittänyt luoda keksiä, joka vanhenee session päättyessä. Kokeilin varmuuden vuoksi arvolla time() + 3600, mutta se ei vaikuttanut lopputulokseen mitenkään.
neau33 kirjoitti:
jätä se path ja domain pois niin rulaa
Ja niinhän se rulasikin.
Kiitos, nea. Ja kiitos muillekin yrittämisestä. Mistä johtuu, ettei keksiä syntynyt pathin kanssa, mutta ilman kylläkin?
Heippa taas!
Burton kirjoitti:
Mistä johtuu, ettei keksiä syntynyt pathin kanssa, mutta ilman kylläkin?
Protokolla ei ole osa domainia. Domain voi olla vaikka www.esimerkki.fi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.