Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] Simple PHP Engine
Forum PHP.pl > Inne > Oceny
Neproify
Witajcie! W dniu dzisiejszym zacząłem tworzenie Simple PHP Engine - będzie to "framework" do tworzenia różnorakich stron. Obecnie obsługuje tylko bazy danych, jednak jestem w trakcie pracy nad systemem szablonów oraz aplikacjami(tworzonymi podobnie jak w IPB). Cały projekt jest na bieżąco udostępniany w repozytorium na githubie:
Github
Całość pisana jest obiektowo, do połączenia między bazą danych MySQL używane jest PDO.
UWAGA! DANE W MYSQL NIE SĄ FILTROWANE, CO UMOZLIWIA SQL INJECTION(jest to w planach).

Zapraszam do oceny tych kilku linijek, podawania błędów(chociaż wolałbym, żeby ich nie było wink.gif).
pedro84
Nie oszukujmy się - nie ma co oceniać. Wróć jak będzie coś gotowe.
Neproify
Cytat(pedro84 @ 6.09.2014, 23:07:53 ) *
Nie oszukujmy się - nie ma co oceniać. Wróć jak będzie coś gotowe.

W takim razie wrócę gdy zrobię podstawy systemu szablonu i będę mógł powiedzieć, że "coś" tu jest. wink.gif
Pyton_000
globals.. do poprawki.
Wiesz co to wzorce archotektoniczne? Dependency Injection??
destroyerr
Pokuszę się o ocenę tego co jest na chwilę obecną. Wybacz, ale nie będzie przyjemnie.
Plik index.html w każdym folderze do wyrzucenia.
Zmień nazwy plików zawierające klasy, skorzystaj ze standardu PSR.
Zbędny tabulator na początku każdej linijki.
  1. if(!IN_ENGINE)
  2. {
  3. exit();
  4. }

Takie coś od razu wyrzuć i zapomnij o tym.
Klasa DB zupełnie bezsensowna. Mogę się połączyć z tylko bazą danych mysql i tylko na domyślnym porcie. Nie mogę się zabezpieczyć przed sql injection pomimo, że korzysta ta klasa z PDO, które daje taką możliwość.
  1. $this->queryHandler=array();
  2. $this->queryHandler = $this->link->query($content);

Nie ma sensu, żebyś ustawiał wartość na zmiennej, żeby zaraz i tak ją nadpisać.

W klasie Template używasz funkcji exit(). Jeśli chcesz przerwać to rzuć wyjątek to przynajmniej będzie wiadomo co i gdzie się stało.
Zapytania w klasie odpowiedzialnej za szablony to totalna porażka. Sposób ich budowania też.
Klasa Core to już całkowita rozpacz. Nie wiadomo za co jest odpowiedzialna, zależności zaszyte wewnątrz. Mówiąc krótko kod strukturalny opatrzony słowem kluczowym class.
!*!
Cytat
Dołączył: Wczoraj, 20:27
W dniu dzisiejszym zacząłem tworzenie Simple PHP Engine - będzie to "framework" do tworzenia różnorakich stron.

thumbsupsmileyanim.gif

To chyba jedyny system szablonów, który oparty jest o bazę danych.

Tuminure
Cytat
globals.. do poprawki

Powiedz to twórcom Laravela, Kohany i pewnie każdego innego fw.
irekk
Swoją drogą po co kolejny framework w dodatku pisany w sposób pseudo obiektowy? 11 lat temu takie coś siedziało w phpbb.

Poczytaj o zapytaniach sparametryzowanych
Poczytaj o standardach PSR-0 - PSR-4
Poczytaj o wzorcach projektowych (typu fabryka, dekorator, obserwator, aktywny rejestr, kompozyt) oraz wzorcu architektonicznym MVC
Poczytaj o Dependecy Injection i testach jednostkowych
Zobacz jak to robią inni.
Pobaw się najpopularniejszymy frameworkami typu symfony, zend, codeigniter, laravel...

Moim zdaniem, jak chesz się uczyć PHP to lepiej zacząć robić to tak jak to robią inni dzisiaj a nie wzorować się na kodzie napisanym wieki temu.
Neproify
Cytat(destroyerr @ 7.09.2014, 11:38:03 ) *
Pokuszę się o ocenę tego co jest na chwilę obecną. Wybacz, ale nie będzie przyjemnie.
Plik index.html w każdym folderze do wyrzucenia.
Zmień nazwy plików zawierające klasy, skorzystaj ze standardu PSR.
Zbędny tabulator na początku każdej linijki.
  1. if(!IN_ENGINE)
  2. {
  3. exit();
  4. }

