![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 170 Pomógł: 11 Dołączył: 2.03.2008 Skąd: Lublin Ostrzeżenie: (10%) ![]() ![]() |
Witajcie
![]() Zacząłem od dziś robić projekty za pomocą smarty i OOP w PHP. No i wszystko pięknie, zrobiłem sobie klasę służącą do komunikacji z bazą mysql, i przeszedłem do zrobienia obsługi formularza (rzecz jasna obiektowo). Jedyny szkopuł tkwi w tym że nie da się zagnieżdżać obiektów. Znaczy, nie tak jak sobie wyobrażałem. Kod include('db.php'); class registration { private $nick; private $pass; private $repass; private $mail; private $ip; public $errors = array(); private $db = new db; } To oczywiście nie zadziałało. Pytanie - jak zrobić żeby zadziałało? Googlałem pół dnia po polskich i angielskich stronach, ale zazwyczaj podawali kto robi błąd w myśleniu. Może i Wy mi tak pomożecie - nie wiem ![]() A więc proszę o pomoc. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Dzieje się tak dlatego, że takie przypisanie należy zrobić w konstruktorze.
Takie małe uwagi: - ja bym polecał stosować zamiast include -> require_once - jest konwencja, że nazwy klas piszemy z dużej literki, a dobrze się trzymać takich reguł. - proponuje pisać zawsze "()" przy tworzeniu obiektu, nawet jeśli nie wrzucamy nic do konstruktora - wg. mnie w konstruktorze klasy db powinieneś dawać dane dotyczące połączenia (host, user, pass), no chyba, żeby zrobić tak, że jak się nie podaje to defaultowo z jakiegoś configa leci ![]() -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 170 Pomógł: 11 Dołączył: 2.03.2008 Skąd: Lublin Ostrzeżenie: (10%) ![]() ![]() |
Przydatne porady. I jeszcze jest chyba konwencja że te wszystkie zmienne klasy (jak to sie nazywało... metody?) public $cos, dajemy pomiędzy $ a nazwą underscore'a?
No ale mniejsza. Teraz mam kolejny problem. To będzie wielki projekt - 3 językowy. Jak już wspomniałem wcześniej korzystam ze smarty. I przez to nie widzę błędów (chyba). Klasa DB jest na 100% poprawna Kod klasy Registration Kod <?php require_once('db.php'); class Registration { private $nick; private $pass; private $repass; private $mail; private $ip; public $errors = 0; private $db = null; public function __construct() { $this->db = new Db(); } public function check($login, $haslo, $rehaslo, $email, $ip) { $erra = array(); $err = 0; $this->nick = filter_var($login, FILTER_SANITIZE_STRING); $this->pass = filter_var($haslo, FILTER_SANITIZE_STRING); $this->repass = filter_var($rehaslo, FILTER_SANITIZE_STRING); $this->mail = filter_var($email, FILTER_SANITIZE_MAIL); $this->ip = $ip; if(strlen($this->login) < 5) { $err++; $erra[] = $lang["login_short"]."Llen"; } if(strlen($this->pass) < 5) { $err++; $erra[] = $lang["pass_short"]."pass len"; } if($db->rows("SELECT * FROM users WHERE nick = '$this->login'") > 0) { $err++; $erra[] = $lang["login_occupied"]; } if($this->pass != $this->repass) { $err++; $erra[] = $lang["pass_diffrent"]."Yo"; } if(!filter_var($this->mail, FILTER_VALIDATE_EMAIL)) { $err++; $erra[] = $lang["mail_wrong"]."Mail"; } else { if($db->rows("SELECT * FROM users WHERE mail = '$this->mail'") > 0) { $err++; $erra[] = $lang["mail_used"]; } } if(!filter_var($this->ip, FILTER_VALIDATE_IP)) { $err++; $erra[] = $lang["ip_wrong"]."IP"; } else { if($db->rows("SELECT * FROM users WHERE ip = '$this->ip'") > 0) { $err++; $erra[] = $lang["ip_used"]; } } if($err == 0) { return true; } else { $estr = ""; for($i=0; $i<$err; $i++) { $estr .= $erra[$i]."<br />"; } $this->errors = $estr; return $this->errors; } } } ?> I sposób jej wywołania: Kod if(isset($_POST['reg_s'])) { $reg = new Registration(); $ip = $_SERVER['REMOTE_ADDR']; $errors = $reg->check($_POST['reg_n'], $_POST['reg_p'], $_POST['reg_rep'], $_POST['reg_m'], $ip); $form_we = $errors.$form; $smarty -> assign('reg_cont', $form_we); } W klasie widać np $erra[] = $lang["coś"]."coś". Teraz w ogóle nic nie działa, nie wyświetla się. Tutaj jest to co robię. Język się wybiera i przypisuje się go do ciasteczka. Plik jest poprawnie zaincludowany... a jednak klasa później załadowana nie widzi tych zmiennych. Co zrobić? |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Masz to całkowicie źle zaprojektowane. Postaram Ci się wyjaśnić jak to powinno być napisane, potem może ktoś mądrzejszy ode mnie się wypowie.
Jak dla mnie, to powinieneś wrzucać obiekt Db do obiektu Registration. Można to zrobić oczywiście statycznie dla całej klasy.
Klasa Registration nie powinna filtrować danych! Od tego powinieneś mieć inną klasę (Valid) której wrzucasz tablice z wartościami ($_POST) następnie ustawiasz parametrami na podstawie których ma walidować, coś typu:
Registration powinien zaraz wywalać wyjątek jeśli jest user o danym emailu lub loginie. Języków używasz po stronie szablonów nie w kodzie PHP, tym bardziej w klasach! PS: Cytat I jeszcze jest chyba konwencja że te wszystkie zmienne klasy (jak to sie nazywało... metody?) public $cos, dajemy pomiędzy $ a nazwą underscore'a? Metody to są "funkcje klasy". "Zmienne" są nazywane właściwościami (ew. polami). To o czym mówisz stosuje się dla elementów o dostępie prywatnym.
@edit Aha, wg. mnie powinieneś mieć klasę Auth(), która odpowiada za rejestracje, logowanie itp. a nie tylko odpowiadającą za rejestracje. Poza tym wywal nazwę tabelek i pól z bazy do jakiegoś configa. Ten post edytował #luq 30.01.2010, 18:13:02 -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 170 Pomógł: 11 Dołączył: 2.03.2008 Skąd: Lublin Ostrzeżenie: (10%) ![]() ![]() |
Nie wiem czy można kilka razy wystawiać pomógł, ale Ty mi pomogłeś
![]() To mój 1 dzień i 1 spotkanie z obiektami, więc i tak nie jest tragicznie ![]() Tylko nadal nie rozumiem "wrzuć do configa". Mam plik config.php, który ładuje bazę danych, pliki językowe i smarty. Ale nie wiem o co ci konkretnie chodzi. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Cytat Tylko nadal nie rozumiem "wrzuć do configa". Mam plik config.php, który ładuje bazę danych, pliki językowe i smarty. Ale nie wiem o co ci konkretnie chodzi. Configi nie powinny nic ładować. W configach powinieneś mieć definiowane stałe i tylko tyle. Ja mam autorski silnik (taki mały framework) i u mnie klasa Auth() jest modułem i do niego mam config w którym znajdują się takie rzeczy jak: - opcje solenia haseł - nazwa tabelki gdzie są upchani userzy - nazwy kolumn (id, login, hasło, ranga) i tyle. Dzięki temu mam możliwość zmiany tylko tych stałych i struktury bazy bez edytowania jakiegokolwiek pliku z kodem. Ogólnie programowanie OOP to całkiem inne podejście do kodu. Ja polecam Ci książkę "PHP5 Zaawansowane Programowania" ![]() Cytat Nie wiem czy można kilka razy wystawiać pomógł, ale Ty mi pomogłeś Nigdy nie robiłem, i nie zamierzam robić czegoś dla plusów. Oczywiście miło go dostać ale nie o to tu chodzi ![]() -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 170 Pomógł: 11 Dołączył: 2.03.2008 Skąd: Lublin Ostrzeżenie: (10%) ![]() ![]() |
Ok, wielkie dzięki za pomoc. 80 zł chyba można poświęcić
![]() Jeszcze raz dzięki. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.07.2025 - 15:25 |