Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: rekisteröitymissivuongelma (php)

Sivun loppuun

Mikovits [13.11.2010 22:08:04]

#

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.

Macro [13.11.2010 22:38:21]

#

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(...);
}
?>
<form ...>
  <input type="text" name="nimi" value="<?php echo isset($_SESSION["nimi"]) ? $_SESSION["nimi"] : ""; ?>" />
</form>

Merri [14.11.2010 00:13:16]

#

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!)

Macro [14.11.2010 09:01:09]

#

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.

Mikovits [14.11.2010 20:55:08]

#

Kiitos tästä, hyvin toimii. Mutta mitenkäs valikot ja tekstialueet? Niitä tuo koodi ei osaa palauttaa.

-tossu- [14.11.2010 21:08:31]

#

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.

Metabolix [14.11.2010 21:10:16]

#

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. :)

Mikovits [14.11.2010 22:02:49]

#

Näin. Kiitos vastanneille.

Teuro [14.11.2010 22:31:59]

#

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();
}
?>

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta