Autor Zpráva
Roland Němec
Profil
Zdravím,
dalo by se říct, že v programování webu jsem poměrně začátečník ( koneckonců posuďte sami: Odkaz na mé stránky :) )
Zajímalo by mě, jak udělat registrační systém v php. A tak aby se návštěvník mohl ihned po registraci přihlásit... A poté například upravovat kalendář apod...

Máte s tímto někdo osobní zkušenosti?

Za každou odpověď děkuji.
Roland Němec
Hando
Profil
Ahoj.
Zkušenosti s tím bude mít mnoho lidí, ale otázkou je, zda ti někdo takhle obecně poradí. :) Na lidi to bude působit tak, že chceš, aby ti to někdo napsal. :)

Záleží na tom, co umíš či co jsi ochoten se kvůli tomu naučit. Pokud to bereš jako studium programování a neřešíš moc čas a výsledek, tak proč ne... Jestli na to spěcháš a chceš, aby to fungovalo, asi bych na tvém místě sáhl po hotovém řešení ve formě třeba nějaké knihovny. Musíš si umět poradit jak s PHP, tak s databází.
Jinak jednoduché přihlašování není nic extra složitého, mám za to, že i tady v FAQ se válí nějaký odkaz. :)
Roland Němec
Profil
Hando:
Zdravím,
já to dělám proto, že mě prostě baví se učit ( a bohužel jsem momentálně nedostal příležitost jít na střední školu teleinformatiky :D , protože je mi 13= 8 třída...) a upřímně moc nechci sahat po hotových formách, protože bych to chtěl umět :D . Díky moc za odezvu, pohledám :) ...
serverteam.sk
Profil
Rolande, Chápu že se to chceš naučit sám , jsem na tom totiž věkově stejně jsem v 9. tride a učím se programování protože nechci na středni vypadat jako idiot že nic neumim a hlasim se na IT. V této situaci je možná nejlepší stáhnout hotový kód a studovat co tam je, proč to tak je, a co to tam dělá. Později si zkoušet vytvářet vlastní malé scripty třeba jen na přihlášení bez toho aby ses díval do oneho ukázkového souboru. Vytvořit neohrabaný kód registrace bych ti mohl pomoct vytvořit ale s dodatečným upravováním účtu do databáze ti moc neporadím jelikož v tom taky nejsem zběhlý.
Hando
Profil
Ahoj.

Kluci, já vás plně chápu a klobouk dolů, že k tomu přistupujete takhle. :) Nicméně, registrační/přihlašovací systém, pokud má fungovat spolehlivě, tak už chce nějaké drobné zkušenosti, které začínající programátor nemá a neúmyslně tak přehlídne spoustu věcí, které by měl řešit. Ve finále to vede k tomu, že ten svůj kód musí každou chvíli, když se něco nového doučí, upravovat (a vzniká tak další prostor pro chyby).
serverteam.sk radí dobře - podívat se na nějaký už hotový systém a z něj se pokusit pobrat, co se v něm v jakém kroku děje. Pokud nemáš s programováním zkušenosti, tak tě bude limitovat to, že spoustu takových systémů je psáno objektově. Takže opět doporučím podívat se třeba na systém zde v FAQ - Nejčastější potíže s PHP (FAQ) » Registrace uživatelů
Je vhodné umět si to třeba nakreslit ve formě UML diagramu jak z pohledu uživatele, tak z pohledu běhu programu. I to si myslím, že ti chvíli zabere a několikrát to předěláš. :) Ale v tu chvíli už si celkem ujasníš, co to obnáší.

Pokud (resp. než) se do toho pustíš, tak se podívej, jak se pracuje s databází - bacha, na netu je spoustu tutoriálů, které používají zastaralé php funkce mysql_*, rovnou se uč používat mysqli_*, nebo PDO. S tím souvisí návrh databáze, podívej se, jak systémy řeší ukládání dat - netuším, co o databázích víš, takže předpokládám, že minimum. Zjisti si, jaké jsou datové typy (abys třeba neměl tendence ukládat datum do databáze ve formátu "12.10.2016", delší čísla jako řetězce apod.). Měl by ses také dozvědět, že existuje něco jako auto-increment, unique index atd. Sice bude chvíli trvat, než to vstřebáš, ale ušetří ti to překvapení v budoucnu. :)
Musíš umět data uložit - při registraci - takže ošetřovat vstupy (hledej např. sql-injection), vypsat (ošetřovat výstupy), upravovat atd.
Taky budeš potřebovat zvládnout práci se session.
Nějaké věci najdeš ve zdejší učebnici PHP, práci s mysql se věnuje starší tutorial na linuxsoftu, případně novější na itnetwork.cz.

Je vhodné to zkoušet na localhostu, protože když takový systém budeš testovat na ostrém serveru, tak se můžou najít nenechavci, co si budou hrát na hackery. :)
Roland Němec
Profil
Hando:
Díky moc za rady, na itnetwork jsem se už díval. A omlouvám se, ale měl bych ještě jeden "dotaz". Zkoušel jsem si udělat registraci a login v PHP podle jednoho videa na youtube ( ještě předtím, než jsem četl tvou odpověď). Vždycky když to chcu otestovat, tak mi vyjede syntax error, unexpected 'mysqli_select_db' (T_STRING). Nevíš co s tím? Zkusím tu nějak přiložit zdrojovku, jestli bys ses na ní nemohl podívat :D .

Config.php
<?php
mysqli_connect("localhost", "root","")
mysqli_select_db ("tut")
?> 

Register.php
<?php
require('Config.php');
 
if (isset($_POST['submit']))
{
 $email1 = $_POST['email1'];
 $email2 = $_POST['email2'];
 $pass1 = $_POST['pass1'];
 $pass2 = $_POST['pass2'];
 
 if($email1 == $email2 && $pass1 == $pass2)
 {
   //All good
   $name = mysqli_escape_string($_POST['name']);
   $lname = mysqli_escape_string($_POST['lname']);
   $uname = mysqli_escape_string($_POST['uname']);
   $email1 = mysqli_escape_string($_POST['email1']);
   $email2 = mysqli_escape_string($_POST['email2']);
   $pass1 = mysqli_escape_string($_POST['pass1']);
   $pass2 = mysqli_escape_string($_POST['pass2']);
 
   $pass1 = md5($pass1);
   //Check if username is taken
   $check = mysqli_query("SELECT * FROM users WHERE uname = '$uname'")or die(mysqli_error());
   if (mysqli_num_rows($check)>=1) echo "Username already taken";
   //Put everyting in DB
   else{
   mysqli_query("INSERT INTO `users` (`id`, `name`, `lname`, `uname`, `email`, `pass`) VALUES (NULL, '$name', '$lname', '$uname', '$email1', '$pass1')") or die(mysql_error());
   echo "Registration Successful";
   }
 }
 else{
  echo "Sorry, your email's or your passwords do not match. <br />";
 }
 
 
 
 
}
else{
$form = <<<EOT
<form action="register.php" method="POST">
First Name: <input type="text" name="name" /><br />
Last Name: <input type="text" name="lname" /><br />
Username: <input type="text" name="uname" /><br />
Email: <input type="text" name="email1" /><br />
Confirm Email: <input type="text" name="email2" /><br />
Password: <input type="password" name="pass1" /><br />
Confirm Password: <input type="password" name="pass2" /><br />
<input type="submit" value="Register" name="submit" />
</form>
EOT;
 
echo $form;
 
}
 
?>
Login.php
<?php
require('Config.php');
 
if(isset($_POST['submit']))
{
 $uname = mysqli_escape_string($_POST['uname']);
 $pass = mysqli_escape_string($_POST['pass']);
 $pass = md5($pass);
 
 $check = mysql_query("SELECT * FROM `users` WHERE `uname` = '$uname' AND `pass` = '$pass'");
 if(mysqli_num_rows($check) >= 1){
  echo "You are now logged in!";
  exit();
 }
 else{
 
  echo "Wrong password";
 }
}
else{
 
 $form = <<<EOT
 <form action="login.php" method="POST">
 Username: <input type="text" name="uname"><br>
 Password: <input type="password" name="pass"><br>
 <input type="submit" name="submit" value="Log in">
 
EOT;
 
echo $form;
}
?>

Dělal jsem to přesně podle:www.youtube.com/watch?v=yp_gH3zPfbo

Jestli ses podíval, tak díky :) . Už tu potom nebudu otravovat, a radši se to začnu učit úplně od začátku ( to PHP)...
serverteam.sk
Profil
myslim že na konci radku 2 ti chybi ";" takže řádek bude vypadat : mysqli_connect("localhost", "root","");
Pro blizsi specifikaci skus napsat cely error v erroru to pise radek a soubor kde je chyba a bez toho ti moc nepomužu jelikož nevim na co se zaměřit
připadne přilož odkaz na stranku kde to testuješ
+ mam divnej pocit že muj 1 php kod jsem delal podle podobneho videa
Keeehi
Profil
Roland Němec:
$pass1 = md5($pass1);
Tohle až skoro fyzicky bolí. Používej prosím funkce password_hash a password_verify.
S tím také souvisí, že pass1 a pass2 nemusíš escapovat. Pass2 se v sql dotazu vůbec nevyskytuje a pass1 hashuješ.
Hando
Profil
Ahoj.
Jednu zásadní věc jsem ti opomenul doporučit - a to nějaké IDE se zvýrazňováním syntaxe.
Díky tomu bys věděl, kde jsou chyby. Jednu ti zmínil již serverteam.sk, nicméně ti chybí středníky u obou funkcí.
Config.php
<?php
mysqli_connect("localhost", "root","");
mysqli_select_db ("tut");
?>
Pokud soubor končí php kódem a neobsahuje nějaký html kód na konci, nechává se zpravidla bez ukončovacího tagu "?>".
V souboru "Register.php":
používáš funkci mysqli_escape_string(), což je funkce podobná mysqli_real_escape_string(), která je opatrnější v práci s multibyte symboly (ta ovšem vyžaduje zadání připojení z mysqli_connect(), pokud programuješ procedurálně a ne objektově). Já ji nikdy nepoužíval, tak nechci radit, jestli je to příčinou problémů v našich končinách. :)
Když používáš funkce mysqli_query, tak jim musíš předat připojení $link, což nikde neděláš. Viz dokumentace na stránkách php:
mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )

md5() se už dnes důrazně nedoporučuje, existují totiž tabulky, pomocí kterých se dá získat řetězec, který bude mít stejný otisk hesla.

mysqli_query(
$odkaz na připojení,"INSERT INTO `users` (`id`, `name`, `lname`, `uname`, `email`, `pass`) VALUES (NULL, '$name', '$lname', '$uname', '$email1', '$pass1')") or die(mysqli_error($odkaz na připojení));

else{
 $form = <<<EOT
 <form action="login.php" method="POST">
 Username: <input type="text" name="uname"><br>
 Password: <input type="password" name="pass"><br>
 <input type="submit" name="submit" value="Log in">
 
EOT;
 
echo $form;
}
lépe:
else{
 ?> // ukončíme interpretaci php a vypíšeme html (IDE lépe zvýrazní syntaxi a odhalí chyby v html)
 <form action="login.php" method="POST">
 Username: <input type="text" name="uname"><br>
 Password: <input type="password" name="pass"><br>
 <input type="submit" name="submit" value="Log in">
 <?php // znovu nastartujeme php a pokračujeme v běhu programu
}

V dalším souboru to samé... Video jsem jen tak proklikal. Je to staré video a ten přístup je divný... Se sessions vůbec nepracují, touhle cestou bych se neubíral.
První výsledek hledání:
Přihlašování - tutorial - koukni na to a zkus si to zprovoznit a postupně můžeš vylepšovat. :)
Klidně se ozvi, třeba někdo poradí lépe... :)
Keeehi
Profil
Hando:
md5() se už dnes důrazně nedoporučuje, existují totiž tabulky, pomocí kterých se dá získat řetězec, který bude mít stejný otisk hesla
Nejenom ty. md5 je velmi rychlá funkce. Proto je dnes reálné při útoku hrubou silou lámat 8-9 znaková hesla. Při slovníkovém útoku zase dovoluje zkoušet velmi rychle velké množství kombinací slov.

Proto se dnes používají hashovací funkce, které jsou právě velmi náročné na výpočet, právě aby se nedalo zkoušet velmi rychle velké množství kombinací. Jedna z nich je třeba bcrypt, kterou momentálně interně používají funkce z rodiny password_*. Jen tak mimochodem, získáš tím zdarma i solení, které přidává další úroveň bezpečnosti.
Roland Němec
Profil
Všichni:
Zdravím,
zkoušel jsem to upravovat podle různých videí a tak... Ale mohli byste se mně kouknout na toto:
<?php
$con=mysqli_connect("localhost","root","");
mysqli_select_db($con,"reg");
if (isset($_POST['sumbit']))
    
{
  $name= $_POST['name'];
  $phone= $_POST['phone'];
   $date=$_POST['date'];
   $q=mysqli_query($con,"insert into rem(name,phone,date)values('$name','$phone','$date')");
 
 if ($q)
{
    echo "registration sucessfuly";
    }
 
 else 
     {
     echo "registration not allow";
    }
    }





?>
<!DOCTYPE html>
<html>
<head>
</head>
 <body>
 <form action="" method="post">
 Enter name<input type="text" name="name"/><br><br>
 Enter phone<input type="phone" name="phone"/><br><br>
 Enter date<input type="date" name="date"/><br><br>
 <input type="sumbit" value="sumbit"/><br>
</form> 
 
 
 </body>
 </html>

Všechno by to nejspíš fungovalo, ale nefunguje sumbit, místo něj se zobrazuje další pole k vyplnění...
Co s tím? :)
Keeehi
Profil
Roland Němec:
Všechno by to nejspíš fungovalo, ale nefunguje sumbit, místo něj se zobrazuje další pole k vyplnění.
Protože správně to je submit.

Jinak tvůj kód obsahuje zranitelnost SQL injections. Správně
$q=mysqli_query($con,"insert into rem(name,phone,date)values('".mysqli_real_escape_string($con, $name)."','".mysqli_real_escape_string($con, $phone)."','".mysqli_real_escape_string($con, $date)."')");
 
Roland Němec
Profil
Aha :D , tak díky!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: