Siis osaisiko joku auttaa kun minulla on tuossa tarkistus koodissa jotakin vikaa:
<?php $nimi = $_POST[nimi]; $salasana = ($_POST[salasana]); $salasan2 = md5($salasana); $tunnukset = fopen("loki.txt", "r"); for ($i = 0; $i++) { $tiedot = explode("|", $tunnukset[$i], 3); $nimi = $tiedot[0]; $email = $tiedot[1]; $salasana1 = $tiedot[2]; } if ($nimi == $nimi1 AND $salasana2 == $salasana1) { session_start(); $_SESSION["nimi"] = $nimi; $_SESSION["salasana"] = $salasana2; echo "Tunnukset oikein!!!"; echo '<a href="member.php">Sisälle!</a>'; } else { session_start(); unset($_SESSION["nimi"]); unset($_SESSION["salasana"]); echo "Tunnukset ovat väärin."; echo '<br><a href="login.php">Takaisin</a>'; } fcloce($tunnukset); ?>
Saan aina tulokseksi "Tunnukset ovat väärin" paitsi jos jätän kentät tyhjäksi.
EDIT
Huomasin tuossa for silmukassa on jotain häikkää mutta mitä, vai pitäisikö siinä käyttää jotain muuta?
näyttäisi siltä, että nyt "tarkistat" vain viimeisen tunnuksen tiedostossa. Eli siirräpä if -tarkistus for -loopin sisälle.
Lisäksi for -lauseessa taitaa olla jonkin sortin bugi (takaraja asettamatta).
for ($i=0;$i<count($tunnukset);$i++) {...}
Joo nyt se löysi oikeat tunnukset, mutta siihen sivulle tulee
Fatal error: Call to undefined function: fcloce() in /mbnet/r/rspkrs/salaus/cookie.php on line 36
Olisko fclose() :)
Ja äkkiä katottuna on tuossa kyllä kaikenlaista pientä häikkää muutenkin. Ettet olisi sekoittanut nyt fopenia file()-funktioon.
Oho... No kyllähän toita sattuu.
Mutta vielä olisi kysyttävää tuon rekistöröitymis jutusta.
<?php $loki = fopen("loki.txt", "a");//loki tiedosto //haetaan lomakkeelta... $nimi = $_POST["nimi"];//nimi $email = $_POST["email"];//sähköposti osoite $salasana1 = $_POST["salasana1"];//salasana $salasana2 = $_POST["salasana2"];//salasanan tarkistus //tarkistetaan täsmäävätkö salasanat if ($salasana1 == $salasana2) { $salasana = md5($salasana1); } //jos nimi puuttuu näytetään rekistöröitymis lomake elseif (empty($nimi)) { header("Location: rekistoroidy_lomake.php"); exit; } //jos email puuttuu näytetään rekistöröitymis lomake elseif (empty($email)) { header("Loaction: rekistoroidy_lomake.php"); exit; } //jos salasanat eivät täsmää näytetään kirjautumis lomake else { header("Location: rekistoroidy_lomake.php"); exit; } $rivi = "$nimi|$email|$salasana\n";//rivi joka kirjoitetaan lokiin fwrite($loki, $rivi);//kirjoitetaan lokiin fclose($loki);//suljetaan loki $kayttaja_tiedot = "Nimi:$nimi\nEmail:$email\nSalasana:$salasana"; mail("rspkrs@mbnet.fi", "Käyttäjä tiedot", $kayttaja_tiedot); header("Location: kiitos.php"); ?>
Tuo jostain syystä tallentaa tiedot vaikka kaikki kentät olisivat tyhjiä. Osaisko joku vastata tähän ongelmaan?
EDIT
Huomasin tuossa että tuo salasanojen vertailu piti siirtää loppuun. Mutta miten saisi lisättyä sen että ylös tulisi, että "et täyttänyt kaikkia kenttiä"?
Osapuilleen niin, että laitat ensin
<?php if(empty($email) || empty($nimi)) { echo "Et täyttänyt kaikkia kenttiä."; #Tulostalomake(); } else if($salasana1 != $salasana2) { echo "Salasanat eivät täsmää."; #Tulostalomake(); } else { #OK } ?>
Ja jos ei kaikki täytetty/salasanat täsmää, muista laittaa email ja nimi-kenttään valueksi syötetty arvo. Etköhän pärjää näillä. En todellakaan käyttänyt tähän koodiin paljoa aikaa :P
Joo nyt sain tuon toimimaan täytyi kyllä tehdä enemmän tuollaisia muutoksia mitä Juice kirjoitti.
EDIT
Mitenkä saisin näkyviin lomakkeelle jos kaikkia tietoja ei ole laitettu, tulisi teksti jossa kerrottaisiin että et kirjoittanut kaikkia tietoja
Voisko tuon tehdä tälläi...
<?php echo $virhe; ?> jotain koodia... <?php if (empty($nimi)) { $virhe = "Et laittanut nimeä!"; exit; } ?>
Eli muuttajan $virhe arvoksi tulisi, Et laittanut nimeä!, jos nimeä ei ole laitettu.
Mutta eikös tuon täydy olla toisin päin, ja minkä takia tuota ei voi suorittaa kerralla? Eli vaikka näin:
Niin voi olla. Mutta eikös ollu niin että ennen headerii ei saa olla tulostettuna mitään.
Sivun alkuun ob_start() ja loppuun ob_end_flush() ja avot. Ja tuossa squidin esimerkissä käyttäjä ei koskaan näe virheilmoitusta, sillä selain ohjataan välittömästi uudelle sivulle. Tuohon on vaihtoehtoisia toteutustapoja miljoona, mutta voit esimerkiksi kentän tulostuksen yhteydessä tarkistaa onko kyseisen kentän kohdalla tullut virheellinen syöte ja sitten tulostaa mahdollisen virheilmoituksen.
Oho... joo tohon täytyy laittaa parin sekunnin odotus aika :)
Sain tuon toimimaan "joten kuten", mutta en toivotulla tavalla.
http://koti.mbnet.fi/rspkrs/salaus/login.php
Tuossa olisi muuten koko hoito
Mitenkä tuota täytyisi muuttaa:
for ($i = 0;$i < count($kayttajat); $i++) { $tiedot = explode("|", $kayttajat[$i], 3); $nimi2 = $tiedot[0]; $email = $tiedot[1]; $salasana2 = $tiedot[2]; session_start();//aloitetaan sessionit //tarkistetaan sessioneilla onko käyttjä jo kirjautunut $_SESSION["nimi"] = $nimi; $_SESSION["salasana"] = $salasana; if ($nimi == $nimi2 AND $salasana == $salasana2)//käyttäjä pääsee sisälle { echo "Olet kirjautunut sisään"; //tähen tulee salattu sivu alue }
Tuossa kerran on se vikana että jos arvot ovat tyhjät niin pääsee sisalle.
tarkista jossain välissä että onko annetut syötteet tyhjiä vai ei.
Joo tuli itelki mielee vast vähä aikasit. :$
juha127 kirjoitti:
Tuossa kerran on se vikana että jos arvot ovat tyhjät niin pääsee sisalle.
Pääset sinne sisälle oli arvo sitten mikä tahansa, niiden ei tarvitse olla tyhjiäkään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.