• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kawałek kodu do oceny

Object Storage Arubacloud
+1 głos
279 wizyt
pytanie zadane 1 maja 2015 w PHP przez Ojcov Użytkownik (760 p.)
otagowane ponownie 1 maja 2015 przez 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.

class LatestBooks{
		private $tytul;
		private $autor;
		private $opis;
		private $sciezka;
		private $num;
		private $pdo;
		
		public function __construct($num, $pdo ){
			$this->num = ($num - 1);
			$this->pdo = $pdo;
		}
		
		public function getData(){
			$stmt = $this->pdo->query('SELECT * FROM `books`ORDER BY id DESC LIMIT 5 ');
			$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
			$this->tytul     = $row[$this->num]['tytul'];
			$this->autor    = $row[$this->num]['autor'];
			$this->opis	=	$row[$this->num]['opis']."...".'<button type="button" class=class="btn btn-inverse btn-xs">Więcej</button>';
			$this->sciezka = $row[$this->num]['sciezka'];
			$stmt->closeCursor();
		
		}
		
		public function write(){
		return "
			<div class=\"book col-md-12\">
			<div class=\"col-md-4\"> 
			<img src=". "{$this->sciezka}". " class=\"fotka\">  
			</div>
			<div class=\"col-md-7 \"> 
			<h4>". "{$this->tytul}". "</h4>
			<p>Autor:". "{$this->autor}". "</p>
			<h5>". "{$this->opis}" ."</h5>
  			</div>
		</div>  ";
		}
	
}

 

A tutaj ten, odpowiedzialny za utworzenie obiektów i wywołanie metody.
 

require('klasa.php');
	$pdo = new MyPDO();
	$book = new LatestBooks(1, $pdo);
	$book->getData();	
	print $book->write();
	$book = new LatestBooks(2, $pdo);
	$book->getData();	
	print $book->write();
	$book = new LatestBooks(3, $pdo);
	$book->getData();	
	print $book->write();
	$book = new LatestBooks(4, $pdo);
	$book->getData();	
	print $book->write();
	$book = new LatestBooks(5, $pdo);
	$book->getData();	
	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. 

1 odpowiedź

+3 głosów
odpowiedź 1 maja 2015 przez efiku Szeryf (75,160 p.)
wybrane 1 maja 2015 przez Ojcov
 
Najlepsza

Tą klasę LatestBooks można zmniejszyć do: 

<?php
// Books/LatestBooks.php
namespace Books;

use PDO;

class LatestBooks
{
    private $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    /**
     * Find last added books
     *
     * @param $number int
     * defines how many books will be returned
     *
     * @return array
     */
    public function findLatest($number)
    {
        $result = $this->pdo->query('SELECT * FROM `books` ORDER BY id DESC LIMIT ' . $number . ' ');

        return $result->fetchAll();
    }
}

Pozniej w kodzie:  to tylko zrzut mojego kodu


<?php
 include_once('Books/LatestBooks.php');
 use Books\LatestBooks;

 $latestBooks = new LatestBooks($pdoConnection);
 $data = $latestBooks->findLatest(5);

 

Powinieneś mieć $data jako tablicę 0,1,2,3,4 gdzie klucz 0, to tablica asocjacyjna i wszystko co siedzialo w danym rekordzie w bazie

i pozniej wystarczy: 

foreach($data as $row) {
   echo $row['id'];
   echo $row['idt..'];
}

Nie wciskaj do klasy kodu html, bo będzie ona miala zbyt dużo zależności. 

Zainteresuj się: http://twig.sensiolabs.org/

Registering sniffs in the PSR1 standard... DONE (7 sniffs registered)
Creating file list... DONE (1 files in queue)
Changing into directory /var/www/XD/Books
Processing LatestBooks.php [PHP => 138 tokens in 29 lines]... DONE in 6ms (0 errors, 0 warnings)

 

komentarz 1 maja 2015 przez Ojcov Użytkownik (760 p.)

Dokonałem zmian i teraz kod klasy wygląda tak :
 

class LatestBooks{
		private $tytul;
		private $autor;
		private $opis;
		private $sciezka;
		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); 										
		}    //getData
}       //koniec klasy LatestBooks

A kod wywołujący tak :
 

require('inc/klasa.php');
	$pdo = new MyPDO();
	$book = new LatestBooks($pdo);
	$data = $book->getData(5);
foreach($data as $row) {

   echo "<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>  ";
}

Wszystko działa bez zarzutów ale czy to już jest poprawne?

komentarz 1 maja 2015 przez efiku Szeryf (75,160 p.)
edycja 1 maja 2015 przez efiku
Mój kod śmiało możesz skopiować jak chcesz.

