Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: cojack, dodany: 22.08.2009 09:56, tagi: php

Poznaliśmy już podstawy tejże klasy, potrafimy już oddzielać php od html’a, w b.małym stopniu, ale mimo wszystko coś tam robimy. Dziś postaram się pokazać jak zrobić menu 2 poziomowe w ITX oraz prosty przykład na zarządzanie akcjami z tym systemem szablonów.

Na początku prosty przykład z obsługi akcji. W pliku index.php po utworzeniu obiektu klasy, piszemy taki o to kod:

1
2
3
4
5
6
// (...)
$link = $_GET['akcja'];
if( is_file("./$link.php") ){
    $tpl->addBlockFile("ZMIENNA","nasza_nazwa_wymyslona_nowego_bloku","$link.tpl");
    @include_once("./$link.php");
}

I gdybyśmy coś takiego napisali, to jesteśmy w trupie, no nasza strona za pomocą ataków z $_GET padła by ofiarą w przeciągu paru dni… Więc każdy taki kod jest wart mniej niż 0, nie wolno tak pisać! Nie wolno includować plików prosto z adresu! Należy filtrować wszystkie dane przesyłane przez użytkownika!

Tak więc jak to najbezpieczniej zrobić? Dla mnie dobrym wyjściem jest przechowywać nazwy akcji w bazie danych, np tabela:

1
2
3
4
CREATE TABLE "akcja" (
  "id" serial,
  "nazwa" varchar(64) UNIQUE NOT NULL
);

I teraz po wybraniu wyniku z tabeli, wiemy czy dana akcja istnieje czy nie, zawsze ktoś do $_GET może dołożyć sobie ../ i będzie katalog wyżej, ale to też należy do naszych obowiązków sprawdzić co jest przesyłane w tym $_GET.

Dobra co jest czym? Tutaj akurat w tym przykładzie nie ma dużo co tłumaczyć, jest tylko jedna metoda.

addBlockFile, jak widać coś przyjmuje, przyjmuje 3 argumenty, pierwszy to nazwa zmiennej, czyli teraz dowiemy jak się to używa…

W kodzie templatki, głównej mamy jakąś ZMIENNA i ona zostanie zastąpiona przez blok zawartości, z pliku który podajemy jako trzeci argument, 2 argument, natomiast jest to nazwa bloku na którym możemy wykonywać operacje, w pliku index, a nie w pliku includowanym. Plik includowany odpowiada za działania wewnątrz tej templatki, czyli odpowiednie parsowanie itp.

Można to też w inny sposób zrobić, za pomocą metody addBlock, ta natomiast, nie parsuje nam zmiennej do bloku, tylko wymienia cały blok ;) Ale nie wiem jak to działa, bo nigdy nie stosowałem, jedno działa dobrze, to na cholerę mi drugie? ;]

Jak mogła by wyglądać taka templatka, a np system artykułów, np:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Tomasz Sh4dow Budzyński, dodany: 21.08.2009 12:02, tagi: php

Trudno mi powiedzieć co to takiego jest, albo raczej jak to nazwać. Kto używa Linuksa spotyka czasami się z wersją instalatora w postaci pliku .sh który dużo waży jest skryptem ale z sporym bagażem. Wszystko ładnie po otwarciu pliku widoczny jest rzeczywiście skrypt shell’a, ale jeśli przewiniemy wystarczająco nisko zobaczymy tam „krzaczki” czyli dane do rozpakowania. No więc tak właśnie mechanizm stworzyłem na własny i przy okazji służbowy użytek. Sama zasada działania jest prosta. Uruchamiany jest skrypt który Odczytuje sam siebie i rozpakowuje sam siebie. Niby nic trudnego, kwestia tylko przesunąć wskaźnik do miejsca gdzie zaczynają się dane do rozpakowania a kończy skrypt. Jedyne co trzeba zrobić to stworzyć taki plik. A do tego tez napiszemy automacik. Lubie automatyzować co tylko się da bo tak się żyje prościej (czasami) :) Jako że wykorzystamy do tego rozszerzenie zlib możemy pakować pliki jeden za drugim, nie kompresujemy dużej ilości plików tylko każdy po kolei. Struktura pliku będzie wyglądać następująco: Skrypt >> ([10 bajtowy nagłówek z liczba określającą długość skompresowanego pliku] >> [skompresowany plik z pełną ścieżka i nazwą pliku] ) x Dowolną ilość razy >> [end] (znacznik kończący). Sam sens jest dość prosty. Najlepsze jest to że wielkość pliku nie wpłynie na ilość „pochłoniętej” pamięci, ponieważ na końcu skryptu „zabijamy” interpreter poprzez die() i zamykamy interpreter poprzez ?>. W pierwszym nagłówku można by się postarać o bardziej finezyjną formę ale w chwili obecnej chodzi mi raczej o prostotę rozwiązania. w pierwszych 10 bajtach jest jawna, nieskompresowana liczba, która określa jak ile należy przeczytać aby pobrać cały plik i go rozpakować. Nagłówek pliku jest dopełniany pustymi miejscami do 10 znaków. Po tych znakach od razu rozpoczyna się skompresowany plik. Po zakończeniu pliku Rozpoczyna się kolejny 10 bajtowy nagłówek a po nich kolejny plik i tak dopóki zamiast 10 bajtowego nagłówka pojawi się string „[end]” oznaczający po prostu koniec pliku. Aby wszystko działało musimy mieć dwa pliki wykonujące oraz katalog w którym znajdują się pliki do zainstalowania. Pierwszy plik wykonujący to skrypt rozpakowujący, ale bez danych o plikach. Taki powiedzmy szablon. który zostanie skopiowany, zmodyfikowany o pewna wartość a następnie dodany do niego „bagaż”. Drugi plik to ów automacik który wykona za nas całą brudną robotę pakowania i modyfikacji szablonu. Pierwszym krokiem jest oczywiście skopiowanie szablonu, obliczenie jego długości „na pusto” i zmodyfikowanie go tak, aby wiedział od którego miejsca zaczyna się pierwszy nagłówek. W szablonie zostawimy taka linijke

$seek = $xx;

Wstawione zmienna $xx jest unikalna i pojawia się tylko raz. Użyłem zmiennej a nie unikalnego „dziwnego” string’a aby edytor PHP nie pokazywał mi błędu. Wygodniej się wtedy pracuje. Oczywiście jeśli wielkość szablonu jest różny niż 3 cyfrowa liczba, to należy tą liczbę zmodyfikować, aby po dodaniu pokazywała na dobre miejsce. Dlaczego 3 cyfrowa ? Bo zastępuje ona 3 znakowy string oznaczający zmienną.

$desc = './init.php';
$size = filesize($desc);
if( strlen( (string)$size ) != 3 )  {
	$size =  $size + (strlen( (string)$size ) - 3);
}
file_put_contents($desc, str_replace('$xx', $size, file_get_contents($desc) ) );

Po zmodyfikowaniu szablonu, rozpoczynamy kompresje i doklejanie danych.

$content = gzcompress($filename.'__++__'.file_get_contents( $filename() ), 9 ); 
// __++__ służy jako unikalny znak rozdzielający ścieżke pliku od jego zawartości
$size = (strlen($content));
$size = str_pad($size, 10);
file_put_contents($desc, $size.$content, FILE_APPEND );
 
file_put_contents($desc, str_pad('[end]', 10), FILE_APPEND );
chmod($desc, 0755);

Oczywiście unikalny string „__++__” można zastąpić innym lub też zmodyfikować nagłówek tak, aby pomieścił długość danych oraz nazwę pliku. Można by też to skompresować dla mniejszej ilości danych ale należy tak dobrać tak długość nagłówka aby na pewno pomieścił wszystkie dane. Co oczywiście przy dłuższych nazwach plików lub ogólnie dłuższych ścieżkach może komplikować sprawę. Może kiedyś zmodyfikuje żeby było bardziej pro :) To na tyle jesli chodzi o kompresje, zakończenie pliku oraz ustawienie prac do wykonania. Wszystko później ubierzemy w jakiś ładny Iteratorek Rekursywny po katalogu do tego jakaś pętelka i już jesteśmy w domu. Działające pliki oczywiście na samym dole wpisu.

