Czy koniecznie trzeba oddzielać kod prezentacji(html) od kodu bazy danych

0

Mam takie pytanie jak to jest z oddzielaniem warstwy prezentacji od bazy danych mam sobie funkcje, która coś wyciąga z bazy jakieś tam dane i je drukuje no teraz to wygląda tak.

    public function wyswietl_staty($start,$sortuj) {
     $baza_staty =  DB::select("select id,data_wejscia,system_operacjny,przegladarka,http_user_agent,jakie_haslo,ip,user from statystyki order by $sortuj limit $start,20");
     //var_dump($aa);//print $aa[0]->user;
     
     foreach($baza_staty as $baza_staty2)
      {
      $data_wejscia = date("Y-m-d H:i:s",$baza_staty2->data_wejscia);
     print ("<tr>
     <td><span class=strona>" . $baza_staty2->id . "</td>
     <td><span class=strona>" . $baza_staty2->system_operacjny . "</td>
     <td><span class=strona>" . $data_wejscia . "</td>
     <td><span class=strona>" . $baza_staty2->przegladarka . "</td>
     <td><span class=strona>" . $baza_staty2->jakie_haslo . "</td>
     <td><span class=strona>" . $baza_staty2->ip . "</td>
     <td><span class=strona>" . $baza_staty2->user . "</td>
     </tr>");
      }
    //  $aa = DB::table('statystyki')->select("select user from statystyki where id = '10'");
      //$aa2 =  mysql_fetch_array($aa);
      //print $aa[0]->ip;
    
    
    } 

i jeszcze wywołanie tej funkcji

 if ( isset($start) and isset($koniec) ) {
  $staty->wyswietl_staty($start,$sortuj_po);
}
else if ( isset($sortuj_po) ) {
  $staty->wyswietl_staty(0,$sortuj_po);
}
else {
  $staty->wyswietl_staty(0,"id");
}

I teraz jakbym miał oddzielić te dwie rzeczy to wyglądało by to tak

    public function wyswietl_staty($start,$sortuj) {
     $baza_staty =  DB::select("select id,data_wejscia,system_operacjny,przegladarka,http_user_agent,jakie_haslo,ip,user from statystyki order by $sortuj limit $start,20");
     //var_dump($aa);//print $aa[0]->user;
     $tablica = array();     
     foreach($baza_staty as $baza_staty2)
      {
      $data_wejscia = date("Y-m-d H:i:s",$baza_staty2->data_wejscia);

     $tablica[$i][0] = $baza_staty2->id ;
     $tablica[$i][1] = $baza_staty2->system_operacyjny ;
//i tak do usera
$i++;
      }

    //  $aa = DB::table('statystyki')->select("select user from statystyki where id = '10'");
      //$aa2 =  mysql_fetch_array($aa);
      //print $aa[0]->ip;
    return $tablica;
    
    } 

I jeszcze wywolanie

 if ( isset($start) and isset($koniec) ) {
$xx =   $staty->wyswietl_staty($start,$sortuj_po);
$i = 0;
while ($i < count($xx) ) {
print ("<tr>
  <td><span class=strona>" . $xx[$i][0] . "</td>
  <td><span class=strona>" . $xx[$i][1] . "</td>
  <td><span class=strona>" . $xx[$i][2] . "</td>
  <td><span class=strona>" . $xx[$i][3] . "</td>
  <td><span class=strona>" . $xx[$i][4] . "</td>
</tr>
');
}
}
else if ( isset($sortuj_po) ) {
//i tutaj też by musiał być powtórzony kod
  $staty->wyswietl_staty(0,$sortuj_po);
}
else {
  $staty->wyswietl_staty(0,"id");
}

Mi się wydaje, że 1 sposób jest szybszy, ale nie oddziela tych dwóch rzeczy, natomiast w drugim mamy więcej kodu i pracy procesora przy wczytywaniu tabelek.

2

Nie trzeba koniecznie. Nie umiera się od tego. Skoro już teorię poznałeś ("koniecznie") to znaczy, że wiesz jak należy, mamy Ci potwierdzić jeszcze raz?

Pisz byle jak i rozbudowywuj swój produkt, w końcu stanie się nie do utrzymania i zrozumiesz dlaczego należy rozdzielać logikę od prezentacji :)

I nie jestem złośliwy - każdemu przyda się taka lekcja.

0

No dobrze, ale jak byś w tym moim przykładzie rozdzielił te dwie rzeczy czy prezentacje od logigi ?

0

Pisze bo nie mogę tego posta edytować, czy ten mój przykład 2, który oddziela te dwie rzeczy jest dobry bo pierwszy to jest bez oddzielania, a drugi jest z oddzielaniem.

2

Załóż konto i będziesz mógł o wiele więcej. Oczywiście poniższy przykład to robota w 3 minuty, więc jest co poprawiać, użyłbym oczywiście PDO, i zabezpieczył funkcje np przed wysypaniem w przypadku gdy nie znajdzie żadnego rekordu.
A dla autora powiem jeszcze tak: wyobraź sobie że w Twojej funkcji masz jakieś tajne mnożniki punktowe dla wybranych osób, i teraz chcesz żeby html'em zajął się ktoś obcy (zleceniobiorca, pracownik, Twój sąsiad) no i lepiej im chyba dać taką funkcję która ja naskrobałem i niech tylko na niej pracuje, a resztę logiki ukryć.

<?php

/**
 * Created by PhpStorm.
 * User: 4programmers.net
 * Date: 12.10.2016
 * Time: 19:40
 */
class example
{
    /**
     * Zwraca dane o użytkownikach z bazy
     *
     * @param string  $order       Kolejnośc (kolumna + ASC/DESC)
     * @param integer $startOffset Offset od którego zaczynamy
     *
     * @return mixed
     */
    public function getDbData($order, $startOffset = 0)
    {

        $query = sprintf(
            'SELECT `id`, `data_wejscia`, `system_operacjny`, `przegladarka`, `http_user_agent`, `jakie_haslo`, `ip`, `user` 
             FROM `statystyki`  
             ORDER BY %1$s 
             LIMIT %2$s,20', $order, $startOffset
        );

        return DB::select($query);
    }

    /**
     * Wyświetla statystyki
     *
     * @param string  $order       Kolejnośc (kolumna + ASC/DESC)
     * @param integer $startOffset Offset od którego zaczynamy
     *
     * @return null
     */
    public function displayStats($order, $offset)
    {
        $dbRows = $this->getDbData($order, $offset);
        if (empty($dbRows)) {
            return;
        }

        echo '<table>';
        foreach ($dbRows as $row) {
            $this->displayRow($row);
        }
        echo '</table>';

    }

    /**
     * Wyświetla jeden wiersz z bazy danych
     *
     * @param mixed $dbRow Wiersz z DB
     *
     * @return null
     */
    private function displayRow($dbRow)
    {
        echo '<tr>';
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->id);
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->system_operacjny);
        echo sprintf('<td><span class=strona>%1$s</td>', date("Y-m-d H:i:s", $dbRow->data_wejscia);
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->przegladarka);
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->jakie_haslo);
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->ip);
        echo sprintf('<td><span class=strona>%1$s</td>', $dbRow->user);
        echo '</tr>';
    }
}

