» »

[php] if ($_POST['submit'])

[php] if ($_POST['submit'])

DuleKrtola ::

Po tem tutorialu sem naredil user registration skripto:
<?php
echo "<h1>Register</h1>";

$submit = $_POST['submit'];

//form data
$fullname = strip_tags($_POST['fullname']);
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
$repeatpassword = strip_tags($_POST['repeatpassword']);
$date = date("Y-m-d");
if ($submit)
{
	if($username&&$password&&$repeatpassword&&$fullname)
	{
		if ($password==$repeatpassword)
		{
			if (strlen($username)>25||strlen($fullname)>25)
				echo "username or fullname too long";
			else
			{
				if (strlen($password)>25||strlen($password)<6)
					echo "6 - password - 25 MUST BE!";
				else
				{
					//encrypt
					$password = md5($password);
					$repeatpassword = md5($repeatpassword);
					//register
					$connct = mysql_connect("","","");
					mysql_select_db("boniphp");
					
					$queryreg = mysql_query("
					INSERT INTO users VALUES ('','$fullname','$username','$password','$date');
					");
					
					die("Succes!, <a href='index.php'>Log in</a>");
				}
			
			}
		}
		else
			echo "Passwords dont match";
		
	}
	else
		echo "Fill all fields";
}
?>
<html>
<p>
<?php echo $submit; ?>
<form action='register.php' method='POST'>
	
// input fields ...

<input type='submit' name='submit' value='Register'>
</form>

</html>


 1

1


 2

2


Na prvi sliki je form, če ga korektno izpolnim in submitam, se v bazi ustvari nov user, brower prikaže drugo sliko. Če nato 5x refrešam sajt, se bo v bazi ustvarilo še 5 userjev z enakimi inputi. Kako to preprečit?
Ni mi preveč jasen tale $_POST['submit']. Tisti if stavek naj bi bil true, ko klikneš gumb register. Ampak v spremenljivko $_POST['submit'] se že ob nalaganju forma naloži value, tko da, tudi če ne kliknem na gumb, velja $_POST['submit']='register'.

steev ::

Ko klikneš gumb register pošlješ podatke (user, pass) iz forme v ta php fajl, ki jih naprej obdela.
:|

bluefish ::

Kako to preprečit?
Finta je, da ob uspešni registraciji uporabnika preusmeriš na isto stran za izpis Success. Če nato to stran refreshas, se submit ponavlja. Naredi tako, da te bo ob uspešni registraciji preusmerilo na novo stran ali pa direktno na prijavo.
Lahko bi sicer delal tudi z AJAX-om.

No, morda bo kdo z nekaj več izkušnjami imel kako boljšo idejo.

Gost ::

Za začetek je v redu, če uporabiš header() preusmeritev na stran z obvestilom o uspešni registraciji. Pazi, da za header(...) daš še exit(), da se skripta od tam naprej ne izvaja več.

$_POST['submit'] ima vrednost "register" vsakič, ko pošiljaš podatke iz te forme.

Ko boš pa nadgrajeval svojo skripto oz. jo uporabil v kaki aplikaciji, pa boš moral poskrbeti še za kaj več:
- preverjanje obstoječih vnosov v bazi (da ne bo enak email pri dveh uporabnikih)
- pozabljena gesla
- pošiljanje obvestila o uspešni registraciji na mail
- preprečiti sql injection

Čimprej začni uporabljati OOP. V naslednjem koraku se boš srečal pa s frameworki, ki imajo olajšane take zadeve.

Zgodovina sprememb…

  • spremenil: Gost ()

bluefish ::

Takole sem zadevo nekaj časa nazaj naredil jaz. Ni sicer perfektna, vendar za začetek kar OK.

<?php
	session_start();
	
	if(!get_magic_quotes_gpc())
	{
		$username = strval(mysql_escape_string($_POST['username']));
		$password = strval(mysql_escape_string($_POST['password']));
	}
	else
	{
		$username = strval($_POST['username']);
		$password = strval($_POST['password']);
	}
	
	require_once("data.php");
	
	$errors = array();
	$validation = false;
	
	mysql_pconnect($host, $user, $password) or die("Failed to connect!");
	mysql_select_db($database) or die("Failed to select!");
	
	if($username == '')
	{
		$errors[] = "Username missing!";
		$validation = true;
	}
	
	if($password == '')
	{
		$errors[] = "Password missing!";
		$validation = true;
	}
	
	if($username != '')
	{
		$sql = "SELECT * FROM users WHERE username = '$username'";
		$result = mysql_query($sql);
		if($result)
		{
			if(mysql_num_rows($result) > 0)
			{
				$errors[] = "Username already in use!";
				$validation = true;
			}
			@mysql_free_result($result);
		}
		else
		{
			die("Query failed!");
		}
	}
	
	if($validation)
	{
		$_SESSION['ERRORS'] = $errors;
		session_write_close();
		header("location: register.php");
		exit();
	}
	
	$sql = "INSERT INTO users(username, password) VALUES('$username', '".sha1($_POST['password'])."')";
	$result = @mysql_query($sql);
	
	if($result)
	{
		header("location: login.php");
		exit();
	}
	else
	{
		die("Query failed!");
	}
?>

Zgodovina sprememb…

  • spremenil: bluefish ()

DuleKrtola ::

Sem kr pozabu na tole temo, heh. Sem že sam pršu do rešitve in naredu še kr neki drugih zadev, mislm da bo dost za dns :)
Tnx za odgovore