Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] błąd w klasie
Lejto
post
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

Ostrzeżenie: (0%)
-----


Mam taki fragment index.php
  1. include("config.php");
  2. include("libs/db.class.php");
  3. $db = new DB();
  4. include("libs/core.class.php");
  5. $c = new core($db);
  6. include("function.inc.php");
  7. $f = new functions();

wszystko chodzi
wchodzę na stronę gdzie rejestruje usera
połączenie z bazą jest wywołuje funkcje sprawdzającą
  1. global $db;
  2. global $page;
  3. global $f;
  4.  
  5. include("libs/user.class.php");
  6. $u = new User($db);
  7.  
  8. $user = $u->getByUsername($_POST['username']);

połączenie z bazą w tym pliku jest ale nie ma już jego w klasie user.class.php jak juz wcześniej wymieniłem plik code.class.php (tam wszystko działa)
user.class.php
  1. class User
  2. {
  3. public $uid;
  4. public $fields = array();
  5.  
  6. public function __construct($sql)
  7. {
  8. $this->sql = $sql;
  9. $this->uid = null;
  10. $this->fields = array('username' => '',
  11. 'password' => '',
  12. 'emailAddr' => '',
  13. 'isActive' => false);
  14. }
  15. public static function getByUsername($username)
  16. {
  17. echo 'aa';
  18. $db = $this->sql;
  19. echo 'aa';
  20. $sql = $db->query('select * from users where username = $username');
  21.  
  22. }

db.class.php
  1. class DB{
  2.  
  3. public $_lacz;
  4.  
  5. public function __construct()
  6. {
  7. $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  8. if(mysqli_connect_errno() != 0)
  9. {
  10. echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error(). ', przepraszamy.';
  11. }
  12. }

dlaczego nie mam połączenie w klasie user?
reszta klas działa normalnie
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


To może najpierw kilka uwag:

#2: Klasa 'User' dziedziczy po 'functions' (może jakaś konsekwencja w nazewnictwie?) co wydaje mi się nieco dziwne. W jaki sposób użytkownik jest rozszerzeniem funkjci?
#4,5: Dlaczego te pola są publiczne? Przecież z tego co widzę stworzyłeś dla nich magiczne gettery/settery.
#6: SQL to skrót odnoszący się do języka zapytań, a z tego co widzę to używasz tego jako referencji do czegoś co pełni rolę API do komunikacji z bazą... niepotrzebne nieporozumienia się rodzą w takiej sytuacji
#11,12: Dlaczego nie ustawisz sobie wartości domyślnych odrazu w momencie deklarowania składowych klasy?
#35: Jak do tej pory ta klasa wygląda na taką, która ma reprezentować użytkownika... a tu nagle wyskakuje jakaś metoda do walidacji nazwy użytkownika. Powinieneś wydzielić te (i podobne) metody do innego obiektu będącego walidatorem dla użytkownika używanym podczas rejestracji. Poza tym kod tej metody jest bez sensu... najpierw sprawdzasz czy długość nazwy jest mniejsza od 3-ech. Jeśli tak to wyświetlasz komunikat (co już jest błędem, bo obiekt niepotrzebnie bierze na swoje barki dodatkową kwestię jaką jest prezentowanie treści użytkownikowi). Jeżeli nazwa jest dłuższa lub równa podanym 3-em znakom to metoda kończy działanie zwracając TRUE. To po jakie licho jest jeszcze później ten drugi warunek? Przecież jeżeli nazwa jest krótsza od tych 3-ech znaków to już nie będzie dłuższa niż 20, a sytuacja gdy nazwa jest dłuższa niż 2 znaki po czym następuje sprawdzenie czy aby przypadkiem nie jest dłuższa niż 20 znaków nie może nigdy zajść...
#58: Tutaj znów obiekt reprezentujący użytkownika pełni rolę kolekcji użytkowników... pobieranie użytkowników wydziel do osobnego obiektu odpowiedzialnego za to konkretne zadanie (tj. reprezentację kolekcji i operacji na niej)
#60: W jakim celu każdorazowo robisz: $db = $this->sql? Po co ta dodatkowa referencja?
#76: Zauważyłeś, że ta metoda robi dokładnie to co wcześniejsza tylko różni się drobnym fragmentem wykorzystywanego zapytania? Google: DRY. Innymi słowy: wydziel sobie jakąś prywatną metodę pobierającą użytkowników i z poziomu getById, getByUsername zwracaj jej wynik (jako argument przekazując coś w stylu:
"id = 3" lub "username = 'abc'"
#103: Nie widzę żadnej filtracji danych przed wprowadzeniem ich do treści zapytania. Co więcej te zapytania nie mają prawa działać - w ich treści masz:
...username = abc my username...
Przeczytaj w dokumentacji jak w MySQL (bo chyba z tego korzystasz) reprezentuje się tekst - podobnie jak w kodzie PHP podpowiem.
#124: Poczytaj o różnicy pomiędzy: "blah blah $variable blah blah", a 'blah blah $variable blah blah'

Cytat
rejestruje ale nie sprawdza czy nazwa użytkownika się powtarza

1) Nie pokazujesz jak używasz obiektu tej klasy
2) Nie widzę też w tym kodzie niczego co by mogło sprawdzać unkalność nazwy użytkownika...
Go to the top of the page
+Quote Post

Posty w temacie
- Lejto   [php] błąd w klasie   4.01.2010, 20:45:02
- - darko   Gdzie masz pole $sql w klasie User ?   4.01.2010, 20:47:10
- - Lejto   jak pole $sql? w core.class mam [PHP] pobier...   4.01.2010, 20:50:48
- - darko   Nie zauważyłem że public static function getByUser...   4.01.2010, 20:53:03
- - skowron-line   [PHP] pobierz, plaintext public [url="htt...   4.01.2010, 20:55:12
- - darko   Jak usuniesz static, to dodaj jeszcze w klasie Use...   4.01.2010, 20:58:05
- - Lejto   usunąłem ale nadal nie chce wykonać zapytania va...   4.01.2010, 21:00:21
- - darko   a dodałeś to pole protected $sql; ?   4.01.2010, 21:01:15
- - Lejto   jakie protected? mam normalną prywatność dla tego...   5.01.2010, 09:08:05
- - darko   Metoda getByUsername nie operuje na polu userId   5.01.2010, 10:48:06
- - Lejto   ale mam to w __get no to jest mam to poprawić?   5.01.2010, 15:34:45
- - darko   Wypełnij pola klasy User analogicznie, jak w metod...   5.01.2010, 15:53:00
- - Lejto   nie za bardzo cię rozumiem, poprawiłem klase, reje...   5.01.2010, 17:18:56
- - Crozin   To może najpierw kilka uwag: #2: Klasa 'User...   5.01.2010, 17:51:34
- - Lejto   dziedziczę jeszcze jeszcze functions bo jest tam f...   5.01.2010, 22:25:27
- - Crozin   Cytatdziedziczę jeszcze jeszcze functions bo jest ...   5.01.2010, 23:40:26
- - Lejto   ok dzięki ale powiedź jeszcze dlaczego nie chce ...   6.01.2010, 18:15:24
- - Crozin   Wyświetl sobie błędy zapytań MySQL...   6.01.2010, 18:32:55
- - Lejto   nie wpadł bym na to problem rozwiązany, błąd był ...   6.01.2010, 20:36:23


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 23:53