A jak działa sam szablon ? To proste. Odczytuje wartość przesunięcia i zmienia pozycje wskaźnika do pliku i odczytuje 10 bajtów nagłówka.

$seek = 786; //przykładowa wartość 
$end = false; //flaga dla ostatniego pliku
$gz = fopen(".$argv[0].", "r"); //wywolanie pliku z lini polecen przekazuje nazwe pliku w 0 elemencie tablicy $argv
fseek($gz, $seek); //przesuwamy wskaźnik
$size = trim( fread($gz, 10) ); //czytamy 10 bajtów nagłówka
if( $size == '[end]') {	$end = true; continue; 	} //szukanie znacznika koncowego
$seek += 10; // przesuwamy wartość o wielkość nagłówka

Po wykonaniu tego kodu mamy już ilość danych do przeczytania oraz zmienna gdzie mamy wartosc do jakiej mamy przesunąć wskaźnik aby trafił na początek danych pliku.

No więc czas odczytać zawartość pliku oraz jego nazwę, zapisać na dysk i tak dalej.

fseek($gz, $seek); //przesuwamy wskaźnik za nagłówek
$file = gzuncompress( fread($gz, $size) ); //odczytujemy dane i odrazu dekompresujemy
list($filename, $content) = explode('__++__', $file); //rozdzielamy nazwe pliku i dane
//sprawdzamy czy ewentualny katalog do pliku istnieje jesli nie to będziemy go tworzyć
$dir = dirname($filename);
if( !file_exists( $dir ) ) {
	mkdir($dir, 0755, true);
	echo "Directory $dir ... created\n";
}
//sprawdzamy czy sam plik istnieje
if( file_exists($filename) ) {
	echo "Error ! $filename allready exists !\n";
} else {
	file_put_contents($filename, $content);
	echo "$filename ... created\n";
}
//przesuwamy wartość o wielkość odczytywanych danych, co powinno wskazywać na nagłówek następnego pliku
$seek += $size;

I kolejny raz wystarczy ubrać wszystko w pętelke i wszystko będzie działać ładnie.

W obu skryptach można pokusić się o wiele udoskonaleń. Poprawić nagłówki aby trzymały, wielkość, nazwę pliku, jego uprawnienia. Dodatkowo szablon może sprawdzać wersje PHP czy posiada rozszerzenie „zlib„. W szale nudów można by stworzyć ładny wygląd przy rozpakowywaniu, jakiś progress bar albo nawet wizualizacje pod konsolą Linuksa w dodatku ncurses. Można stworzyć samo wyzwalacz po rozpakowaniu, powiedzmy ładujący baze danych czy cokolwiek innego.

Modyfikacje pozostawiam czytelnikom którzy przypadkiem trafili na tą stronę i się zgubili i trafili na koniec tego posta. Swoje modyfikacje zaprezentuje pewnie w późniejszym czasie. Poniżej w pełni działający szablon oraz „kompresor”.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: thejw23, dodany: 18.08.2009 10:42, tagi: php

nie wiem, czy wszyscy wiedza, ale google udostepniolo GAPI - Google Analytics API PHP Interface, czyli nic innego jak mozliwosc generownia raportow bezposrednio na stronie, ktora tworzymy - nie trzeba sie logowac na stronach google, mozna od razu wygenerowac np. kilka interesujacych nas raportow bezposrednio w administracji danej strony www.nie korzystalem, ale przyklady wydaja sie bardzo proste - oby tak to dzialalo w rzeczywistosci :)EDIT:tutaj jest pelna lista rzeczy, ktore mozemy pobrac za pomoca API. a tutaj glowna strona z Client Libraries & Sample Code, z innymi bibliotekami niz PHP.

Autor wpisu: eRIZ, dodany: 08.08.2009 01:27, tagi: apache, php

Nie da się temu zaprzeczyć - Erlang ma dość dziwną składnię, momentami naprawdę się ciężko połapać po siedzeniu w językach typowo klamerkowych (vide: C, PHP, JS, etc), ale możliwości napisanych w nim aplikacji naprawdę poraża.

