Skrypt pobierający newsy z bazy danych

Tutaj dyskutujemy o PHP oraz zgłaszamy i rozwiązujemy problemy dotyczące tego języka.
bielu000
Stały Bywalec
Stały Bywalec
Posty: 84
Dołączył(a): piątek, 8 maja 2009, 14:54

Skrypt pobierający newsy z bazy danych

Post przez bielu000 »

Hej ;) Podobno jedną z dobrych metod nauki programowania jest wstawianie swojego kodu na forum i słuchanie opinii bardziej doświadczonych ;) Eksperymentuję z programowaniem obiegowym w PHP (dotychczas programowałem strukturalnie) ale do poziomu profesjonalisty jeszcze trochę mi brakuje....ale jestem ambitny więc chętnie wysłucham wszelkich uwag.

Skrypt jest prosty. Po załadowaniu podstrony pobiera wszystkie newsy z bazy danych, a po wybraniu konkretnego ładuje treść tego newsa.
Poniżej załączam skrypty.

Kod wkleiłem w znacznikach "code" natomiast podaję, jeszcze dwa linki do zewnętrznej strony, na której jest wklejony kod - moim zdaniem lepiej tam przeglądać bo jest jakoś bardziej czytelnie:
- http://wklej.org/id/1820546/ - news.Class.php
- http://wklej.org/id/1820550/ - news.php

W pliku connect.Class.php zawarta jest instrukcja ($this->select($sql) wysyłająca zapytanie do bazy danych, które [to zapytanie($sql)] jest pobierane z klasy News.

Code: Zaznacz cały

<?php //PHP OPEN
require_once("connect.Class.php");


class News extends db
{
      public $id;
        




       /* public function __construct() 
        {
            parent::__construct();
            $this->categoryName = "Newsy";
           $row = mysql_fetch_array($result);
            $this->title = $row['title'];
           
            
            
        }*/
        
       public function ShowNews($id)
       {
           $sql = "SELECT * FROM news WHERE id = $id LIMIT 1";
           if ($this->select($sql))
           {
               $row = mysql_fetch_assoc($this->select($sql));
              
               $IsNewsExists = mysql_num_rows($this->select($sql));
               
               
               if ($IsNewsExists == 1)
               {
                   $this->setVars($row);
                   return true;
               }
               else echo "Ups...niestety nie posiadamy newsa o takim ID";
               
               
           } else echo "Nie udalo sie";
           
       }
       
       public function ShowAllNews($i)
       {
            $sql = "SELECT * FROM news  ORDER BY date ASC";
            if ($this->select($sql))
            {
                $result = $this->select($sql);
                $this->countRows = mysql_num_rows($result);
                
                while ($i  < $this->countRows)
                    {
                        $row = mysql_fetch_array($result);
                        
                        $this->setVars($row);
                        
                        $i++;
                
                    }
            }
       }
       
      
       protected function setVars($row) //USTAWIA ZMIENNE
       {
           
           $this->id = $row['id'];
           $this->title = $row['title'];
           $this->short_text = $row['short_text'];
           $this->full_text = $row['full_text'];
           $this->date = $row['date'];
           $this->author = $row['author'];
           
           
           
       }
       
        public  function filterID($id) //FILTROWANIE ID
       {
            if  (is_numeric($id)) // SPRAWDZANIE CZY ZMIENNA TO NA PEWNO INT
                {
                    if ($id>0)
                    {
                        return true;
                    }
                    
                    else 
                    {
                        echo "News nie może mieć ujemnego identyfikatora!";
                        return false;
                    }
                }
           
           else 
                {
                    echo "Identyfikator newsa musi być numeryczny!";
                    return false;
                }
               
           
          
       }
       
       
       
}
//PHP CLOSE
?>
Plik news.php - zawiera odpowiednie instrukcje, według których wyświetlany jest news lub newsy. Co prawda nie podoba mi się wcale pomieszanie kodu PHP z HTML, jednakże SMARTY odłożyłem sobie póki co na później, przy okazji większej ilości czasu, zapoznam się i z tym zagadnieniem.

Wiadomo skrypt obecnie jest mało rozbudowany, można by zrobić jakąś paginację, fajną obsługę błędów ale chciałbym wiedzieć co by tu ewentualnie pozmieniać, co jest bez sensu, a co jest dobrym rozwiązaniem.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Skrypt pobierający newsy z bazy danych

Post przez Morfidon »

Hej :)

Nazwy metod zaczynaj od małych liter, nazwy zmiennych również. Zamiast zwracać bool staraj się raczej rzucać wyjątkami. Jak rzucasz wyjątek to nie musisz sprawdzać co chwila czy ten wyjątek się stał, czy też nie przez co kod jest bardziej czytelny poza tym osoba, która by ew. korzystała z Twoich metod nie musi wiedzieć po co jakaś metoda zwraca bool. Czy filterID sugeruje, że zwróci bool?

Pozdrawiam
bielu000
Stały Bywalec
Stały Bywalec
Posty: 84
Dołączył(a): piątek, 8 maja 2009, 14:54

Re: Skrypt pobierający newsy z bazy danych

Post przez bielu000 »

Filter Id w domyśle miało sprawdzać, czy wartość przesłana w zmiennej jest typu int. Natomiast napotkałem na dziwną przeszkodę - mimo, że w bazie danych ID deklarowane jest jako int, po pobraniu z bazy i sprawdzeniu jej var_dumpem pokazuje, że jest to string. Dlatego zastosowałem funkcję is_numeric. Oczywiście przerobię to wszystko stosując wyjątki ;)