1

Nie będę się powtarzał z kodami, więc podaję link do jednego z przykładów który podałem w innym wątku:
http://4programmers.net/Forum/PHP/277074-sklep_internetowy_-_sposob?p=1290271#id1290271

Choć i takie podejście zawsze można skrytykować. To co w poście wyżej nie obrazuje tej idei, konkretnie wzorca MVC a właściwie to MVP, stosowanego zresztą we frameworkach.

0

@Maciej Cąderek
Odniosę się do tego:
http://4programmers.net/Forum/1260762

To też inaczej można zrobić (jednak celowo posłużę się tabelą z użytkownikami bo akurat to mam w bazie na localhost):

Rozbicie na:

config.php

<?php

return [
    'driver' => 'mysql', // bo Postgres też może wchodzić w grę
    'host' => 'localhost',
    'dbname' => 'mojabaza',
    'user' => 'root',
    'pass' => 'root',
];

layout.phtml (bazowy szablon, bo po co macie to samo używać w innych podstronach???)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Example</title>
</head>
<body>
    <?php if (isset($content)) echo $content ?>
</body>
</html>

users.phtml (podszablon który będzie wstrzyknięty do bazowego szablonu)

    <?php foreach($users as $user): ?>
        <ul>
            <li>Username: <?= $user['username'] ?></li>
            <li>Email: <?= $user['email'] ?></li>
        </ul>
    <?php endforeach; ?>

index.php

<?php

// funkcja renderowania widoku z buforowaniem wyjscia
function render($layout, $data = [])
{
    ob_start();
    extract($data);
    try
    {
        include $layout;
    }
    catch (Exception $ex)
    {
        ob_end_clean();
        throw $ex;
    }

    return ob_get_clean();
}

// wczytanie konfigu bazy danych z oddzielnego pliku
$config = include 'config.php';

try
{
    $dsn = $config['driver'] . ':host=' . $config['host'] . ';dbname=' . $config['dbname'];
    $pdo = new PDO($dsn, $config['user'], $config['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query('SELECT * FROM users');
    $users = $stmt->fetchAll();
}
catch(PDOException $e)
{
    throw $e;
}

// najpierw renderowanie podwidoku z uzytkownikami
$content = render('users.phtml', ['users' => $users]);
// i wstrzykiwanie tego do bazowego szablonu
echo render('layout.phtml', ['content' => $content]);

1 użytkowników online, w tym zalogowanych: 0, gości: 1