Napisane: 22.05.2012, 06:52:17 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
|
Forum: Przedszkole · Podgląd postu: #964604 · Odpowiedzi: 9 · Wyświetleń: 500 |
Napisane: 2.12.2011, 11:33:03 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Zgadzam się z LSM, że myślenie 'na przyszłość' jest zgubne, ale pod warunkiem, że rozważasz rozwiązania, które przypuszczasz, że kiedyś, może zostaną zaimplementowane. Wtedy nie implementujesz setek wzorców itp. tylko po to, żeby można było zrobić z tym wszystko, co ci się żywnie podoba, tyle, że w przyszłości, implementując rzeczy, których możesz nigdy nie implementować, ponieważ twoje przewidywania były błędne. Co do rozwiązania Crozina, to nie jest ono 'nad wyrost', robienie czegoś poprawnie, nie jest wprowadzaniem nadmiernej elastyczności. Co do klasy Damian, to: Z wikipedii: Cytat W programowaniu obiektowym klasa jest częściową lub całkowitą definicją dla obiektów. Definicja obejmuje dopuszczalny stan obiektów oraz ich zachowania. i mamy dalej: Cytat Klasa nie jest samodzielnym bytem, lecz szablonem do tworzenia nowych obiektów określonego typu i posiadających określone zachowanie.[...]Poszczególne instancje klasy posiadają ten sam zbiór zachowań i atrybutów, lecz różnią się przechowywanymi w nich wartościami.[...] Czyli klasa definiuje atrybuty i zachowanie obiektów, ale dopiero przy ich tworzeniu określamy ich stan. Rozumiem, że klasa Damian dziedziczyłaby po klasie Człowiek tyle, że ustawiałaby jakieś domyślne wartości, tak? No to się to trochę kłóci z powyższymi. Programowanie obiektowe zostało wymyślone w celu jak najdokładniejszego odwzorowania rzeczywistości. Załóżmy więc, że Damian to model. W takim wypadku, czym są jego instancje? Damian1, Damian2 itp.? Nawet jeżeli każdy Damian jest rudy, sympatyczny i nieprzeciętnie inteligenty, to czy oznacza to, że mamy do czynienia z nowym człowiekiem? Wątpię Jeżeli już koniecznie chcesz robić coś takiego, to możesz stworzyć jakąś fabrykę, która zwraca ci obiekt klasy Człowiek z odpowiednimi ustawieniami (czyli umiejętnościami, imieniem, IQ i wszystkim innym, co tylko chcesz). Takie samo rozwiązanie zastosowałbym do przykładu, który przedstawił Orzeszekk (z klasą AvatarUploader). Tutaj też rozwiązaniem byłaby fabryka. Bo tworzenie dziedziczenia tylko i wyłącznie po to, żeby klasy od razu miały ustawiony szereg odpowiednich wartości jest bez sensu i nie jest poprawne, nie ważne czy uczy tego Duńczyk, Holender, Polak, czy wiesz to z tutoriali. Bo w takim wypadku dojdziesz do skrajności, gdzie dla każdego zestawu danych będziesz miał osobny obiekt? Dziedziczenie powinno rozszerzać funkcjonalność i wtedy ma ono sens. Jeżeli służy tylko do ustawiania wartości, 'bo taki zestaw danych jest często używany' tzn. że mamy do czynienia z błędnym rozumieniem dziedziczenia. A co do pytania głównego, to tutaj pisałem trochę na temat tego, kiedy interfejs a kiedy klasa abstrakcyjne. W Twoim wypadku, uwzględniając tylko te informacje, które przekazałeś i nic więcej (bez przypuszczeń), to interfejs jest Ci nie potrzebny, wszystko ląduje w klasie abstrakcyjnej. |
Forum: Object-oriented programming · Podgląd postu: #918996 · Odpowiedzi: 23 · Wyświetleń: 1 743 |
Napisane: 25.09.2011, 00:06:04 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
|
Forum: Przedszkole · Podgląd postu: #901423 · Odpowiedzi: 4 · Wyświetleń: 372 |
Napisane: 22.09.2011, 21:54:02 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
|
Forum: Przedszkole · Podgląd postu: #900977 · Odpowiedzi: 1 · Wyświetleń: 311 |
Napisane: 22.09.2011, 10:30:43 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Najlepiej to pogrupować te funkcje jakoś logicznie, zrobić z tego klasy, każdą klasę umieścić w osobnym pliku, w odpalanym skrypcie dołączyć klasę/funkcję do autoloadingu zarejestrować ją przy użyciu spl_autoload_register i wtedy to, co będziesz potrzebował będzie wczytywane w locie:) |
Forum: Przedszkole · Podgląd postu: #900747 · Odpowiedzi: 2 · Wyświetleń: 381 |
Napisane: 21.09.2011, 10:08:12 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Kod klasy jest taki jak powyżej i wywołujesz tylko te dwie metody, nic więcej? Może chodzi ci o to, że metoda $cache->cacheSaveData(array('d')); zwraca null, co jest prawdą, bo ona nic nie zwraca (brak return w metodzie), a 'object' jest wyświetlany, bo wywołujesz gettype(). Innego pomysłu nie mam. |
Forum: Przedszkole · Podgląd postu: #900425 · Odpowiedzi: 4 · Wyświetleń: 415 |
Napisane: 21.09.2011, 09:32:33 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Chcę zrobić kreator misji tzn. piszę opis sytuacji i daje kilka opcji do wyboru. Po wypostowaniu tego musi się to znaleźć w tablicy. Następnie klikam na jedną z opcji którą wcześniej dodałem i znów piszę ospis sytuacji i dodaje kilka opcji itd.. Czyli rozumiem, że robisz coś takiego (muszę sobie to łopatologicznie przedstawić dla lepszego zrozumienia:): - tworzę misję UratujMisia, dodaję opis: 'Pomóż Ani uratować misia z rąk złej, brzydkiej czarownicy'. I dodaję opcje: SzukajMisiaWZamku, SzukajWLochach, SzukajWPokojuAni - następnie biorę opcję SzukajMisiaWZamku, dodaję opis: 'Przeszukaj cały zamek, wszystkie komnaty i wypytaj ludzi, czy nie widzieli misia'. Dodaję opcje: SzukajWKomnacieKrólewskiej, SzukajWJadalni etc. i oczywiście te kroki powtarzamy zagłębiając się jeszcze głębiej. O to chodzi? Jak nie, to rzuć przykładem, jeżeli tak, to twoim rozwiązaniem jest: Composite lub po polsku. |
Forum: PHP · Podgląd postu: #900417 · Odpowiedzi: 16 · Wyświetleń: 1 101 |
Napisane: 18.09.2011, 21:22:10 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Metoda getRequest() powinna zwracać obiekt klasy Request, która zawiera informacje nt. aktualnego requestu, czyli jej budowa może wyglądać mniej więcej tak:
Oczywiście to tylko sugestia, bo można spokojnie to rozbudować. Dodatkowo pozostaje decyzja, czy parametry są przekazywane, czy sam obiekt dobiera się do nich z tablic globalnych. To samo tyczy się nazw akcji i kontrolera. Czy pobierać je wewnątrz obiektu klasy, czy może przekazywać. Jeżeli chcesz to wszystko ustawiać to raczej proponowałbym takie dane przekazywać w konstruktorze, a nie za pomocą seterów, ponieważ logika podpowiada, że po utworzeniu obiektu klasy request raczej nie powinien się zmienić. Temat można rozwinąć, jeżeli zakładasz również obsługę kodu z linii poleceń. W takim wypadku doradzałbym wyciągnięcie klasy bazowej (abstrakcyjnej) wyżej i stworzenie Request_HTTP i Request_CLI lub coś w tym stylu. |
Forum: PHP · Podgląd postu: #899853 · Odpowiedzi: 3 · Wyświetleń: 518 |
Napisane: 17.09.2011, 22:54:14 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Tym, jaka akcja dla danego kontrolera powinna zostać wykonana zajmuje się front controller. Jeżeli nie ma żądanego kontrolera lub brakuje akcji dla danego kontrolera, to powinien (front controller) w tym miejscu zwrócić wyjątek. Coś w tym stylu, załóżmy, że metoda uruchamiająca odpowiednią akcję nazywa się run:
A kod kontrollera wygląda np. tak:
Radzę zastosować zamiast takich urli: www.site.com/index.php?module=user&action=shownotactive&other=1_2 coś takiego: www.site.com/user/shownotactive?other=1_2 wygląda o wiele ładniej. Wartość parametru other powinna być dostępna z obiektu Request, a nie przekazywana jako parametr metody akcji. |
Forum: PHP · Podgląd postu: #899689 · Odpowiedzi: 3 · Wyświetleń: 518 |
Napisane: 8.09.2011, 22:29:24 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Tak na pierwszy rzut oka to ok. Usunąłbym jednak te constant value. Po co ci one? I tak z bazą łączysz się raz. Już prędzej wykorzystałbym to do przechowywania soli. A następny krok to OOP:) |
Forum: PHP · Podgląd postu: #897511 · Odpowiedzi: 19 · Wyświetleń: 1 011 |
Napisane: 7.09.2011, 19:00:12 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Sorry, z tą solą to trochę pokręciłem. Tak to jest jak się robi dziesięć rzeczy na raz:P Sól to jest unikalny string (zazwyczaj). Może on być zahardcodowany w pliku lub zapisany w bazie. Dzięki niej ciężej jest odkryć hasło, które zostało przepuszczone przez funkcję haszującą. Twoją solą może być np. 'sad8%$9sdk' lub cokolwiek zechcesz. Im bardziej przypadkowy jest to zbiór znaków, tym lepiej. I tą właśnie sól doklejasz do hasła, które przesłał użytkownik, nie ważne czy to rejestracja, czy logowanie. http://en.wikipedia.org/wiki/Salt_%28cryptography%29 |
Forum: PHP · Podgląd postu: #897190 · Odpowiedzi: 19 · Wyświetleń: 1 011 |
Napisane: 7.09.2011, 17:52:22 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
To, co robisz w tym kodzie jest całkowicie zbędne. Wystarczy, że użyjesz funkcji haszującej, jest to wystarczające zabezpieczenie.
A takie zabawy są już ciekawsze:) Tylko zamiast $user_login używa się zazwyczaj soli, czyli jakiegoś indywidualnego ciągu znaków, który również zapisujesz do bazy. Możesz użyć np. funkcji http://pl2.php.net/manual/en/function.microtime.php do jego generowania. Wystarczy, że użyjesz metody: http://pl2.php.net/manual/en/function.mysq...cape-string.php Jednak osobiście uważam, że co do loginu, to walidacja powinna wyglądać trochę inaczej. Chodzi o to, że zazwyczaj login ma pewien określony zbiór znaków, z których może się składać np. litery, cyfry, _, -, spacja itp. W każdym razie zbiór dozwolonych znaków jest określony dlatego też lepiej walidować login użytkownika, a nie (tak jak ty) filtrować. Do walidacji przydaje się funkcja: http://pl2.php.net/manual/en/function.preg-match.php |
Forum: PHP · Podgląd postu: #897167 · Odpowiedzi: 19 · Wyświetleń: 1 011 |
Napisane: 7.09.2011, 17:09:28 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Chciałbyś, aby po wciśnięciu buttona wykonała się metoda get()? Jeżeli tak, to nie ma takiej możliwości. Kod php'a jest po stronie serwera i zostaje zakończony nim jest przekazany do klienta. A to klient wciska button. Możesz użyć AJAX'a, aby przesłać zapytanie do serwera i odebrać odpowiedź. |
Forum: Przedszkole · Podgląd postu: #897144 · Odpowiedzi: 2 · Wyświetleń: 287 |
Napisane: 7.09.2011, 17:15:44 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
|
Forum: Przedszkole · Podgląd postu: #897146 · Odpowiedzi: 1 · Wyświetleń: 322 |
Napisane: 7.09.2011, 16:58:17 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Używając strpos() zastąpisz tylko pierwsze wystąpienie danej litery. Możesz ciąg traktować jako tablicę, czyli:
lub możesz skorzystać z funkcji str_replace(), aby zastąpić wszystkie wystąpienia liter:
|
Forum: PHP · Podgląd postu: #897133 · Odpowiedzi: 4 · Wyświetleń: 487 |
Napisane: 7.09.2011, 22:18:36 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Co do kwestii klasy user, to tworzenie jej obiektu powinno wyglądać tak:
Bez id, ponieważ jeżeli podajesz id w konstruktorze oznacza to, że użytkownik nie jest tworzony tylko pobierany z bazy. Pobieranie użytkownika z bazy powinno wyglądać tak:
I w tym momencie, jeżeli istnieje użytkownik o id 3, to klasa Users go zwraca, a jeżeli nie istenieje, to zwraca false. Dlatego też nie jest ci potrzebna metoda exists() Coś o TableAbstract:
Mniej więcej o to chodzi. Jak dobrze przemyślisz sprawę to metody update, delete i find różnią się tak naprawdę jedynie nazwą tabeli. |
Forum: Object-oriented programming · Podgląd postu: #897236 · Odpowiedzi: 6 · Wyświetleń: 534 |
Napisane: 7.09.2011, 10:56:22 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
1) W klasach User i Group masz settery i gettery do każdej wartości, więc jaki jest ich sens? Przypuszczam, że i tak będziesz wysyłał zawsze pełny zestaw danych więc zastanów się nad zastąpieniem tych metod: setData(array $data). 2) W konstruktorze nie powinno być parametru id, bo skąd wiesz jaki id będzie miał rekord? Przypuszczam, że kolumna jest auto inkrementowana. Id powinien być ustawiany dopiero po zapisie User/Group w bazie. 3) Groups i Users powinny rozszerzać klase abstrakcyjną np. TableAbstract, ponieważ w innym wypadku będziesz miał sporo kodu, który będzie duplikował się. 4) Metody add() i remove() powinny przyjmować jako parametr obiekt klasy User/Group, ponieważ to właśnie je chcesz zapisać/usunąć w/z bazy. 5) Czy rzeczywiście jest ci potrzebna metoda exist() ? Zastąpiłbym ją raczej find(), która zwróci albo obiekt (czyli rekord jest) albo false (brak rekordu). 6) Metody check() i hash() z klasy Users powinny wylecieć. check() jest metodą autoryzacji, więc powinna się znaleźć w tego typu klasie, natomiast hash() przypuszczam, że wykonuje jakieś operacje na stringu, więc na to konto również powinna być odpowiednia klasa. |
Forum: Object-oriented programming · Podgląd postu: #897014 · Odpowiedzi: 6 · Wyświetleń: 534 |
Napisane: 4.09.2011, 21:02:07 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Cytat fajne w tym jest to, że jeśli chcę przeładować ajaxem "centrum" aplikacji, to request z marszu zwróci mi tylko środek, a jak wywołam ten sam odnośnik w nowym oknie, to doklei layout i wszystko będzie działało odpowiednio. Nie wydaje mi się, żeby coś takiego było potrzebnym zabiegiem. W końcu wiesz, które akcje mają być responsem ajaxowym, a które nie, więc po co dodatkowo to sprawdzanie robić po stronie serwera? Jeżeli użytkownik wpisze ajaxowy url z palca to dlaczego otaczać to dodatkowo layoutem? Taka akcja nie jest pożądana, więc dlaczego nie wypluć po prostu czystego responsa? Cytat tym sposobem mam wymieszane wszystkie akcje ajaxowe oraz nei ajaxowe w controlerach Dobrze prawi:) Logika jest ważniejsza niż typ żądania. |
Forum: PHP · Podgląd postu: #896398 · Odpowiedzi: 5 · Wyświetleń: 698 |
Napisane: 18.08.2011, 22:45:51 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Funkcja podaj_dane() wyciąga dane z pliku, więc powinna je wyciągać z bazy. Najpierw łączysz się z bazą: http://pl.php.net/manual/en/mysqli.connect.php Następnie pobierasz dane: http://pl.php.net/manual/en/mysqli.query.php Przy użyciu selecta wynikiem jest: http://pl.php.net/manual/en/class.mysqli-result.php Żeby dostać dane w postaci tablicy asocjacyjnej wykonujesz metodę: http://pl.php.net/manual/en/mysqli-result.fetch-assoc.php I gotowe:) |
Forum: Przedszkole · Podgląd postu: #891426 · Odpowiedzi: 6 · Wyświetleń: 595 |
Napisane: 8.08.2011, 10:56:54 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
http://php.net/manual/en/function.preg-replace.php Coś w stylu: Pisane na szybko i pewnie się gdzieś wysypie, ale chodzi mniej więcej o coś takiego. Mimo wszystko takie kombinacje nie są czymś ładnym i moim zdaniem powinieneś zmienić coś w kodzie, a nie bawić się w takie operacje. |
Forum: PHP · Podgląd postu: #888479 · Odpowiedzi: 6 · Wyświetleń: 466 |
Napisane: 8.08.2011, 09:51:45 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
z php.net: Cytat PDO::query() returns a PDOStatement object, or FALSE on failure. oraz: http://www.php.net/manual/en/pdostatement.rowcount.php i z tego masz:
pierwsze jest po to, aby sprawdzić, czy nie było żadnego faila. |
Forum: Przedszkole · Podgląd postu: #888458 · Odpowiedzi: 1 · Wyświetleń: 408 |
Napisane: 3.08.2011, 08:30:24 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
A jaki sposób kodowania ustawiasz w nagłówkach maila? Dodaj do header'a: 'Content-type: text/html; charset=utf-8' powinno pomóc. |
Forum: Przedszkole · Podgląd postu: #887019 · Odpowiedzi: 2 · Wyświetleń: 352 |
Napisane: 31.07.2011, 22:41:40 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
http://www.php.net/manual/en/function.eval.php nic dodać, nic ująć |
Forum: Przedszkole · Podgląd postu: #886278 · Odpowiedzi: 3 · Wyświetleń: 249 |
Napisane: 31.07.2011, 22:38:57 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
http://www.php.net/manual/en/function.str-replace.php lub http://www.php.net/manual/en/function.preg-replace.php ale w Twoim przypadku wystarczy pierwsza. |
Forum: Przedszkole · Podgląd postu: #886277 · Odpowiedzi: 4 · Wyświetleń: 417 |
Napisane: 31.07.2011, 17:36:45 | |
Grupa: Zarejestrowani Postów: 664 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) |
Tak powinno wyglądać twoje wyrażenie: A co było źle w Twoim?
Po pierwsze, tak jak napisał sadistic_son, to: && -> and, || -> or. Możesz też używać słów or i and. Interpreter da radę Po drugie and lub or są łącznikami wyrażeń logicznych więc to co ty zrobiłeś to: $_GET['a'] == 'pomoc' i 'faq', gdzie: 1) $_GET['a'] == 'pomoc' - równa się true, gdy wchodzisz na 'pomoc', a false, gdy na 'faq' 2) 'faq' - zawsze równe true |
Forum: Przedszkole · Podgląd postu: #886182 · Odpowiedzi: 8 · Wyświetleń: 401 |
Nowe odpowiedzi Brak nowych odpowiedzi Popularny temat (Nowe) Popularny temat (Brak nowych) |
Sonda (Nowe) Sonda (Brak nowych) Zamknięty temat Przeniesiony temat |
Wersja Lo-Fi | Aktualny czas: 2.05.2024 - 22:30 |