Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Problem z klasą resjestracji
Forum PHP.pl > Forum > PHP > Object-oriented programming
dzesi
Witam mam mały dość problemik otóż całe 1,5 roku pisze w php ale proceduralnie , php oop znam w teori ale czas nauczyć sie pisać aplikacje już w całosci obiektowe i tutaj jest problem bo w praktyce nie zabardzo mi to wychodzi worriedsmiley.gif .W javie [j2se] pisze już 5miesiecy i z oop i pisaniem programów nie mam problemu ,tylko w php sam nie wiem dla czego , może dla tego z jave od poczatku uczy programowania w oop, bo inaczej nie da sie programowac w tym języku , może macie jakieś rady ?.Wiem programowania webowego nie mozna porównywac do programowania apliakcji użytkowych
Co robie zle ?
  1. <?php
  2.  
  3. class Rejestracja
  4. {
  5. public $login;
  6. private $haslo;
  7. private $haslotwo;
  8.  
  9. function __construct()
  10. {
  11.  include_once('config_database.php');
  12. //odbieranie danych
  13.  $login=$_POST['login'];
  14.  $haslo=$_POST['haslo'];
  15. $haslotwo=$_POST['haslotwo'];
  16. }
  17.  
  18. private function polaczenie()
  19. {
  20. $polaczenie=mysql_connect(connect,user,password)or die('connect_error'.mysql_error());
  21. mysql_select_db(database)or die('database_error'.mysql_error());
  22. }
  23. private function spraw_user()
  24. {
  25. polaczenie();
  26. $zapytanielog= "SELECT * FROM user WHERE login='$login'";
  27. $sprawdzlog= mysql_query($zapytanielog)or die(mysql_error());
  28. $numrows=mysql_num_rows($sprawdzlog);
  29. if($numrows > 0)
  30. {
  31.  echo "Podany login już istnieje";
  32.  exit;
  33. }
  34. if($haslo!=$haslotwo)
  35. {
  36.  echo "Hasło jest błedne";
  37.  exit;
  38. }
  39. }
  40. private function rej_user()
  41. {
  42. sprw_user();
  43. $zapisrej="INSERT INTO user(`login`,`haslo`)VALUES('$login','$haslo')";
  44. $touser=mysql_query($zapisrej);
  45. if($touser)
  46. {
  47.  echo "Użytkownik dodany";
  48. }
  49. else
  50. {
  51.  echo "Użytkownik nie dodany!";
  52. }
  53. }
  54. }
  55. $start=new Rejestracja();
  56. //$start->sprawdz_user();
  57. // czy może wywoływać je w konstruktorze ?, czy lepiej jako obiekty bo w php mam ztym problem 
  58.  
  59.  
  60. ?>

A Prosze sobie darować złosliwe dogadywanie i gadki fizoloficzne party.gif
nospor
Cytat
Co robie zle
Nie opisujesz problemu.
Dales dluuugi wstep, ktory nic nam nie mowi na temat Twojego problemu. Co nas obchodzi ile piszesz proceduralnie a ile w oop? No pomysl. CZy nam ta wiedza jest potrzebna? Nam potrzebny jest opis Twojego problemu z jakim sie borykasz. A ty pokazales kod i zadowolony z siebie... Napisz z czym jest problem. Napisz co sie dzieje a nie powinno lub co sie nie dzieje a powinno. Znacznie ulatwi to szukanie bledu.

Oczywiscie moglbym przejrzec kod i pewnie bym cos znalazl, ale poco mam sie wczytywac, skoro od razu z opisu (ktory moze wkoncu podasz) bedzie wiadomo co moze byc nie tak.

Cytat
A Prosze sobie darować złosliwe dogadywanie i gadki fizoloficzne
No niestety, ale w tym topicu trzeba bylo troche pofilozofowac
skowron-line
Ja nie bede sie madrował bo sam słabo znam OOP ale to co moge wytknąć to
Kod
   function __construct()
{
include_once('config_database.php');
//odbieranie danych
$login=$_POST['login'];
$haslo=$_POST['haslo'];
$haslotwo=$_POST['haslotwo'];
}
powinno byc raczej tak
  1. <?php
  2. public function __construct($login,$haslo,$haslotwo){
  3. $this->login = $login;
  4. $this->haslo = $haslo;
  5. $this->haslotwo = $haslotwo;
  6. // i zadnych tablic globalnych 
  7. // i plik zainkluduj przed wywolaniem klasy a w konstruktorze utworz obiekt (chyba, nich ktos to sprostuje)
  8. }
  9. ?>

Kod
private function polaczenie()
{
$polaczenie=mysql_connect(connect,user,password)or die('connect_error'.mysql_error());
mysql_select_db(database)or die('database_error'.mysql_error());
}

