Teen rekisteröitymissivua, joka tarkistaa, onko pakollisiin kenttiin laitettu tietoa. Jos on, käyttäjä tallennetaan tietokantaan (muiden tarkistusten jälkeen), ja jos ei ole, näytetään virheilmoitus ja palataan rekisteröitymissivulle.
Ongelma on se, että kun pakollisia kenttiä on tyhjinä, palautus sivulle toimii hyvin, mutta tyhjää kaikki kentät. Miten pääsisin takaisin rekisteröitymiseen niin, että kenttiin kirjoitetut tiedot pysyisivät tallella? Tarkistus sijaitsee tällä hetkellä samassa php-sivussa kuin rekisteröityminenkin.
Sijoita tiedot vaikka sessioneihin, ja tulosta input fieldin value-attribuuttiin sessionin sisältö.
<?php session_start(); if(virhe) { $_SESSION["nimi"] = $_POST["nimi"]; } else { mysql_query(...); } ?>
Macro: muista htmlspecialchars().
Toisekseen voisin suositella jotain muuta kuin $_SESSIONin käyttöä, koska sitä ei tarvita tässä. Sekoittaa vaan pakkaa turhaan imo.
Tässä vähän kehittyneempi tapa, tosin lähinnä vain idearunko.
<?php // lue POST-arvo merkkijonona, hyväksyy myös arrayn function get_POST($field) { if( isset($_POST[$field]) ) { if( !is_array($_POST[$field]) ) { return get_magic_quotes_gpc ? stripslashes($_POST[$field]) : $_POST[$field]; } else { $posts = array(); foreach($_POST[$field] AS $post) { $posts[] = get_magic_quotes_gpc ? stripslashes($post) : $post; } return $posts; } } else { return FALSE; } } // lue nimi ja salasana muuttujiinsa if( $nimi = get_POST('nimi') && $salasana = get_POST('salasana') ) { // $nimi ja $salasana on nyt täydennetty // tässä on muut varmistukset, jos kaikki ookoo niin sitten ei tulosteta normaalia lomaketta // muutoin jatketaan tämän koko if-lausekkeen jälkeiseen koodiin ja voidaan täydentää esim. $virhe-array } else { // $nimi ja/tai $salasana on FALSE // tässä ei välttämättä tarvitse olla mitään } // muotoile $nimi valmiiksi tulostusta varten ennen kuin sivun tulostus alkaa $nimi = $nimi !== FALSE ? htmlspecialchars($nimi) : ''; // salasanaa ei koskaan välitetä turvallisuussyistä lomakkeeseen asti, muutenkin se on hyvä tyhjentää kun sitä ei enää tarvita unset($salasana); // sivun tulostus alkaa ?> ... <input type="text" name="nimi" value="<?php echo $nimi ?>" /> <input type="password" name="salasana" value="" /> ...
Tässä on tehty selkeä erittely eri asioiden välillä:
- lomakearvojen luku
- annettujen tietojen oikeellisuuden varmistus mikäli tietoja on annettu
- tulostettavien muuttujien esikäsittely tulostusta varten
- sivun tulostus
Tämä on tärkeä asia huomioida, sillä eri asioiden selkeä erottelu toisistaan tekee myös helpommaksi antaa koodin edetä eri polkuja pitkin haluttuun tavoitteeseen.
(Mod. huom: oikeat kooditagit!)
Merri kirjoitti:
Toisekseen voisin suositella jotain muuta kuin $_SESSIONin käyttöä, koska sitä ei tarvita tässä.
Mikovits kirjoitti:
Tarkistus sijaitsee tällä hetkellä samassa php-sivussa kuin rekisteröityminenkin.
Kappas, no ei niitä sessioneja sitten tarvitakkaan jos se on samalla sivulla. Empäs huomannut tuota kohtaa.
Kiitos tästä, hyvin toimii. Mutta mitenkäs valikot ja tekstialueet? Niitä tuo koodi ei osaa palauttaa.
Mikovits kirjoitti:
Kiitos tästä, hyvin toimii. Mutta mitenkäs valikot ja tekstialueet? Niitä tuo koodi ei osaa palauttaa.
Textarea toimii muuten samalla tavalla kuin yksirivinenkin tekstikenttä, mutta oletusteksti laitetaan textarea-tagien väliin.
<textarea name="tekstiloota"><?php echo htmlspecialchars ($tekstiloota); ?></textarea>
Selectissä pitää valittuun optioniin laittaa attribuutti selected.
<select name="valikko"> <option value="v1"<?php echo ($valikko == "v1")?' selected="selected"':''; ?>>valinta 1</option> <option value="v2"<?php echo ($valikko == "v2")?' selected="selected"':''; ?>>valinta 2</option> </select>
Mikäli valintoja on monta, kannattaa ne tulostaa silmukassa.
Valikossa pitää tulostaa oikeaan option-tagiin selected="selected"
, ja textarean kohdalla sisältö pitää laittaa tagien väliin:
<select name="vali"> <option value="">Valitse jotain!</option> <option value="abc" <?php if ($vali == "abc") echo 'selected="selected"'; ?>>ABC</option> <option value="def" <?php if ($vali == "def") echo 'selected="selected"'; ?>>DEF</option> </select> <textarea name="teksti" rows="10" cols="40"><?php echo htmlspecialchars($teksti); ?></textarea>
Edit: Tulipa harvinaisen samanlainen viesti. :)
Näin. Kiitos vastanneille.
Tai sitten ota käyttöön näppärä lomakeluokka. Säilyttää automaattisesti nuo kenttien arvot ja siirtää lomakkeen piirtämisen pois muusta sivusta.
<?php require_once("luokat/lomake.php"); try { $kirjaudu = new Clomake(NULL, "lomake_testi.php"); $kentat = Array(); $sp = Array(); $har = Array(); $sp[] = new CmultipleElement("mies", 0); $sp[] = new CmultipleElement("nainen", 1); $har[] = new CmultipleElement("futis", 0); $har[] = new CmultipleElement("lätkä", 1); $har[] = new CmultipleElement("koris", 2); $kentat[] = new Cinfo("rekisteröidy"); $kentat[] = new Ctext("tunnus", true, ""); $kentat[] = new Cpassword("salasana", ""); $kentat[] = new Cpassword("uudestaan", ""); $kentat[] = new Cradio("sukupuoli", $sp, "Valitse sukupuolesi", 0); $kentat[] = new Cselect("harrastukset", $har); $kirjaudu->lisaaElementit($kentat); echo $kirjaudu->anna_lomake(); } catch (Exception $e) { echo $e->getMessage(); } ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.