Takie coś od razu wyrzuć i zapomnij o tym.
Klasa DB zupełnie bezsensowna. Mogę się połączyć z tylko bazą danych mysql i tylko na domyślnym porcie. Nie mogę się zabezpieczyć przed sql injection pomimo, że korzysta ta klasa z PDO, które daje taką możliwość.
  1. $this->queryHandler=array();
  2. $this->queryHandler = $this->link->query($content);

Nie ma sensu, żebyś ustawiał wartość na zmiennej, żeby zaraz i tak ją nadpisać.

W klasie Template używasz funkcji exit(). Jeśli chcesz przerwać to rzuć wyjątek to przynajmniej będzie wiadomo co i gdzie się stało.
Zapytania w klasie odpowiedzialnej za szablony to totalna porażka. Sposób ich budowania też.
Klasa Core to już całkowita rozpacz. Nie wiadomo za co jest odpowiedzialna, zależności zaszyte wewnątrz. Mówiąc krótko kod strukturalny opatrzony słowem kluczowym class.

Co do tabulatorów nie wiem czemu tak jest - w notepadzie++ wszystko jest dobrze...
Co do klasy DB - postaram się to poprawić(a raczej na pewno poprawię). Wezmę pod uwagę to, że niektórzy korzystają z innego portu i dodam to.
Co do użycia "showError", tymczasowo wyświetla on tylko tekst na ekranie i zatrzymuje skrypt. Docelowo będzie to "złączone" z szablonami - żeby było estetycznie. wink.gif showError to funkcja, którą każdy może użyć z poziomu aplikacji(gdy ktoś próbuje wejść gdy jest nie zalogowany np. gdzieś tam).
Co do budowania zapytań - masz jakiś "najlepszy" sposób(prefiksy a potem dane).
Core tymczasowo odpowiada tylko za uruchomienie "aplikacji"(czyli ostatnie cztery linijki kodu, nie licząc klamer). Reszta to ustawianie domyślnych wartości dla domyślnej aplikacji. A tam nie ma jak zbytnio tego zrobić obiektowo.
Rady wezmę do klawiatury i postaram się to poprawić.

Lepsza jest konstruktywna krytyka niż "lizanie dupy", bo można się nauczyć czegokolwiek.
Spawnm
Cytat(Tuminure @ 7.09.2014, 12:29:37 ) *
Powiedz to twórcom Laravela, Kohany i pewnie każdego innego fw.

Serio ko i laravel używają globali? W których plikach? o.O
Pyton_000
Też bym chciał to zobaczyć, ale kurde szukałem i jakoś nie udało mi się. Może używam jakieś starej wersji w której nie było ich. hmm... muszę zrobić update i sprawdzić.
Neproify
Cytat(!*! @ 7.09.2014, 12:02:59 ) *
thumbsupsmileyanim.gif

To chyba jedyny system szablonów, który oparty jest o bazę danych.

To, że jestem na tym forum od wczoraj nie oznacza, że nigdy nie miałem styczności z php...
!*!
Cytat(Neproify @ 7.09.2014, 14:04:07 ) *
To, że jestem na tym forum od wczoraj nie oznacza, że nigdy nie miałem styczności z php...


To oczywiste, świeżak nie opanowałby gita wink.gif Po prostu zawsze takie posty wywołują u mnie uśmiech. Jednakże trzymam kciuki, zawsze jest miejsce na nowe projekty i odrobinę świeżego spojrzenia.
Neproify
Cytat(!*! @ 7.09.2014, 14:12:54 ) *
To oczywiste, świeżak nie opanowałby gita ;) Po prostu zawsze takie posty wywołują u mnie uśmiech. Jednakże trzymam kciuki, zawsze jest miejsce na nowe projekty i odrobinę świeżego spojrzenia.

To masz uśmiech na stałe pewnie już. biggrin.gif

Za chwilkę dodam TODO - będziecie widzieli co psuje. tongue.gif
Panowie, to spytam tak na szybko. Czy taki kod jest bezpieczny przed SQL Injection?
Kod
$curModule = htmlspecialchars($_GET['module']);
                $db->prepare('SELECT * FROM applications_modules_public WHERE application = ? AND name = ? LIMIT 1;');
                $db->execute(array($curApp, $curModule));
                $curModule = array();
                $curModule = $db->fetch();
Spawnm
htmlspecialchars dajemy po pobieraniu danych z bazy, a przed wyświetleniem. W dodatku ta funkcja ma flagi którymi warto się zainteresować.
$_GET przefiltrował bym przez iconv oraz rzutował na stringa bo ktoś może ci tablicę wysłać.
by_ikar
Cytat(Spawnm @ 7.09.2014, 13:54:07 ) *
Serio ko i laravel używają globali? W których plikach? o.O


Pewnie miał na myśli fasady (laravel) czy inne obiekty z metodami statycznymi (::getInstance) wink.gif
Pyton_000
a co ma globals do Fasad z L4 ? wink.gif Poza faktem posiadania IoC?
by_ikar
No jak to nie wiesz? Przecież to są metody statyczne, więc to samo co global. Tak przynajmniej mi się wydaje, bo innego wytłumaczenia na podanie laravela czy "innych" fw jako używających "global" tutaj nie widzę..
Spawnm
Niech @Tuminure się wypowie co miał na myśli.
Tuminure
Mój błąd, nie sprawdziłem dokładnie, a zaledwie strzeliłem zwykłe wyszukiwanie po plikach.

Globale wprawdzie są ale w zewnętrznych bibliotekach.
Kohana: https://github.com/kohana/userguide/blob/3....wn/markdown.php
Laravel: phpseclib.
Neproify
Przebudowałem zapytania z wykorzystaniem funkcji prepare.
Powoli zacznę wycofywać się ze zmiennych globalnych. Czeka mnie trochę roboty, ale powinno być lepiej. wink.gif
Pyton_000
Zacznij od nowa zamiast przepisywać kawałki, szybciej Ci pójdzie
Neproify
Nie napisałem od nowa - powód był prosty. W momencie, gdy to napisałeś miałem już poprawione ponad 90% kodu.

Jedynym "globalem" jest $dbconfig, gdyż, iż, dlatego, że przechowuje dane do bazy danych.
lukasz_os
Ale po co tam global... zrób sobie plik konfiguracyjny w którym zapiszesz te dane i napisz sobie klase do łaczenia sie z baza danych która korzysta z tego pliku.
Neproify
Okej panowie. Znalazłem wreszcie czas by dopisać kilka linijek kodu - od teraz szablony mają "obsługę" zmiennych, które należy używać w ten sposób: {$zmienna}.
Dodałem również dodatkowy argument do addContent w Template - zmienne w array.
Jeśli chcecie używać zmiennych musicie ustawić je w kolumnie Varliables w tabeli Templates w sposób: "$zmienna1, $zmienna2", itd.
Forti
Nie rozumiem dlaczego {$zmienna} jest lepsze niż <?= $zmienna ?> - przynajmniej na pierwszy rzut oka wiadomo o co chodzi ;]
Neproify
Cytat(Forti @ 12.09.2014, 17:02:33 ) *
Nie rozumiem dlaczego {$zmienna} jest lepsze niż <?= $zmienna ?> - przynajmniej na pierwszy rzut oka wiadomo o co chodzi ;]

Gdyż będziesz edytował szablony z poziomu ACP. Szablon będzie składał się ze zmiennych, pętli(foreach zapewne), warunków(czyli np. jeśli są "newsy" to wyświetlasz, jak nie, to wyświetlasz że nie ma). Całość jest jak widać odseparowana - w pliku php będziesz pobierał dane, a w szablonie będziesz je obrabiał i wyświetlał.
Forti
czyli w zasadzie tworzysz odpowiednig twig czy smarty, dobrze rozumiem?


edit: generalnie nadal widać $global smile.gif gdzieś pisałeś, że to zmieniasz.
Neproify
Cytat(Forti @ 12.09.2014, 17:10:53 ) *
czyli w zasadzie tworzysz odpowiednig twig czy smarty, dobrze rozumiem?


edit: generalnie nadal widać $global smile.gif gdzieś pisałeś, że to zmieniasz.

W którym fragmencie?

Nie do końca. Szablony będą rozwiązane podobnie, ale będzie kilka rzeczy "dodatkowych".
Forti
  1. public function addContent($group, $skin, $varliablesContent = array())
  2. {
  3. global $dbconfig;
Neproify
Cytat(Forti @ 12.09.2014, 17:25:15 ) *
  1. public function addContent($group, $skin, $varliablesContent = array())
  2. {
  3. global $dbconfig;


Oj, zapomniałem o tym. Zaraz zrobię zwracanie prefixu przez klasę DB i to usunę.

Edit:

Gotowe.

Edit2:
Dodałem obsługę CSS - dodaje się je poprzez addCSS z klasy Template(addCSS(nazwa)).
Forti
  1. public function addCSS($name)
  2. {
  3. $this->db->prepare('SELECT * FROM `'.$this->db->getPrefix().'templates_css` WHERE `name`=? LIMIT 1;');
  4. $params = array($name);
  5. $this->db->execute($params);
  6. $style = $this->db->fetch();
  7. $this->content .= '<style>'.$style['content'].'</style>';
  8. }


nie bardzo rozumiem wink.gif wybacz, że zapytam (od tego jest forum hm...), ale w jaki sposób przewidujesz działanie tego?
Neproify
Cytat(Forti @ 12.09.2014, 18:13:45 ) *
  1. public function addCSS($name)
  2. {
  3. $this->db->prepare('SELECT * FROM `'.$this->db->getPrefix().'templates_css` WHERE `name`=? LIMIT 1;');
  4. $params = array($name);
  5. $this->db->execute($params);
  6. $style = $this->db->fetch();
  7. $this->content .= '<style>'.$style['content'].'</style>';
  8. }


nie bardzo rozumiem wink.gif wybacz, że zapytam (od tego jest forum hm...), ale w jaki sposób przewidujesz działanie tego?

Jak najbardziej działa. Może nie wygląda to estetycznie, ale działa jak powinno.
Forti
czyli nazwy plików z css trzymasz w bazie? Nie wiem jak to się robi we frameworkach, cms'ach itp, ale wydaje mi się to trochę bezsensu.
Neproify
Cytat(Forti @ 12.09.2014, 18:26:27 ) *
czyli nazwy plików z css trzymasz w bazie? Nie wiem jak to się robi we frameworkach, cms'ach itp, ale wydaje mi się to trochę bezsensu.

Nie nazwy, tylko zawartość. Potem będzie odwołanie do pamięci podręcznej - ale tymczasowo jest to rozwiązane tak(edycja z poziomu strony - najłatwiej operować na bazie).
Forti
No spotkałem się z tym do tej pory. Generowanie css z pliku .css, kodu html to tak na prawdę żadne obciążenie w porównaniu do zapisu do pamięci podręcznej, odwoływania się do bazy za każdym razem, a dodatkowo mamy szersze możliwości.

Jednak mogę się mylić wink.gif
Pyton_000
A możesz powiedzieć jaki jest sens trzymania tego w BD? Przecież możesz odpalać plik i ładować content do edycji a potem zapisać :|,
Ba, możesz sobie rekurencyjnie przeszukać katalog np. public/ pod kątem plików tpl, css, js itp.
Neproify
Od teraz nie można wykorzystywać zmiennych.
Szablony przyjmują tylko tablice(wcześniej tego nie robiły. ;o).
mls
Cytat(Neproify @ 12.09.2014, 21:25:38 ) *
Od teraz nie można wykorzystywać zmiennych.
Szablony przyjmują tylko tablice(wcześniej tego nie robiły. ;o).


Kolejny kompletnie bezsensowny pomysł.
No i sorry, jak ktoś nawet nie potrafi poprawnie zapisać po angielsku słowa "zmienna" (nie, to nie jest "varliable") to o czym tu mowa?
Neproify
Cytat(mls @ 12.09.2014, 22:06:44 ) *
Kolejny kompletnie bezsensowny pomysł.
No i sorry, jak ktoś nawet nie potrafi poprawnie zapisać po angielsku słowa "zmienna" (nie, to nie jest "varliable") to o czym tu mowa?

O kurde, rzeczywiście variable.
ohm
Tak na marginesie, jak chcesz uzyskać dużo lepsze wyniki a nie bawić się w takie "cosie" to polecam przyjrzeć się frameworkowi (a nie engine, czymkolwiek ten "php engine" ma być) o nazwie Silex. Prawdopodobnie jest to rzecz którą chciałbyś napisać od nowa smile.gif
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.