Mam takie troszkę może nietypowe pytanie - Panie Arkadiuszu jak Pan uczył się różnych języków? Przykładowo skupił się Pan na PHP, wskoczył na pewien poziom stwierdzając, że jest Pan już dość dobrze z nim obeznany i przeskakiwał Pan na jakiś inny język, czy uczył się Pan tego czego akurat potrzebował do jakiegoś projektu. Załóżmy, że jest Pan początkującym twórcą stron internetowych. Ma Pan do stworzenia projekt, w którym musi Pan np. stworzyć taki prosty system newsów jak wyżej, ale przy okazji potrzebuje Pan upiększyć i uatrakcyjnić stronę jakimiś ciekawymi skryptami JS oraz powiedzmy za pomocą AJAX-a przyśpieszyć trochę wykonywanie skryptów. I czy w takiej sytuacji uczy się Pan np. PHP do momentu aż stworzy Pan skrypt, którego potrzebuje i przeskakuje na inny język tworząc resztę potrzebnych skryptów(w innych językach) czy może od razu próbuje Pan "maxować danego skilla" (ucząc się języka aż opanuje go dość dobrze), że się tak wyrażę.

Obecnie jestem w takiej sytuacji i zastanawiam się nad kompromisem - pewne rzeczy w PHP, które były mi potrzebne już sobie zaprogramowałem i teraz pasowałoby zasięgnąć wiedzy z AJAX-a, ale mam trochę wrażenie, ze czułbym że zaniedbuje wtedy PHP (gdzie jeszcze wiele nauki przede mną).
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Skrypt pobierający newsy z bazy danych

Post przez Morfidon »

Nigdy nie będziesz perfekcyjny. Próbuj. Pytaj się. W końcu zaczniesz pisać lepiej.

Poznaj przynajmniej jeden język na wyższym poziomie. Jak znasz już jeden język to poznanie innego nie jest już kłopotem.Poznajesz co najwyżej różnice w językach. Idea jest podobna. Najważniejsze są umiejętności radzenia sobie z problemem. Warto wiedzieć co język umożliwia, ale nie jest się w stanie pamiętać wszelkich możliwych funkcji. Warto wiedzieć przynajmniej, że coś istnieje, bo gdy powstanie problem można łatwo to odnaleźć i rozwiązać szybko problem. Programowanie polega głównie na szukaniu rozwiązania i zaprojektowaniu tego rozwiązania tak, żeby można było te rozwiązanie kiedyś ulepszyć bez niszczenia tego co zostało już napisane.

Pozdrawiam :)
bielu000
Stały Bywalec
Stały Bywalec
Posty: 84
Dołączył(a): piątek, 8 maja 2009, 14:54

Re: Skrypt pobierający newsy z bazy danych

Post przez bielu000 »

Rozumiem ;)

Przerobiłem kod wykorzystując wyjątki.

Zastanawiam się jak powinien wyglądać powyższy skrypt tak aby był zgodny ze wzorcem projektowym MVC.
Przykładowo gdyby ktoś otworzył konkretnego newsa, do kontrolera leciała by informacja o wywołanej akcji, czyli np. kontroler dostałby konkretne ID, które by sobie przefiltrował na różne sposoby, następnie przekazałby sterowanie do Modelu, który pobrałby odpowiednie dane z bazy danych, następnie sterowanie przeszłoby znowu do Kontrolera, który załadowałby odpowiedni widok (przykładowo jakiś szablon), który z kolei wyświetliłby przetworzone dane z bazy danych. Dobrze to rozumiem? Jak powinna wyglądać struktura plików w takiej sytuacji? Wszystko np. news.Class.php czy lepiej sobie to rozdzielać, tworząc osobny plik z klasą, który np. byłby kontrolerem w tej sytuacji?
bielu000
Stały Bywalec
Stały Bywalec
Posty: 84
Dołączył(a): piątek, 8 maja 2009, 14:54

Re: Skrypt pobierający newsy z bazy danych

Post przez bielu000 »

Jak widać, po wklejonych przeze mnie wyżej kodach źródłowych, niestety nie oddzielam póki co zbytnio kodu PHP od HTML. Zastanawiam się nad odpowiednia metodą. Myślałem nad Smarty, jednakże zastanawia mnie taka jedna kwestia. Przykładowo ktoś wchodzi na podstronę newsy.php. Kontroler wyłapuje, że nie wybrano konkretnego newsa więc pobiera dane i wczytuje tpl'kę odpowiednią do wyświetlania wszystkich newsów. Natomiast jeśli użytkownik wybierze konkretnego newsa, kontroler to wyłapuje, oczywiście sprawdza wszystko co potrzebuje i wtedy ładuje tpl'kę odpowiednią do wyświetlania tego jednego konkretnego newsa. Niby wszystko ok, ale tworzą się nam dwa pliki szablonu - jeden odpowiedni do wyświetlania jednego newsa, a drugi do wyświetlania wszystkich. Nie podoba mi się to zbytnio. Ale czy tak się robi? Można by to pewnie załatwić tak, że stworzyłoby się jeden plik tpl, a w nim jakby dwie opcje wyświetlania (dla jednego newsa i wszystkich), ale przez to z kolei trzeba by było stosować pętle w smarty, a wolałbym żeby wszystkimi pętlami itp zajmowało się PHP. Jaki kompromis proponowałby Pan w tej sytuacji?


//Sorki za posta pod postem, ale w powyższym zniknęła już opcja edycji :)
Post Reply