co to sa stale?? jesli tak to dla wyroznienia zrob je DUZYMI LITERAMI

Kod
private function spraw_user()
{
    polaczenie();
$zapytanielog= "SELECT * FROM user WHERE login='$login'";
$sprawdzlog= mysql_query($zapytanielog)or die(mysql_error());
$numrows=mysql_num_rows($sprawdzlog);
if($numrows > 0)
{
   echo "Podany login już istnieje";
   exit;
}
if($haslo!=$haslotwo)
{
   echo "Hasło jest błedne";
   exit;
}
}


zadnych echo w klasie return i potem wywalasz na ekran no i nie odwoluj sie do metody polaczenie (i tak zle to zrobiles) dopiero jak sobie utworzysz nowy obiekt tej klasy to wywolasz metode cos jakso tak
  1. <?php
  2. $obj = new Rejestracja();
  3. $obj->polaczenie();
  4. $obj->sprawdzenie_czy_jak_to_sie_nazywa();
  5. ?>

Kod
private function rej_user()
{
    sprw_user();
$zapisrej="INSERT INTO user(`login`,`haslo`)VALUES('$login','$haslo')";
$touser=mysql_query($zapisrej);
if($touser)
{
   echo "Użytkownik dodany";
}
else
{
   echo "Użytkownik nie dodany!";
  exit;
}
}
}

tu po co sprawdzasz ifem daj sobie return mysql_query($zapisrej) i dopiero po utworzeniu obiektu sprawdz co zwrocil i wal komunikat
  1. <?php
  2. if(obj->rej_user() == true) echo'dodany';
  3. ?>


i to tyle co chcialem napisac jakas dobra duszyczka mogla by to zweryfikowac bo sam z checia sie dowiem gdzie blednie rozumuje
nevt
Generalny błąd:
Kod
     function __construct()
{
  include_once('config_database.php');
//odbieranie danych
  $login=$_POST['login'];
  $haslo=$_POST['haslo'];
$haslotwo=$_POST['haslotwo'];
}


W PHP z wnętrza klasy (dowolna metoda) odwołujesz się do jej właściwości przez przez wskazanie $this->...
czyli nie:
Kod
$login=$_POST['login'];

ale

$this->login=$_POST['login'];


i tak samo we wszystkich innych miejscach...

pozdrawiam.
dzesi
No i panowie nadal nic nawet nie pokazuje komunikatów żadnych , nie dodaje nowego usera do bazy itd ,jak by ktoś mógł pokazać jak to prawidłowo powinno być zrobione .A ktos może też dać jakieś linki do jakiś stron które by mi pomogły w pisaniu obiektowo
Bo powiem szczerze ze oop w c++i java problemów nie mam ale w php mam ciągle sadsmiley02.gif worriedsmiley.gif
  1. <?php
  2.  
  3. class Rejestracja
  4. {
  5. public $login;
  6. public $haslo;
  7. public $haslotwo;
  8.  
  9. function __construct($login,$haslo,$haslotwo)
  10. {
  11.  include_once('config_database.php');
  12. //odbieranie danych
  13.  $this-> login = $login=$_POST['login'];
  14.  $this-> haslo= $haslo=$_POST['haslo'];
  15. $this-> haslotwo=$haslotwo=$_POST['haslotwo'];
  16. }
  17.  
  18. public function polaczenie()
  19. {
  20. $polaczenie=mysql_connect(connect,user,password)or die('connect_error'.mysql_error());
  21. mysql_select_db(database)or die('database_error'.mysql_error());
  22. }
  23. public function spraw_user()
  24. {
  25. $zapytanielog= "SELECT * FROM user WHERE login='$login'";
  26. $sprawdzlog= mysql_query($zapytanielog)or die(mysql_error());
  27. $numrows=mysql_num_rows($sprawdzlog);
  28. if($numrows > 0)
  29. {
  30. return "Podany login już istnieje";
  31.  exit;
  32. }
  33. if($haslo!=$haslotwo)
  34. {
  35.  return "Hasło jest błedne";
  36.  exit;
  37. }
  38. }
  39. public function rej_user()
  40. {
  41.  
  42. $zapisrej="INSERT INTO user(`login`,`haslo`)VALUES('$login','$haslo')";
  43. $touser=mysql_query($zapisrej);
  44. if($touser)
  45. {
  46. return "Użytkownik dodany";
  47. }
  48. else
  49. {
  50.  return "Użytkownik nie dodany!";
  51. }
  52. }
  53. }
  54. $start=new Rejestracja(login,haslo,haslotwo);
  55. $start->polaczenie();
  56. $start->spraw_user();
  57. $start->rej_user()
  58. ?>
