• Ogłoszenie:

[php][mysql]tworzenie rejestracji plus logowanie

Poradniki związane z tworzeniem i prowadzeniem stron www.

[php][mysql]tworzenie rejestracji plus logowanie

Postprzez matx132 08 Sie 2010, 12:27

reklama
Witam,
W tym poradniku pokaże jak stworzyć prostą rejestrację oraz logowanie do niej.

Komentarze znajdą się poniżej każdego skryptu

A więc zacznijmy od napisania skryptów php

config.php
Kod: Zaznacz wszystko
$db=new mysqli("localhost","user","haslo","baza");
if(mysqli_connect_errno()!=0)
  {
    die("Chwilowy błąd proszę spróbować za chwilę,jeśli błąd się powtarza proszę skontaktować się z Administratorem strony");
   }


Komentarza do pliku config.php

Kod: Zaznacz wszystko
$db=new mysqli("localhost","user","haslo","baza");

Kod ten nie robi nic innego jak łączy się z bazą danych poprzez mysqli (jest to klasa do MYSQL) dostępny od PHP5


rejestracja.php
Kod: Zaznacz wszystko
<?php
include("config.php");
if(isset($_POST['login']) && isset($_POST['pass']) && isset($_POST['repass']) && isset($_POST['mail']) && isset($_POST['remail']))
{
  if($_POST['pass']==$_POST['repass'] && $_POST['mail']==$_POST['remail'] && is_email($_POST['mai']) && strlen($_POST['login'])>3  && strlen($_POST['login'])<30 )
    {
       $login=htmlspecialchars($_POST['login']);
       $pass=md5($_POST['pass'].$login);
       $mail=htmlspecialchars($_POST['mail']);
       if(!$db->query("SELECT id FROM users WHERE login='$login'")
        {
          $db->query("INSERT INTO users(id,login,pass,mail) VALUES ('','$login','$pass','$mail')")
          echo "Twoja rejestracja zakończyła się powodzeniem, możesz się już zalogować<br/><br/><br/>";
        }
      else
        echo "Przykro mi ale taki login jest już zajęty<br/><br/>";
    }
   else
    echo "Podane hasła lub e mail'e nie są takie same lub e-mail jest niepoprawny bądź login ma więcej niż 30 znaków lub ma mniej niż 3 znaki<br/><br/>";
  }
$db->close();
?>
<html>
<body>
Formularz Rejestracyjny:<br/>
<form action="" method="post">
Login(min 3 znaki, max 30 znaków):<br/>
<input type="text" name="login" /><br/>
Hasło:<br/>
<input type="password" name="pass" /><br/>
Powtórz hasło:<br/>
<input type="password" name="repass" /><br/>
E-Mail:<br/>
<input type="text" name="mail" /><br/>
Powtórz E-Mail:<br/>
<input type="text" name="remail" /><br/><br/>
<input type="submit" value="Rejestruj" />
</form>
</body>
</html>


Komentarze do rejestracja.php:
Formularza do rejestracji nie będę tłumaczył zajmę się tylko php,

Kod: Zaznacz wszystko
include("config.php");

Kod ten dodaje cofnig.php do aktualnego pliku



Kod: Zaznacz wszystko
if(isset($_POST['login']) && isset($_POST['pass']) && isset($_POST['repass']) && isset($_POST['mail']) && isset($_POST['remail']))

IF (a dokładniej funkcja isset() ) ten sprawdza czy istnieją takie zmienne (czyli czy formularz został wysłany), zmienną jest nawet pusty ciąg.



Kod: Zaznacz wszystko
if($_POST['pass']==$_POST['repass'] && $_POST['mail']==$_POST['remail'] && is_email($_POST['mai']) && strlen($_POST['login'])>2  && strlen($_POST['login'])<31 )

Dopiero ten IF sprawdza poprawność wprowadzonych danych, to jest sprawdza czy hasła są takie same oraz czy e maile są takie same
Następnie jest wywoływana funkcja (is_mail() ) która sprawdza poprawność maila, a na koniec sprawdzane jest czy login ma więcej znaków niż 2 i mniej niż 31 (czyli przedział od 3 do 30).



Kod: Zaznacz wszystko
$login=htmlspecialchars($_POST['login']);

Przypisanie danych z POST do zmiennej oraz zmiana specjalnych znaków (takich jak < > itp).



Kod: Zaznacz wszystko
$pass=md5($_POST['pass'].$login);

Zakodowanie hasła za pomocą funkcji md5 (hasło ma dodane tak zwane salt, w tym wypadku jest to login)



Kod: Zaznacz wszystko
if(!$db->query("SELECT id FROM users WHERE login='$login'")

Ten IF sprawdza czy nie istnieje taki login w bazie



Kod: Zaznacz wszystko
$db->query("INSERT INTO users(id,login,pass,mail) VALUES ('','$login','$pass','$mail')");

Dodanie wpisu do Bazy danych

Kod: Zaznacz wszystko
$db->close();

Zamyka połączenie z bazą


Teraz zajmiemy się plikiem login.php

login.php
Kod: Zaznacz wszystko
<?php
session_start();
include("config.php");
if(isset($_POST['login']) && isset($_POST['pass']))
{
       $login=htmlspecialchars($_POST['login']);
       $pass=md5($_POST['pass'].$login);
       if($db->query("SELECT id,login FROM users WHERE login='$login'")
        {
         while($row = $this->result->fetch_object())
          {
            $_SESSION['login']=$row->login;
           $_SESSION['id']=$row->id;
         }
       }
      else
        echo "Przykro mi ale taki login jest już zajęty<br/><br/>";
  }
$db->close();
?>
<html>
<body>
Formularz Logowania:<br/>
<form action="" method="post">
Login:<br/>
<input type="text" name="login" /><br/>
Hasło:<br/>
<input type="password" name="pass" /><br/>
<input type="submit" value="Loguj" />
</form>
</body>
</html>


Komentarz do pliku login.php

Napiszę tutaj tylko komentarz do tego co nie wystąpiło wcześniej

Kod: Zaznacz wszystko
session_start();

session_start jak sama nazwa mówi zaczyna sesję (nadaje unikalny kod dla sesji który jest zapisywany w katalog tmp (domyślnie)) stworzona sesja jest aktualnie pusta lecz dzięki temu możemy na niej operować, następne wywołanie tej komendy pozwoli podtrzymać aktualną sesję.
Funkcja ta musi być wywoływana na samym początku pliku (druga linijka, gdyż pierwsza to <? lub <?php)



Kod: Zaznacz wszystko
while($row = $this->result->fetch_object())

linijka ta pobiera dane z bazy poprzez mysqli a wynik zwraca w postaci obiekty (odwołujemy się do niego za pomocą ->)



Kod: Zaznacz wszystko
$_SESSION['login']=$row->login;
$_SESSION['id']=$row->id;

Zapisane sesji o nazwie login i id a w nich przechowywane jest login oraz id użytkownika.


Na końcu przedstawiam tabele users (polecenie do stworzenia tabeli)

Kod: Zaznacz wszystko
CREATE TABLE `users` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`login` VARCHAR( 31 ) NOT NULL ,
`pass` VARCHAR( 33 ) NOT NULL ,
`mail` VARCHAR( 200 ) NOT NULL
);



Pozdrawiam,
Matx132

Pochwały przyznane za posta: 6
matx132
~user
 
Posty: 21
Dołączenie: 08 Sie 2010, 11:23
Pochwały: 8



[php][mysql]tworzenie rejestracji plus logowanie

Postprzez eSpEY 16 Paź 2010, 00:30

Taka mała uwaga - dlaczego robisz to via moduł mysqli (który co prawda sprawia kod php przejrzystym ze względu że mysqli to struktura obiektowa) że nie współpracuje z php<5 i z mysql<4.1.x to wiadomo, ale nie jest on ładowany w standardowej konfiguracji Apache(win,linux) czy ngnix(linux). Kod dostosowany nawet do najstarszych wersji php byłby w poradnikach tym co w nim może być najlepsze - uniwersalność.

Druga sprawa (dot. kodu- a dokładnie optymalizacji)
login.php
Dlaczego stosujesz pętle while ? - jak przy rejestracji zabezpieczasz przed zdublowaniem loginu to wynik może być jeden... poza tym -używa się jej wtedy kiedy podany warunek nie musi być spełniony, lecz Ty tę sytuację wcześniej wyklucza Twoja instrukcja warunkowa.

Poza tym po namyśle - obiektowe czytanie sql przy skrypcie logowania jest zbędne a nawet nieoptymalizacyjne.
Awatar użytkownika
eSpEY
 
Posty: 1340
Dołączenie: 04 Lut 2007, 12:24
Miejscowość: Olsztyn
Pochwały: 111



[php][mysql]tworzenie rejestracji plus logowanie

Postprzez matx132 16 Lut 2011, 13:36

użycie mysqli jest dobre i tutaj użyłem aby pokazać także że jest mysqli i powinno się go używać lub PDO(chyba tak się pisało)

Jak pamiętam sprawdzałem skrypt i wszystko działało,.
Co do while jest to nawyk z mojej starej klasy do mysql jeszcze za czasów PHP4 a nie jak już jest PHP5 powoli przerzucam się na nowsze i lepsze rzeczy z PHP a także dokształcam się nowych rzeczy nie tylko w PHP ale także programowanie lunux/windows
matx132
~user
 
Posty: 21
Dołączenie: 08 Sie 2010, 11:23
Pochwały: 8



[php][mysql]tworzenie rejestracji plus logowanie

Postprzez Haczyk 16 Lut 2011, 21:32

1. is_main() to chyba nie jest standardowa funkcja php ? jeśli to funkcja własna to przydałby się jej kod.
2. fajny tutorial, ale zwróć uwagę na literówki np. "is_email($_POST['mai'])" lub piszesz raz "is_email()", później "is_mail()"
3. w if-ie sprawdzasz długość zmiennej login - wydaje mi się, że mogłeś w formularzu od razu wykorzystać atrybut size
4. kwestia techniczna - md5 jest niezalecanym hashem (pomimo dodania soli), zamiennej powinno się stosować hash z rodziny np. sha-1
5. w formularzu masz "<form action="" method="post">" - wiem, że domyślnie jest ten sam plik, ale chyba należałoby podać wartość dla action
6. zastanawia mnie czy bezpieczne jest zapisywanie id oraz loginu użytkownika do zmiennych sesyjnych? nie lepiej utworzyć jakąś odrębną zmienna po pozytywnym zalogowaniu np. $_SESSION['sesja']=sha1(date());$_SESSION['sesja'].=time();
7. co do bazy - pole id ma limitowaną wielkość - trochę przesada ;p jeśli już patrzymy na optymalizację bazy - pole login ma długość 31 - skoro w if-ie jest warunek, że zmienna login nie może mieć więcej niż 30 znaków (więc można pole login ustawić na varchar(29)). Dlaczego pole "pass" na długość 33 - umieszczasz tam md5, wiec powinno być varchar(32). Poza tym z tego co pamiętam - najlepszym rozwiązaniem byłoby tutaj dać pole char32 (jest trochę szybsze od varchar), ale to już całkiem inny temat.
Awatar użytkownika
Haczyk
~user
 
Posty: 797
Dołączenie: 21 Sty 2006, 16:11
Miejscowość: Drzewica/Bydgoszcz
Pochwały: 62




Powróć do Tworzenie stron www

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość