Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]/[mysqli]/[oop] archtektura strony
Forum PHP.pl > Forum > PHP
Lejto
Pisze kod strony w którym chcę wykorzystać mysqli oop i chcę żeby to wszystko miało swój początek i koniec żeby było dobrze zrobione. Do tej pory mam to:
klasa
  1. <?php
  2. require_once('config.php');
  3.  
  4. class mysql
  5. {
  6.    private $lacz;
  7.    
  8.    public function __construct()
  9.    {
  10.        $this->lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  11.  
  12.    }
  13.    public function __dectruct()
  14.    {
  15.        $this->lacz->close();
  16.    }
  17.  
  18.    public function set_query($query)
  19.    {
  20.  
  21.            $rows = array();
  22.            $wykonaj = $this->lacz->query($query);
  23.            
  24.              
  25.                    while($row = $wykonaj->fetch_row())
  26.                    {
  27.                    return $row[0];
  28.                      }    
  29.                    
  30.     }
  31.    public function select_page($page)
  32.    {
  33.            
  34.        switch($page)
  35.        {
  36.            case '':
  37.            $this->glowna();
  38.            break;
  39.            
  40.            
  41.        }
  42.        
  43.        return $page;
  44.    }
  45.    public function glowna()
  46.    {
  47.    
  48.        $nag = $this->set_query('SELECT naglowek from pages');
  49.             $nag = $this->set_query('SELECT tresc from pages');    
  50.  
  51.    }
  52. }
  53. ?>

przykładowy index.php
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <base href="http://localhost/spin/" />
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <link rel="stylesheet" href="style.css" type="text/css">
  7. </head>
  8. <body>
  9. <?
  10. $page = $_GET['page'];
  11. include("db.class.php");
  12. $db = new mysql();
  13.  
  14. $result = $db->set_query('SELECT * FROM config');
  15.  
  16. ?>
  17. <title><? echo $result; ?></title>
  18. [...]
  19.      <div id="img1b"> <!--główna kolumna -->
  20.              
  21.            <?
  22.            $db->select_page($page);
  23.            $db->glowna();
  24.            ?>      
  25.             <div class="nag"><p><? echo $nag; ?></p></div>
  26.            <hr />
  27.            <span class="inf">
  28.              
  29.            <?
  30.            $result = $db->set_query('SELECT tresc from pages');
  31.            echo $result;
  32.            
  33.             echo $txt;
  34.            ?>
  35.            
  36.            
  37.            
  38.            </span>
  39.                
  40.      </div> <!--główna kolumna -->
  41. [....]

I teraz pytanie czy to jest optymalnie i dobrze napisane. Tak żeby przy dodawani dodatkowych stron nie było problemu.
I jeszcze jak mam kto który wyświetla informacje na stronie głównej:
  1. <div id="img1b"> <!--główna kolumna -->
  2.              
  3.            <?
  4.            $db->select_page($page);
  5.            $db->glowna();
  6.            ?>      
  7.             <div class="nag"><p><? echo $nag; ?></p></div>
  8.            <hr />
  9.            <span class="inf">
  10.              
  11.            <?
  12.            $result = $db->set_query('SELECT tresc from pages');
  13.            echo $result;
  14.            
  15.             echo $txt;
  16.            ?>
  17.            
  18.            
  19.            
  20.            </span>
  21.                
  22.      </div> <!--główna kolumna -->

Jak zrobić żeby po wywołaniu $db->glowna(); wyświetliło nagłówek który pobrałem w tej funkcji tam gdzie chcę (wrzucić go do zmiennej)
Żeby to przy wybraniu innej strony pobrało inne dane. Czy każdy dział w innym pliku zrobić?
zimi
1. lepiej od razu rzuć okiem na PDO zamiast mysqli
2. to co napisałeś jest tylko pozamykane w klasach, a koło oop nawet nie stało
3. optymalizacją zajmujemy się dopiero gdy kod działa...
4. pomijam takie chochliki jak __dectruct, ten switch też wydaję się co najmniej twórczy

Jaka rada z mojej strony?
przeczytaj na czym polega programowanie obiektowe, a potem jak działa wzorzec MVC (wydaję mi się że dobry do tego będzie askeet i jego tworzenie w symfony, aczkolwiek to nie jest chyba łatwa droga bo jest sporo do ogarnięcia) i naturalnie próbuj zrozumieć, potem przeczytaj to jeszcze raz, potem jeszcze raz..., generalnie zrozumienie idei obiektowości przynajmniej dla mnie było sporym problemem
i raczej nie da się tego po prostu wyczytać... trzeba zobaczyć kod i się nim pobawić stąd moja propozycja z symfony
Lejto
ok dzięki za wskazówki
zrobiłem takie coś:
index.php
  1. <div id="img1b"> <!--główna kolumna -->
  2.              
  3.                
  4.             <div class="nag"><p><? $db->select_page($page); ?></p></div>
  5.            <hr />
  6.            <span class="inf">                
  7.            <?
  8.             $db->select_page_nag($page);
  9.            ?>
  10.            </span>
  11.                
  12.      </div> <!--główna kolumna -->

