Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt][PHP]Kawałek kodu do oceny
Forum PHP.pl > Inne > Oceny
Ojcov
Witam, jestem początkującym programistą PHP (samoukiem). Ponieważ uważam że najlepiej uczy się wykonując praktyczne zadania stworzyłem sobie projekt który poniekąd jest mniej rozbudowaną wersją pewnego serwisu. Szablon strony tworzę w bootstrapie. Chciałbym przedstawić kawałek kodu który stworzyłem i poprosić o to aby znawcy programowania obiektowego na tym forum wypowiedzieli się na ten temat, czy ten kod który napisałem mogę nazwać OBIEKTOWYM oraz o ewentualne porady dotyczące modyfikacji tego co napisałem.

W tym wszystkim chodzi o to aby do bazy danych można było dodawać książki a potem na swoim profilu dodawać je do ulubionych, na półki typu przeczytane, posiadam, chcę przeczytać itd. Na stronie głównej natomiast chcę wyświetlać 5 ostatnio dodanych (przez użytkowników) książek do bazy (okładka, tytuł, autor oraz opis) tak jak widoczne jest to na zdjęciu (zmieściły się tylko 3).



Tutaj prezentuję kod klasy stworzonej do pobierania rekordów z bazy i wyświetlania ich na stronie.
  1. class LatestBooks{
  2. private $tytul;
  3. private $autor;
  4. private $opis;
  5. private $sciezka;
  6. private $num;
  7. private $pdo;
  8.  
  9. public function __construct($num, $pdo ){
  10. $this->num = ($num - 1);
  11. $this->pdo = $pdo;
  12. }
  13.  
  14. public function getData(){
  15. $stmt = $this->pdo->query('SELECT * FROM `books`ORDER BY id DESC LIMIT 5 ');
  16. $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
  17. $this->tytul = $row[$this->num]['tytul'];
  18. $this->autor = $row[$this->num]['autor'];
  19. $this->opis = $row[$this->num]['opis']."...".'<button type="button" class=class="btn btn-inverse btn-xs">Więcej</button>';
  20. $this->sciezka = $row[$this->num]['sciezka'];
  21. $stmt->closeCursor();
  22.  
  23. }
  24.  
  25. public function write(){
  26. return "
  27. <div class=\"book col-md-12\">
  28. <div class=\"col-md-4\">
  29. <img src=". "{$this->sciezka}". " class=\"fotka\">
  30. </div>
  31. <div class=\"col-md-7 \">
  32. <h4>". "{$this->tytul}". "</h4>
  33. <p>Autor:". "{$this->autor}". "</p>
  34. <h5>". "{$this->opis}" ."</h5>
  35. </div>
  36. </div> ";
  37. }
  38.  
  39. }

A tutaj ten, odpowiedzialny za utworzenie obiektów i wywołanie metody.
  1. require('klasa.php');
  2. $pdo = new MyPDO();
  3. $book = new LatestBooks(1, $pdo);
  4. $book->getData();
  5. print $book->write();
  6. $book = new LatestBooks(2, $pdo);
  7. $book->getData();
  8. print $book->write();
  9. $book = new LatestBooks(3, $pdo);
  10. $book->getData();
  11. print $book->write();
  12. $book = new LatestBooks(4, $pdo);
  13. $book->getData();
  14. print $book->write();
  15. $book = new LatestBooks(5, $pdo);
  16. $book->getData();
  17. print $book->write();

Dziękuję z góry wszystkim którzy zechcą poświęcić czas na pomoc, mam nadzieję że wszystko objaśniłem jak najlepiej i podałem wszystkie niezbędne informacje. Ze swojej strony pragnę jeszcze dodać że jest to pierwszy raz kiedy napisałem coś (mam nadzieję) obiektowo.
Kshyhoo
Witamy na Forum. Zapoznaj się z panującymi tu zasadami, by uniknąć blokady wątków.
Do ocen jest dział Oceny, przenoszę.
Ojcov
Przepraszam i dziękuję za przeniesienie.
IProSoft
Może i masz rację na temat tworzenia projektów, ale wtedy za podstawę trzeba brać poprawny kod, bo to co stworzyłeś śrenio trzyma się kupy.

- wyświetlasz listę, a dla każdej pozycji tworzysz nie potrzebnie obiekt
- pobierasz za każdym razem 5 rekordów a wyświetlasz jeden
itp itd

Jako parametr powinieneś podać nie ID, tylko ilość materiałów do wyświetlenia i wywołać klasę tylko raz.
  1. $book = new LatestBooks( $pdo );
  2. $book->getData( 5 - liczba pozycji );
  3. echo $book->write();
Ojcov
Dlatego stworzyłem ten temat, aby dowiedzieć się czy to co zrobiłem jest poprawne.
Dziękuję za wyrażenie opinii, spróbuję to poprawić zgodnie ze wskazówkami.


@edit: Mam jeszcze pytanie. Po wpisaniu wartości dla ilości rekordów które chciałbym wyświetlić po pobraniu z bazy powinienem wewnątrz tej metody użyć pętli do wyświetlenia tych 5 różnych rekordów ? Czy może istnieje jakieś inne rozwiązanie?
IProSoft
Cytat(Ojcov @ 1.05.2015, 13:28:12 ) *
Dlatego stworzyłem ten temat, aby dowiedzieć się czy to co zrobiłem jest poprawne.

Moim zdaniem nie od tego powinieneś zacząć, a od poznania struktur itp. bo już teraz łapiesz nie potrzebnie nawyki ale każdy ma swoje podejście i oczywiście nie twierdzę, że Twoje jest złe :-)

Na poczatek spróbuj wobec tego wykonać to na petli w metodzie write.
Ojcov
Zasięgnąłem porady również na innym forum i teraz wyżej prezentowany kod wygląda tak.

Kod
class LatestBooks{
        private $pdo;
        
        public function __construct(MyPDO $pdo ){
            $this->pdo = $pdo;
        }
        
        public function getData($num){
            $stmt = $this->pdo->query('SELECT * FROM `books`ORDER BY id DESC LIMIT '.$num.' ');  
            return $stmt->fetchAll(PDO::FETCH_ASSOC);                                         
        }    
}


Wywołanie:

Kod
require('inc/klasa.php');
    $pdo = new MyPDO();
    $book = new LatestBooks($pdo);
    $data = $book->getData(5);
foreach($data as $row) {
?>
    <div class="book col-md-12">
            <div class="col-md-4">
            <img src="<?=$row['sciezka']?>" class="fotka">  
            </div>
            <div class="col-md-7 ">
            <h4>"<?=$row['tytul']?>"</h4>
            <p>Autor:"<?=$row['autor']?>"</p>
            <h5>"<?=$row['opis']?>"</h5>
              </div>
        </div>  
        <?php
}


Jak to oceniasz?
IProSoft
Już lepiej ale nie ważne jak Ci napiszą abyś robił, ale to czy rozmiesz dlaczego w ten sposób.
qjam
W ogóle to rozbij skrypt na MVC.
FrontController - reaguje na to co w np. GET itp. Jeśli GET masz / to odpal tę stronę główną z 5 książkami (czy co tam ma być robione na stronie głównej) czyli odpala konkretną metodę kontrolera
Controller - metoda wywołana w FC wysyła zapytanie do modelu
Model - odpala zapytanie do bazki, zapisuje wynik w tablicy i returnuje do kontrolera, a kontroler odpala teraz metode widoku
View - returnuje zrenderowany widok do kontrolera, a następnie kontroler zwraca do FC i tu następuje dopiero echo

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.