Hmm zostaw tylko private $pdo..

w tym foreach lepiej Ci będzie jak usuniesz to echo i zrobisz tak:

foreach (....) {

?>

 tu dasz sobie kod html a zmienne te $row['tytul'] wyswietlaj tak:

<?= $row['tytul'] ?>

<?php
} // endforeach

a co masz w MyPDO ?

A i bez sensu są te komentarze w klasie, mam nadzieje, ze w notatnikach nie piszesz tylko IDE :)
komentarz 1 maja 2015 przez Ojcov Użytkownik (760 p.)
W pośpiechu zapomniałem usunąć te niepotrzebne składowe z klasy, teraz jest już tylko private $pdo, 
Foreach wygląda teraz tak. 

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
}   

Komentarze dodałem tak dla własnej wygody, niestety piszę nadal w notatnikach :/ Polecasz jakieś środowisko dla PHP? 

 

 

@edit : 
W MyPDO mam coś takiego, skorzystałem z gotowca z internetu 

class MyPDO extends PDO { 
    
    private $engine; 
    private $host; 
    private $database; 
    private $user; 
    private $pass; 
    
    public function __construct(){ 
        $this->engine = 'mysql'; 
        $this->host = 'localhost'; 
        $this->database = 'ksiazki'; 
        $this->user = 'root'; 
        $this->pass = ''; 
        $dns = $this->engine.':dbname='.$this->database.";host=".$this->host.";charset=utf8"; 
        parent::__construct( $dns, $this->user, $this->pass ); 
    } 
}



 

komentarz 1 maja 2015 przez efiku Szeryf (75,160 p.)

I co, chodzi? :) 

https://forum.pasja-informatyki.pl/10042/witam-jaki-wedlug-was-jest-najlepszy-edytor-do-php-i-javascipt?show=10062#a10062

 

Hmm, ale zauważ, że Klasa ta jest zależna też od Twojego MyPDO w konstruktorze. 

nie wiem co tam jest, nie lepiej dać PDO ? 

bo później możesz np połączenie z bazą zrobić singletonem:

<?php
/**
 * Created by PhpStorm.
 * User: efik
 * Date: 01.05.15
 * Time: 15:09
 * Books/Database.php
 */

namespace Books;


class Database {

    private static $instance;
    private $DBH;

    /**
     * @param $ConfigArray
     */
    public function  __construct(&$ConfigArray)
    {
        $dsn = $configArray['ENGINE'].
            ':host=' . $configArray['HOST'] .
            ';dbname=' . $configArray['DBNAME'] .
            ';port=' . $configArray['PORT'];

        $user = $configArray['USER'];
        $password = $configArray['PASS'];
        try {
            $this->DBH = new \PDO($dsn, $user, $password);
        } catch (\PDOException $e) {
            die("Something goes wrong while connecting to database.\n" . $e->getMessage());
        }
    }

    /**
     * @param $CONFIG
     *
     * @return Database
     */
    public static function getInstance(&$configArray)
    {
        if (!isset(self::$instance)) {
            self::$instance = new Database($configArray);
        }
        return self::$instance;
    }

    /**
     * @return \PDO
     */
    public function getPDO(){
        return $this->DBH;
    }
}

 

A w pliku gdzie dzieje się magia:

<?php
 use Books\LatestBooks;
 use Books\Database;

 // database config:
$config = Array(
    'ENGINE' => 'mysql',
    'HOST'   => '127.0.0.1',
    'USER'   => 'user',
    'PASS'   => 'pass',
    'DBNAME' => 'db',
    'PORT'   => '3306',
);
 $pdo = Database::getInstance($config)->getPDO();
 $latestBooks = new LatestBooks($pdo);
 $data = $latestBooks->findLatest(5); // lepiej tak nazwać metodę niż getData

 

komentarz 1 maja 2015 przez Ojcov Użytkownik (760 p.)
Jasne że chodzi :D
Popracuję jeszcze nad tym PDO ale to już we własnym zakresie i ściągnę sobie jakieś środowisko.
Dziękuję serdecznie za udzieloną pomoc :).
komentarz 1 maja 2015 przez efiku Szeryf (75,160 p.)
Spoko, luz :D

Twigiem się zainteresuj, dałem Ci tam linka też :)!

Podobne pytania

0 głosów
2 odpowiedzi 348 wizyt
pytanie zadane 26 kwietnia 2016 w Nasze projekty przez makoso Mądrala (7,380 p.)
0 głosów
3 odpowiedzi 446 wizyt
0 głosów
1 odpowiedź 227 wizyt
pytanie zadane 20 sierpnia 2017 w PHP przez Smatix Obywatel (1,050 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...