skowron-line
jezeli robisz return to musisz dac echo
czyli
  1. <?php
  2. echo $start->rej_user()
  3. ?>

a druga sprawa jest taka ze nieuwaznie czytales co ci napisalem
Kod
$start=new Rejestracja(login,haslo,haslotwo);

miales zrobic tak
  1. <?php
  2. }
  3. $start=new Rejestracja($_POST[login],$_POST[haslo],$_POST[haslotwo]);
  4. ?>


ciezko uwierzyc ze znasz sie na OOP w jakim kolwiek jezyku skoro nawet nie potrafisz zbudowac i uzyc funkcji
marcio
skoro robisz to na klasach to po co mieszasz funckje strukturalne i te obiektowe np zasmiat mysql_query($zap);
rob $db->query($zap);
Cysiaczek
Popieram to co wyżej koledzy napisali. To nie jest OOP - to zwykły kod strukturalny ujęty w klasie.
Np. nie wiem, dlaczego używasz exit() w metodzie (pominę fakt, że się i tak nie wykona, bo wcześniej jest return) - tego się po prostu nie uzywa się wyjątków i to użytkownik kodu powinien przejąć odpowiedzialność za to, co zrobi z otrzymanym błędem.
Poprawienie ten mechanizm powinien wyglądać mniej więcej tak:

  1. <?php
  2. //defincja tej klasy
  3. class{}
  4.  
  5. //i teraz
  6.  
  7. $User=new User($login,$haslo,$haslotwo);
  8. $Registration=new Rejestracja();
  9. // $Registration->polaczenie(); //NIE
  10.  $db->connect(); //powiedzmy tak uprościmy
  11.  $Registration->useConnection($db) // i przekażemy obiekt bazy do obiektu Rejestracja
  12. //$Registration->spraw_user(); // co to znaczy spraw? Co mam sprawić? NIE
  13. if($Registration->isAlreadyRegistered($User))
  14. {
  15. $errorString=$Registration->getErrorString();
  16. die("$error");
  17. }
  18. else
  19. {
  20. //$start->rej_user() // znów dziwna konstrukcja z nazwą bez znaczenia (wyjątkiem sa nazwy dowcipne tongue.gif )
  21. $Registration->registerUser();
  22. //albo
  23. $Registration->registerUser($User);
  24. }
  25. ?>


Pokazany kod, to użytkownik klasy, a właściwie 3 klas. DB, User i Registration


Dobra książka powinna pomóc.

Pozdrawiam.
dzesi
Jakoś w javie nie mam problemów z oop.Jedynie w php , może to dla tego ze dopiero zaczynam programować obiektowo w tym języku :)ale nie rozumiem tego
$start=new Rejestracja($_POST[login],$_POST[haslo],$_POST[haslotwo]); ? co to niby daje ?
Cysiaczek
@dzesi - Proszę Cię - zweryfikuj swoje umiejętności dotyczące programowania obiektowego. Jeśli nie wiesz, co daje Ci taki kod, to nie wiesz też, czym jest hermetyzacja. Otóż konstrukcja o którą pytasz powoduje, że obiekt Registration jest uniezależniony od danych wejściowych. Wisi mu, czy są to POST, GET, SESSION, COOKIE, czy jeszcze inne (np. z innych obiektów). Po prostu dostaje dane i robi swoje.
Te mechanizmy są identyczne w Javie i w php, więc problem masz raczej ze składnią samego języka niż z OOP. Obiektowość jest niezależna od języka - gdybyś umiał pisać obiektowo w Javie, to w php robiłbyś to bez najmniejszego problemu.

Pozdrawiam.
korbog
wogóle ta klasa jest bez sensu


powinieneś zrobić osobne klasy dla mysql dla user i wtedy

dajesz w pliku np register.php


// register.php

  1. <?php
  2.  
  3.  
  4.  // tu sa dane do bazyz mienne przechowujace dane takie jak haslo nazwa bazy uzytko
    wnika dajemy jako global
  5. include('config');
  6.  
  7. // klase $sql dajemy w klasie user jako global
  8. $sql = new sql();
  9. $user = new user();
  10.  
  11. if($_POST['haslo1'] == $_POST['haslo2'])
  12. {
  13. $login = $_POST['login'];
  14. $haslo = $_POST['haslo1'];
  15.  
  16. if($user -> register($login,$haslo))
  17. {
  18. echo 'zarejestrowany';
  19.  }
  20.  else
  21. {
  22. echo 'blad';
  23.  }
  24. else
  25. {
  26.  echo 'blad';
  27. }
  28. ?>



tak bym to widział
zastosuj sie do tego piszac klase users pzdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.