Tein kirjautumislomakkeen, joka tarkistaa tietokannasta, että kirjautuminen on oikein. Laitoin lomakkeen ja tarkistuksen samalle sivulle. (Siellä on myös rekisteröintipainike).
Nyt jos käyttäjätunnus ja salasana ovat väärin, haluan pysyä samalla kirjautumislomakkeella ja sivulla. Jos taas ne ovat oikein, haluan jatkaa matkaa seuraavalle sivulle.
Miten tämä homma toteutetaan formsien kanssa? Siis siirtyminen seuraavalle sivulle automaattisesti ilman, että tarvitsee painaa mitään painiketta?
Tsekkaa ajv:n koodivinkki aiheesta
Ihan hieno koodivinkki, mutta minulle riittäisi vähän yksinkertaisempi.
Itse tekisin sen niin, että uudelleenohjaisin käyttäjän toiselle sivulle header-funktiolla. Tietenkin on tarkistettava, että käyttäjällä on oikeudet sivun lukemiseen. Tuo taas onnistuu selvittämällä onko evästeet/istunnot olemassa esim. isset-funktiolla...
eija kirjoitti:
Tein kirjautumislomakkeen, joka tarkistaa tietokannasta, että kirjautuminen on oikein. Laitoin lomakkeen ja tarkistuksen samalle sivulle. (Siellä on myös rekisteröintipainike).
Nyt jos käyttäjätunnus ja salasana ovat väärin, haluan pysyä samalla kirjautumislomakkeella ja sivulla. Jos taas ne ovat oikein, haluan jatkaa matkaa seuraavalle sivulle.
Miten tämä homma toteutetaan formsien kanssa? Siis siirtyminen seuraavalle sivulle automaattisesti ilman, että tarvitsee painaa mitään painiketta?
Laitat alkuun tarkistusosan, joka tallettaa muuttujaan $ok true, mikäli kirjautuminen ok, ja siirryt eteenpäin näin:
if($ok) {
header("Location: http://osoite_jonne_matkataan");
die;
}
Perään sitten lomakkeen tulostus, johon mennään, jos ei ollut ok.
Huomaa, että ennen header-funktiota ei saa tulostaa yhtään mitään. Se tarkoittaa, että sitä ennen voi olla vain php:tä, joka ei tulosta mitään. HTML:ää ei saa olla, ei edes HTML-tagia. Eikä edes tyhjiä rivejä ennen kuin php alkaa.
Käytännössä ohjelmasi normaalisti kyllä toimii, vaikka et noudattaisi tuota ohjetta, mutta noudata sitä.
Niin tai sitten heittää ob_startin sivunalkuun, niin silloin voi tulostaa myös ennen headeria...
Siihen ei oikeastaan ole mitään syytä normaalisti.
Tuo header("Location: .... on tosi hyvä apufunktio. Sillä tosiaan voi valita minne mennä seuraavaksi.
Ongelmana on vain se, että kun määrittelen lomakkeella tuon $ok:n, se toimii oikein lomakkeen lopussa, mutta on tyhjä sitten lomakkeen alussa. Ei toimi mikään global $ok tai static...Yritin määritellä sen vielä lomakkeen hidden kentällä, mutta arvo tuli php osiosta ja muuttui taas lomakkeelle tultaessa. Onko tähän jotain yksinkertaista ratkaisua? (En ymmärrä vielä mitään monimutkaista)
Alla oleva pätkä on oikeastaan hieman runsaammilla kommenteilla ryydetty ajv:n vinkki, joskaan tässä ei ole mitään millä tunnistaa käyttäjää / vastaavaa. Idea tulisi selvitä tällä aika helpolla.
Muuttujien siivouksen voisi hoitaa omassa funktiosssaan, kuten myös salasanan muuntaminen kryptisemmäksi, jolloin tarvittaeessa voidaan muuttaa koko salasanan muunnos helpommin.
<?php /* Alustetaan muuttuja $ok false arvolla Virhestä tulee hiukan pienempi, jos jatkossa mokataan */ $ok = false; /** * Tarkistetaan onko muuttujissa $_POST['tunnus'] ja $_POST['salasana'] * sopivat arvot. Samalla eskapoidaan vaaralliset merkit vaarattomiksi */ if(isset($_POST['tunnus'])){ $tunnus = mysql_real_escape_string(trim($_POST['tunnus'])); $salasana = mysql_real_escape_string(trim($_POST['salasana'])); /* Tarkistetaan, että molempien kenttien pituus > 0 */ if(strlen($tunnus) > 0 && strlen($salasana) > 0){ /* Muunnetaan salasana md5 funktiolla hieman kryptisemmäksi */ $salasana = md5($salasana); /* Haetaan kannasta tiedot ylläolevilla tiedoilla */ $kysely = " SELECT tunnus, oikeus FROM kayttajat WHERE tunnus = '$tunnus' AND salasana = '$salasana'"; $tiedot = mysql_query($kysely); if(mysql_num_rows($tiedot) === 1){ /* Sijoitetaan $kayttajataulukkoon saadut tiedot */ $kayttaja = mysql_fetch_array($tiedot); $ok = true; } }else{ /* Tarkasti ottaen $ok on edelleen false */ $ok = false; } if($ok === true){ header("Location: http://www.osoite.com/ok.php"); }else{ /* Ilmoita vaikkapa virheellisestä tunnuksesta / salasanasta */ } }
Kiitos! Tuolla tavalla minä sen suurinpiirtein sitten tein, paitsi nuo kryptaukset jätän tulevaan ajankohtaan, kuhan osaan ensin nämä php:n perusteet.
Aihe on jo aika vanha, joten et voi enää vastata siihen.