I jak by tu nie próbować czegoś nowego? Ejabberd (demon Jabbera) świetnie się sprawuje, przez samą konstrukcję języka, w którym został napisany, koder ma dostęp do potężnego środowiska, które poradzi sobie w naprawdę trudnych warunkach. Dla przykładu - ktoś się pofatygował, aby przetestować Apache w porównaniu do YAWS. Wyniki - szczerze mówiąc - mnie zszokowały…

Autor wpisu: thejw23, dodany: 30.07.2009 00:11, tagi: php

do grona niewielkich programow ulatwiajacych codzienna prace przy komputerze dolaczylem ostatnio TreePad Lite. jest to niewielki program pozwalajacy tworzyc kategorie (podkategorie itd) a nastepnie przypisywac im notatki. po co to na codzien? ano po to: widze ciekawy skrypt php - pstryk, dodalem go do biblioteczki php. link to smiesznego filmu? copy-paste i mam go. js, css? copy-paste i sa moje. i tak dalej. plus jest taki, ze mam wszystko w jednym niewielkim, lekkim dla systemu programie, w postaci tekstu, a nie html. nie musze szukac w kilku miejscach - mam jedna baze z tego typu rzeczami. a sam program nie integruje sie z systemem, mozna na pendrive nosic.druga rzecz to Anuko TimeTracker. jest to niewielka aplikacja php/mysql ulatwiajaca kontrole czasu nad poszczegolnymi elementami projektu. przeznaczona jest bardziej dla freelancera niz managera projektu w firmie i spelnia swoje zadanie calkiem niezle. mozna tu wiec dodac firmy, projekty i zadania. przypisywac codziennie czas spedzony nad poszczegolnymi rzeczami i na koniec wygenerowac raport. calosc ma czytelny interface, sama obsluga jest bardzo prosta i intuicyjna.owszem, mozna chciec wiecej. np. taki Mantis z wygodnym zarzadzaniem czasem dla kazdego zadania. ale za darmo nie ma (czytaj: nie znam) lepszych rozwiazan. to nie jest jakis wielki problem pracowac z Mantisem i na koniec dnia dodac w TimeTracker czas + info na ktore bug`i zostal on przeznaczony. tym bardziej, ze nie zawsze kontrola czasu musi byc widoczna przez innych uzytkownikow Manisa, czasem (zalezy od projektu) robi sie ja tylko dla siebie, aby wiedziec ile czasu zeszlo na poszczegolne rzeczy i latwiej to w przyszlosci oszacowac.oba wspomniane programy sa darmowe.

Autor wpisu: Zyx, dodany: 27.07.2009 14:30, tagi: php

Wraz ze wzrostem złożoności tworzonego systemu pojawia się problem jego należytego przetestowania. W obliczu dużej liczby zależności między komponentami, ręczne sprawdzanie wyników działania nie wchodzi w grę, chociażby z uwagi na uciekający czas. Rozwiązaniem są testy automatyczne. W przypadku PHP, jednym z najlepszych pakietów do testowania jest PHPUnit wzorowany na javowym JUnit. W tym wpisie pragnę opisać, jak można zbudować środowisko do testowania naszego projektu.

Autor wpisu: eRIZ, dodany: 27.07.2009 01:12, tagi: internet, apache, php, skrypty

mod_rewrite, rewriting, przyjazne URL-e/adresy, maskowanie, przepisywanie, nazw jest sporo. Zresztą, najpopularniejsza pochodzi od swojego protoplasty - czyli mod_rewrite powstałego pod skrzydłami Apache’a jako moduł. Teraz właściwie standard, jeśli chodzi o nowoczesne strony www - nie tylko ze względu na wygląd, ale i (jak ptaszki ćwierkają, choć jest to wątpliwe wobec oficjalnych źródeł) SEO.

Jak zwał, tak zwał, adres http://example.org/kawalek/adresu wygląda dużo estetyczniej i jest łatwiejszy do zapamiętania niż potworki typu http://example.org/?kawalek=adresu&i=jeszcze&inny=fin

Niby nie jest to takie skomplikowane, ale niektóre sytuacje wydają się nie do rozwiązania.

Uwaga, notka tasiemcowata, więc jest spis treści. Polecam się również uzbroić w odpowiednią ilość czasu. ;]

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.