klasa
  1. <?php
  2. require_once('config.php');
  3.  
  4. class mysql
  5. {
  6.    private $lacz;
  7.    
  8.    public function __construct()
  9.    {
  10.        $this->lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  11.  
  12.    }
  13.    public function __dectruct()
  14.    {
  15.        $this->lacz->close();
  16.    }
  17.  
  18.    public function set_query($query)
  19.    {
  20.  
  21.            $rows = array();
  22.            $wykonaj = $this->lacz->query($query);
  23.            
  24.              
  25.                    while($row = $wykonaj->fetch_row())
  26.                    {
  27.                    return $row[0];
  28.                      }    
  29.                    
  30.     }
  31.    public function select_page($page)
  32.    {
  33.        if(!in_array ($_GET['page'], array('index', 'oferta', 'kontakt')))
  34.        {
  35.            $page = 'index';
  36.        }
  37.        else
  38.        {
  39.            $page = $_GET['page'];
  40.        }
  41.        $driver = false;
  42.            
  43.        switch($page)
  44.        {
  45.            case $page:
  46.            $this->glowna();
  47.            break;
  48.            
  49.            
  50.        }
  51.        
  52.        return $page;
  53.    }
  54.    public function select_page_nag($page)
  55.    {
  56.            
  57.        switch($page)
  58.        {
  59.            case '':
  60.            $this->glowna_txt();
  61.            break;
  62.            case 'oferta':
  63.            $this->glowna_txt();
  64.            break;
  65.            case 'kontakt':
  66.            $this->glowna_txt();
  67.            break;
  68.            
  69.        
  70.            
  71.            
  72.        }
  73.        
  74.        return $page;
  75.    }
  76.    public function glowna()
  77.    {
  78.  
  79.    if($_GET['page'] == '')
  80.    {      
  81.      $result = $this->set_query('SELECT naglowek from pages where id_strony = 0');    
  82.      echo  $result;
  83.    }
  84.    elseif($_GET['page'] == 'oferta')
  85.    {
  86.      $result = $this->set_query('SELECT naglowek from pages where id_strony = 2');    
  87.      echo  $result;    
  88.    }
  89.    elseif($_GET['page'] == 'kontakt')
  90.    {
  91.      $result = $this->set_query('SELECT naglowek from pages where id_strony = 3');    
  92.      echo  $result;    
  93.    }
  94.    
  95.  
  96.    }
  97.    public function glowna_txt()
  98.    {
  99.            $result = $this->set_query('SELECT tresc from pages where id_name = "'.htmlspecialchars($_GET['page']).'"');
  100.            echo $result;
  101.    }
  102.    
  103.    
  104.    
  105.  
  106.  
  107. }
  108. ?>

dobrze? smile.gif
bigZbig
Przede wszystkim nie jest dobrym pomysłem zamykanie w jednej klasie mysql funkcjonalności ogólnych jakimi są wykonywanie zapytań do bazy danych i jednoczeście funkcjonalności specyficznych czyli w tym wypadku wybieranie konkretnej strony w projekcie. Zastanów się do czego ma służyć klasa mysql. OOP to nie tylko pakowanie funkcji w klasy.
Lejto
ok, to zrobię tak klasa mysql to łączenia z bazą i zapytania do bazy a inna klasa do wyświetlania wyników
?
deirathe
Na tym polega oop, żeby jedna klasa odpowiadała za pewne elementy a inna za inne smile.gif. Ogólnie klase mysql wykorzystaj tylko do zapytan do bazy i zwracania wynikow: query,getResults,numResults, itd... zZbuduj klasę Page do obsługi stron. Najlepiej jeszcze podziel jakoś strukturę tak żeby nie wykonywać zapytań do bazy w szablonie tongue.gif poczytaj o MVC
skowron-line
  1. <?php
  2. public function select_page($page)
  3.   {
  4.       if(!in_array ($_GET['page'], array('index', 'oferta', 'kontakt')))
  5.       {
  6.           $page = 'index';
  7.       }
  8.       else
  9.       {
  10.           $page = $_GET['page'];
  11.       }
  12.       $driver = false;
  13.          
  14.       switch($page)
  15.       {
  16.           case $page:
  17.           $this->glowna();
  18.           break;
  19.          
  20.          
  21.       }
  22.      
  23.       return $page;
  24.   }
  25. ?>

nie używaj zmiennych superglobalnych w metodach bóg dał parametry metod / funkcji zeby z nich kożystać.

Cytat
ok, to zrobię tak klasa mysql to łączenia z bazą i zapytania do bazy a inna klasa do wyświetlania wyników
?

MVC
Lejto
ok
ale tego nie rozumiem
Cytat
nie używaj zmiennych superglobalnych w metodach bóg dał parametry metod / funkcji zeby z nich kożystać.
erix
Poszukaj sobie np. o singletonie, referencjach, itp.

A tak najogólniej - o programowaniu obiektowym. winksmiley.jpg
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.