Archiwum kategorii ‘Darmowe artykuły’

Co się dzieje z tymi marginesami?

piątek, 25 Marzec 2011

Collapsing margins jest zjawiskiem zapadania się (można też spotkać określenie „załamywania”) marginesów pionowych elementów sąsiadujących lub zagnieżdżonych. Zaprezentuję to na przykładzie.

<div id="kontener">
	<p>Hello</p>
</div>

Tworzę blok div o identyfikatorze kontener, a w nim umieszczam akapit. Chcę by akapit miał zielone tło i był odsunięty od krawędzi bloku div o 20 pikseli. Natomiast blok div ma mieć tło zielone. Tworzę więc następujące style.

#kontener
{
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 20px; background-color: #00ff00;
}

To, co otrzymuję nie do końca spełnia moje oczekiwania.

Hello

O ile poziome marginesy zachowały się zgodnie z oczekiwaniami, to pionowe przeszły z akapitu do bloku div.

Problem dla konkretnego marginesu nie wystąpi, jeżeli przed lub po akapicie umieszczę jakąś zawartość.

Definicja stylu pozostaje bez zmian

<div id="kontener">
	Napis przed akapitem
	<p>Hello</p>
</div>

lub

<div id="kontener">
	<p>Hello</p>
	Napis po akapicie
</div>

Da mi odpowiednio

Napis przed akapitem

Hello

lub

Hello

Napis po akapicie

Margines pojawił się automatycznie od strony, z której umieściłem napis. Gdybym umieścił go po obu stronach, marginesy pojawiłyby się powyżej i poniżej akapitu. Co mam jednak robić jeżeli nie chcę umieszczać żadnej zawartości? W takiej sytuacji należy po prostu zmienić definicję styli.

<div id="kontener">
	<p>Hello</p>
</div>

Kod html pozostaje niezmieniony.

#kontener
{
	padding: 20px 0;
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 20px; background-color: #00ff00;
}

Do definicji styli elementu #kontener dodaję 20 pikseli dopełnienia górnego i dolnego. Daje to następujący efekt.

Hello

Tym razem odstępy są zbyt duże. Margines akapitu został oddzielony właściwością padding elementu div i tym samym został przez przeglądarkę uwzględniony. To co widzimy na stronie to suma marginesu akapitu i dopełnienia elementu div. Aby poprawić ostateczny efekt należy pozbyć się pionowych marginesów akapitu.

#kontener
{
	padding: 20px 0;
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 0 20px; background-color: #00ff00;
}

Wstawiam zero jako pierwszą wartość właściwości padding akapitu, czyli pionowe marginesy zostają wyzerowane przy niezmienionym stanie marginesów poziomych. Tym razem efekt jest następujący.

Hello

Co jednak, gdy będę chciał umieścić wewnątrz bloku div kilka akapitów tak, by pomiędzy nimi uzyskać 20 pikseli przerwy?

<div id="kontener">
	<p>Hello</p>
	<p>Hello</p>
	<p>Hello</p>
</div>

Hello

Hello

Hello

Dodam dla każdego akapitu marginesy pionowe: górny i dolny o wartości 10 pikseli. To powinno nam dać w sumie 20 pikseli przerwy. Aby odległość pomiędzy pierwszym akapitem, a górną krawędzią elementu div oraz pomiędzy ostatnim akapitem i dolną krawędzią elementu div nie została zwiększona do 30 pikseli. Zmniejszę wartość pionowego dopełnienia do 10 pikseli.

#kontener
{
	padding: 10px 0;
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 10px 20px; background-color: #00ff00;
}

Hello

Hello

Hello

Ponownie efekt nie jest zgodny z oczekiwanym. Tym razem marginesy pomiędzy akapitami zostały zredukowane do jednego marginesu. Gdyby marginesy akapitów górny i dolny nie były sobie równe. Odległość pomiędzy akapitami zostałaby zredukowana do większego z marginesów.

Aby marginesy były takie, jakie być powinny, wyzeruję jeden z marginesów akapitów, a drugi ustawię na 20 pikseli. Nie ma większego znaczenia, czy wyzeruję górny, a zwiększę dolny, czy odwrotnie. Będę tylko musiał pamiętać o zmianie odpowiedniego dopełnienia bloku div.

#kontener
{
	padding: 1px 0 20px;
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 20px 20px 0; background-color: #00ff00;
}

Każdy akapit ma margines górny równy 20 pikseli, marginesy poziome równe 20 pikseli i margines dolny równy 0. Natomiast dopełnienia elementu div zmieniły się odwrotnie. To dopełnienie górne zostało zredukowane wprawdzie do 1 piksela, a nie do 0, ale wyzerowanie tej wartości doprowadziłoby do zapadnięcia się marginesu górnego pierwszego akapitu w marginesie górnym bloku div, co obrazuje pierwszy przykład tej lekcji. Jeżeli nie potrzebujemy dokładności co do piksela, to rozwiązanie jest zupełnie zadowalające. Zresztą wystarczy spojrzeć poniżej.

Hello

Hello

Hello

Jeżeli jednak ta dokładność jest potrzebna, należy dodać jeszcze jedną właściwość w definicji stylu.

#kontener
{
	padding: 1px 0 20px;
	background-color: #ffff00;
}
 
#kontener p
{
	margin: 20px 20px 0; background-color: #00ff00;
}
 
#kontener p:first-child
{
	margin-top: 19px;
}

Selektor #kontener p:first-child wskazuje tylko na pierwszy akapit zawarty w elemencie #kontener i tylko dla niego zmniejsza górny margines do 19 pikseli, co łącznie z górnym dopełnieniem daje wartość 20. Niestety to rozwiązanie nie działa w przeglądarce IE nawet w wersji 8. Problem ten można ominąć nadając pierwszemu akapitowi dowolny identyfikator np: id=”pierwszy”. Wówczas selektor powinien wyglądać: #kontener p#pierwszy. Jeżeli takich fragmentów kodu na stronie mamy kilka, zamiast identyfikatora używamy klasy.

Hello

Hello

Hello

Prezentowany przypadek jest dosyć prosty, w praktyce można natknąć się na bardzo różne układy elementów i różne też będą zaplanowane efekty. Z tego względu powyższych rozwiązań nie należy bezmyślnie kopiować. Mają one jedynie wskazać ogólny kierunek szukania rozwiązań.

Jeżeli ktoś z czytelników spotkał się w swojej pracy z szczególnie interesującym problemem związanym z collapsing margins, to proszę o przysłanie kodu z opisem oczekiwanego rezultatu na adres trener@serwan.pl. Rozwiązanie 2-3 ciekawszych przykładów zaprezentuję w jednej z najbliższych lekcji. Zachęcam również do pozostawiania komentarzy poniżej.



Obejrzyj pierwszą lekcję…

środa, 2 Marzec 2011

Poniżej prezentuję pierwszą lekcję szkolenia „Bazy danych w aplikacjach internetowych”, oraz krótki słowniczek. Gdyby jeszcze jakieś terminy wymagały wytłumaczenia, proszę zgłaszać. Postaram się w miarę szybko uzupełnić słowniczek.

Dla większej wygody można powiększyć nagranie klikając ikonkę w prawym dolnym rogu filmu. Klip wymaga wtyczki Adobe Flash Player.

Słowniczek

rekord
wiersz tabeli, pojedynczy wpis do bazy o ustalonej strukturze
pole
najmniejsza część rekordu przechowująca daną określonego typu
klucz potencjalny
złożenia pól lub pojedyncze pola, których wartość jednoznacznie identyfikuje rekord tabeli
klucz podstawowy
może być też nazywany kluczem głównym. Jest to jeden z kluczy potencjalnych. Jeżeli tabela zawiera tylko jeden klucz potencjalny, automatycznie jest on kluczem podstawowym
klucz obcy
pole lub pola zawierające klucz podstawowy z innej tabeli
relacja
powiązanie rekordów z różnych tabel wykorzystujące klucze główne i obce tworzące logiczną całość. Występują trzy rodzaje relacji:

  1. relacja jeden do jednego

    jednemu rekordowi z pierwszej tabeli odpowiada tylko jeden rekord z tabeli drugiej

  2. relacja jeden do wielu

    jednemu rekordowi z pierwszej tabeli odpowiada jeden lub wiele rekordów z tabeli drugiej

  3. relacja wiele do wielu

    jednemu lub wielu rekordom z pierwszej tabeli odpowiada jeden lub wiele rekordów z tabeli drugiej. Tę relację w praktyce realizuje się poprzez dodanie dodatkowej tabeli, z którą realizowane są dwie relacje jeden do wielu

indeks
jest to dodatkowo utworzona struktura służąca zoptymalizowaniu operacji dotyczących danej kolumny. W uproszczeniu można powiedzieć, że jest to kopia kolumny odpowiednio posortowana.

Zapraszam na szkolenie Bazy danych w aplikacjach internetowych



Po co mi bazy danych.

wtorek, 22 Luty 2011

Wykorzystanie baz danych znacznie rozszerza możliwości programów. Programy tworzone w PHP często potrzebują jakiejś metody do przechowywania i przetwarzania danych. Najprostszym i najwcześniej wykorzystywanym sposobem było zapisywanie danych do plików tekstowych. Niestety możliwości wykorzystania takich zbiorów danych są mocno ograniczone, a implementacja tego rozwiązania rodziła wiele problemów związanych choćby z jednoczesnym dostępem do danych przez wielu użytkowników. Na szczęście większość kont hostingowych, nawet tych darmowych, jest wyposażonych w jakąś bazę danych. Najczęściej jest to MySql.

Jakie są zalety stosowania baz danych?

  1. każdą daną wystarczy wpisać jeden raz by była dostępna we wszystkich wymaganych miejscach
  2. łatwość aktualizacji danych
  3. umożliwienie jednoczesnego dostępu do danych dla wielu użytkowników
  4. możliwość ograniczania dostępu do danych dla różnych grup użytkowników
  5. uniwersalny język do przetwarzania danych (SQL)
  6. eliminacja błędów spójności bazy danych

Co to jest baza danych?

Baza danych to zbiór uporządkowanych danych z pewnej dziedziny. Dane są wzajemnie ze sobą powiązane związkami logicznymi pozwalającymi na wybranie zestawu danych pod odpowiednim do potrzeb kontem.

W dalszej części będę skupiał się na bazie MySql głównie ze względu na jej dużą popularność i ogólną dostępność. W zasadzie wszystkie darmowe skrypty wykorzystujące bazy danych (fora, blogi, CMS-y itp.) są oparte na MySql-u, a jeżeli skrypt jest dostosowany do różnych baz danych, to opcja z MySql jest najlepiej udokumentowana.

MySql jest relacyjną bazą danych. Dane w tym modelu przechowywane są w tabelach zwanych fachowo relacjami. Od razu zaznaczę, że fachowa terminologia nie jest zbyt popularna i pisząc o bazach danych będę używał raczej określeń powszechnie stosowanych, a terminy fachowe będę umieszczał w nawiasach. Tabele składają się z wierszy – rekordów (krotek – encji) – najmniejszych zbiorów danych dotyczących jakiegoś przedmiotu i kolumn (atrybutów) definiujących najmniejsze porcje danych. Np. tabela samochody będzie składała się z rekordów opisujących konkretne auta, a w kolumnach będą zdefiniowane cechy tych samochodów np. marka, model, rok produkcji, kolor itd. Poniżej prezentuję taką przykładową tabelkę.

marka model rok_produkcji kolor
Seat Ibiza 2001 czerwony
Volkswagen Golf 2003 niebieski
Peugeot 307 2003 srebrny
Opel Astra 2007 czarny
Ford Focus 2006 żółty

Rekordy z poszczególnych tabel mogą być powiązane relacjami (związkami encji). Wyróżniamy trzy rodzaje relacji: jeden do jednego, jeden do wielu i wiele do wielu. Relacja jeden do jednego zachodzi w sytuacji, gdy jednemu rekordowi z pierwszej tabeli odpowiada jeden rekord z drugiej tabeli. Relacja jeden do wielu zachodzi, gdy jednemu rekordowi z pierwszej tabeli odpowiada jeden lub więcej rekordów z drugiej tabeli. Relacja wiele do wielu zachodzi, gdy jednemu lub kilku rekordom z pierwszej tabeli odpowiada jeden lub więcej rekordów z drugiej tabeli. W praktyce ten ostatni typ relacji jest zastępowany dwoma relacjami jeden do wielu z dodatkową tabelą.

Relacja pomiędzy tabelami tworzone są dzięki kluczom – specjalnym polom identyfikującym rekordy w tabeli. Występują klucze główne zwane też podstawowymi i obce. Klucz podstawowy jest unikalny w ramach jednej tabeli. Zapisanie wartości klucza głównego w innej tabeli tworzy klucz obcy.



Ustalanie pozycji elementów w CSS cz. 1.

poniedziałek, 20 Grudzień 2010

Pozycjonowanie względne

W pozycjonowaniu względnym możemy przesuwać element względem pierwotnego położenia. Służą do tego właściwości left, right, top i bottom. Samo pozycjonowanie względne jest określane właściwością position: relative;. Poniżej przedstawiłem element pozycjonowany względnie w czerwonym obramowaniu. Dla większej jasności elementy pozycjonowane umieszczam w elemencie z szaro-niebieską ramką.

<div class="ramka">
	<div class="border" id="relative1">Element w pierwotnym położeniu</div>
</div>
#relative1
{
	position: relative;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element w pierwotnym położeniu


<div class="ramka">
	<div class="border" id="relative2">
	Element z właściwością left: 40px; - odsunięty od lewej krawędzi pierwotnego położenia o 40 pikseli
	</div>
</div>
#relative2
{
	position: relative;
	left: 40px;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element z właściwością left: 40px; – odsunięty od lewej krawędzi pierwotnego położenia o 40 pikseli


<div class="ramka">
	<div class="border" id="relative3">
	Element z właściwością right: 40px; - odsunięty od prawej krawędzi pierwotnego położenia o 40 pikseli
	</div>
</div>
#relative3
{
	position: relative;
	right: 40px;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element z właściwością right: 40px; – odsunięty od prawej krawędzi pierwotnego położenia o 40 pikseli


<div class="ramka">
	<div class="border" id="relative4">
	Element z właściwością bottom: 10px; - odsunięty od dolnej krawędzi pierwotnego położenia o 10 pikseli
	</div>
</div>
#relative4
{
	position: relative;
	bottom: 10px;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element z właściwością bottom: 10px; – odsunięty od dolnej krawędzi pierwotnego położenia o 10 pikseli


<div class="ramka">
	<div class="border" id="relative5">
	Element z właściwością top: 10px; - odsunięty od górnej krawędzi pierwotnego położenia o 10 pikseli
	</div>
</div>
#relative5
{
	position: relative;
	top: 10px;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element z właściwością top: 10px; – odsunięty od górnej krawędzi pierwotnego położenia o 10 pikseli


<div class="ramka">
	<div class="border" id="relative6">
	Element z właściwościami left: 40px; i top: 15px - odsunięty od lewej krawędzi pierwotnego 
położenia o 40 pikseli oraz od górnej krawędzi o 15 pikseli
	</div>
</div>
#relative6
{
	position: relative;
	left: 40px;
	top: 15px;
}
.border
{
	margin: 15px;
	border: 2px solid #b80400;
	padding: 10px;
}
.ramka
{
	width: 350px; 
	border: 1px solid #9999cc;
}
Element z właściwościami left: 40px; i top: 15px – odsunięty od lewej krawędzi pierwotnego położenia o 40 pikseli oraz od górnej krawędzi o 15 pikseli

Zachęcam do pozostawieni swoich uwag i komentarzy poniżej.



Programowanie obiektowe w PHP – lekcje 4 i 5.

poniedziałek, 15 Listopad 2010

Poniżej prezentuję kolejne fragmenty szkolenia Programowanie obiektowe w PHP. Jutro następna część, a za kilka dni pełne szkolenie znajdzie się w ofercie Serwan.pl.

Słowniczek

pole klasy / właściwość klasy
zmienna dowolnego typu zawarta w klasie. Polem klasy może być również tablica lub obiekt.
metoda
funkcja zawarta w klasie
konstruktor
Metoda klasy uruchamiana automatycznie podczas tworzenia obiektu danej klasy. Do konstruktora można przekazywać argumenty. Ten temat poruszam w lekcjach 6-8.
destruktor
Metoda klasy uruchamiana automatycznie podczas usuwania obiektu danej klasy. Do destruktora nie przekazuje się argumentów. Destruktor omawiany jest w lekcji 9.

Dla większej wygody można powiększyć nagranie klikając ikonkę w prawym dolnym rogu filmu. Klip wymaga wtyczki Adobe Flash Player.

Ostatnia instrukcja powyższego przykładu jest trochę dziwna. Do metody „metoda1″ obiektu „obiekt” jest przekazywane pole tego samego obiektu, chociaż byłoby ono dostępne wewnątrz klasy poprzez referencję $this. Przekazanie tej wartości jawnie na liście argumentów jest spowodowane tym, by można było do tej metody przekazywać również inne wartości np. pola innych obiektów, wyniki działania dowolnej funkcji zwracającej liczbę, lub jawnie konkretną wartość. Ten ostatni przypadek realizowany jest w przykładzie poniżej.

Oczywiście wszelkie komentarze są mile widziane.



Programowanie obiektowe w PHP – lekcja 3.

niedziela, 14 Listopad 2010

Poniżej prezentuję trzeci fragment szkolenia Programowanie obiektowe w PHP. Jutro kolejna część, a w przyszłym tygodniu pełne szkolenie znajdzie się w ofercie Serwan.pl.

Słowniczek

abstrakcja
klasa może być modelem abstrakcyjnym dla innych klas dziedziczących po niej. Pojęcie to jest blisko związane z dziedziczeniem w szczególności po klasach abstrakcyjnych. Klasy i metody abstrakcyjne omawiam w lekcjach 35-39. Czasami abstrakcją nazywane jest też odwzorowanie rzeczywistych modeli w strukturze klasy (abstrakcja danych i procesów). Klasa samochód byłaby abstrakcją rzeczywistego samochodu, zawarta w klasie właściwość silnik byłaby abstrakcją części samochodu, a metoda jedź – abstrakcją funkcji samochodu.
przesłanianie pól i metod
Jest to redefiniowanie / nadpisywanie pól i metod klasy bazowej w klasie pochodnej. Ten temat poruszam w lekcjach 11 i 12.
metody wirtualne
W PHP każda metoda, która została przesłonięta w klasie pochodnej staje się metodą wirtualną. W innych językach wymagałoby to zastosowania specjalnej techniki (np. poprzedzenie definicji metody słowem virtual) w PHP mamy to z automatu. Ten temat poruszam w lekcji 11.
polimorfizm (wielopostaciowość)
mechanizm który pozawala wywołanie metod o takiej samej nazwie zawartych w różnych obiektach w zależności od kontekstu wywołania metody. Przykład polimorficznego wywołania metody zawiera lekcja 11.

Dla większej wygody można powiększyć nagranie klikając ikonkę w prawym dolnym rogu filmu. Klip wymaga wtyczki Adobe Flash Player.

Oczywiście wszelkie komentarze są mile widziane.



Programowanie obiektowe w PHP – lekcja 2.

sobota, 13 Listopad 2010

Poniżej prezentuję drugi fragment szkolenia Programowanie obiektowe w PHP. Jutro kolejna część, a w przyszłym tygodniu pełne szkolenie znajdzie się w ofercie Serwan.pl.

W komentarzach pod wczorajszą lekcją pojawiły się pojęcia:

  • izolacja kodu
  • dziedziczenie
  • klonowanie

Te i wiele innych pojęć omawiam w kolejnych lekcjach choć nie zawsze muszą być tak nazwane. Dla większej przejrzystości i wygody będę umieszczał po kilka definicji przy każdej lekcji.

hermetyzacja/enkapsulacja (izolacja kodu, kapsułkowanie, ukrywanie informacji)
zamknięcie i ukrycie przed kodem zewnętrznym kodu i pól wewnątrz klas. Klasy udostępniają jedynie swój interfejs, za pośrednictwem którego możliwe jest wykorzystanie kodu zawartego w metodach klas i użycie pól tych klas. Technicznie służą temu omawiane w lekcji poniżej kwalifikatory dostępu. Hermetyzacja uodparnia program na błędne użycie obiektów oraz umożliwia podział procesów na prostsze czynności.
dziedziczenie
mechanizm który pozawala na tworzenie hierarchii klas od najbardziej ogólnych do szczegółowych. Wspólna funkcjonalność jest zawarta w klasach ogólnych. Klasy dziedziczące są wzbogacane o indywidualne pola i metody. Dzięki temu mechanizmowi zachodzi specjalizacja klas potomnych. Więcej na ten temat wyjaśniam w lekcji 10.
klonowanie
Ponieważ obiekty nie mogą być kopiowane w ten sam sposób co inne typy danych, stworzono mechanizm klonowania do tworzenia niezależnych kopii obiektu. Ten temat poruszam w lekcji 22.

Dla większej wygody można powiększyć nagranie klikając ikonkę w prawym dolnym rogu filmu. Klip wymaga wtyczki Adobe Flash Player.

Oczywiście wszelkie komentarze są mile widziane.



Programowanie obiektowe w PHP – lekcja 1.

piątek, 12 Listopad 2010

Poniżej prezentuję fragment szkolenia Programowanie obiektowe w PHP. Jutro kolejna część, a w przyszłym tygodniu pełne szkolenie znajdzie się w ofercie Serwan.pl.

Dla większej wygody można powiększyć nagranie klikając ikonkę w prawym dolnym rogu filmu. Klip wymaga wtyczki Adobe Flash Player.

Oczywiście wszelkie komentarze są mile widziane.



Programowanie obiektowe w PHP

środa, 10 Listopad 2010

Dzięki programowaniu obiektowemu możemy tworzyć rozbudowane programy w uporządkowany sposób. Umożliwia nam to podział programu na odrębne części – klasy. W klasie wyodrębniamy fragmenty programów, które są jakąś logiczną całością, odpowiadającą za jedną funkcjonalność, albo jeden spójny zbiór danych.

Ta logiczna całość może być wykorzystana wiele razy w jednym programie, jak również w innych programach. W miejscu, gdzie chcemy użyć daną klasę, tworzymy obiekt tej klasy. Obiektów może być kilka. Stosujemy je wszędzie tam, gdzie potrzebna jest nam dana funkcjonalność, jeżeli tę funkcjonalność musimy zmienić, robimy to w jednym miejscu – w definicji klasy. Skutki tej zmiany będą widoczne wszędzie tam, gdzie występują obiekty tej klasy.

Podobna sytuacja występuje w przypadku, gdy w programie wystąpi jakiś błąd. Ten sam błąd może wystąpić w wielu miejscach, ale dzięki temu, że program jest oparty na klasach i obiektach tych klas, to przyczyna błędu występuje tylko w jednym miejscu w kodzie całego programu – w definicji klasy. Gdy usuniemy błąd, usterka znika z każdego miejsca, w którym wystąpiła.

I coś, co dla wielu będzie prawdopodobnie najważniejszą zaletą. Umiejętność programowania obiektowego umożliwia używanie frameworków i stosowanie wzorców projektowych, co szalenie ułatwia i przyspiesza proces powstawania programów.

Teraz jak to wygląda w praktyce. Utworzę klasę Notatka

class Notatka
{
	private $autor;
	private $notatka;
 
	public function zapisz_autora($autor)
	{
		$this->autor=$autor;
	}
 
	public function zapisz_notatke($notatka)
	{
		$this->notatka=$notatka;
	}
 
	public function wyswietl()
	{
		echo '<h2>'.$this->autor.'</h2>';
		echo '<p>'.$this->notatka.'</p>';
	}
}
 
$obiekt =new Notatka();
$obiekt->zapisz_autora($_POST['autor']);	
$obiekt->zapisz_notatke($_POST['notatka']);	
$obiekt->wyswietl();

Klasa

Klasa jest prototypem obiektu – strukturą zawierającą zarówno dane (pola klasy) jak i funkcje (metody klasy).
Klasę definiuje się słowem kluczowym class po którym podajemy nazwę klasy, a następnie wewnątrz nawiasów klamrowych definiujemy jej pola i metody.

Obiekt

Obiekt jest instancją klasy zawierającą się w konkretnej zmiennej wykorzystywanej w kodzie programu.
Obiekt danej klasy tworzy się podstawiając do zmiennej instancję klasy tworzoną operatorem new. Dostęp do pól i metod klasy następuje poprzez nazwę zmiennej, operator ->, a następnie nazwę pola lub metody. Dostęp do pól i metod wewnątrz klasy otrzymuje się poprzez referencję $this->

Kwalifikatory dostępu

Definiując wewnątrz klasy pola i metody używamy kwalifikatorów dostępu. Do dyspozycji mamy trzy kwalifikatory dostępu: public, private, protected. Składowe o dostępie public są dostępne zarówno wewnątrz klasy jak i na zewnątrz. Do składowych o dostępie private dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana. Do składowych o dostępie protected dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana, oraz klas potomnych.

Metody

Metody klasy są funkcjami zdefiniowanymi wewnątrz klasy. Stosują się do nich wszystkie zasady związane ze zwykłymi funkcjami z uwzględnieniem kwalifikatorów dostępu.

Pola

Pola klasy są składowymi klasy przechowującymi dane dowolnego typu. Stosują się do nich wszystkie zasady dotyczące zwykłych zmiennych z uwzględnieniem kwalifikatorów dostępu.



Wprowadzenie do ADODB

wtorek, 22 Czerwiec 2010

Biblioteka ADODB jest warstwą abstrakcyjną pośredniczącą w komunikacji z bazą danych. Dzięki niej aplikacja może być przenoszona między wieloma różnymi systemami baz danych. ADODB obsługuje MySQL, PostgreSQL, Oracle, Interbase, Microsoft SQL Server, Access, FoxPro, Sybase, ODBC i ADO. Ułatwione jest też wysyłanie i odbieranie danych z bazy z poziomu skryptu PHP.

Tworzenie obiektu i nawiązywanie połączenia

Połączenie z bazą za pomocą biblioteki ADODB wygląda następująco:

include("adodb5/adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("127.0.0.1", "root", "haslo", "mojabaza");

W pierwszej linijce włączamy do skryptu bibliotekę ADODB. Ścieżka do pliku adodb.inc.php może być nieco inna – ważne, by wskazywała na wspomniany wcześniej plik. W drugiej linijce tworzymy obiekt komunikacji z bazą danych. Funkcja NewADOConnection() w argumencie przyjmuje symbol bazy danych. Ostatnia linijka łączy obiekt $db z rzeczywistą bazą danych. Metoda Connect pobiera kolejno argumenty: adres bazy danych, nazwa użytkownik, hasło i nazwa bazy danych.

Pobieranie i aktualizacja danych – metoda Execute()

$rs = $db->Execute('SELECT * FROM uzytkownik');
$rs = $db->Execute("UPDATE uzytkownik SET imie=$imie WHERE id=45;");

W metodzie Execute możemy umieścić dowolne zapytanie SQL. Jeżeli będzie to zapytanie pobierające dane, dane będą dostępne w zmiennej $rs

Pobieranie danych i wyświetlanie danych z bazy – metody: GetRow(), GetAll(), GetOne()

Istnieje znacznie wygodniejszy sposób pobierania danych z bazy niż metoda Execute(). Są to metody: GetRow(), GetAll() i GetOne(). W tych metodach umieszczamy tylko zapytania SELECT.

$rs = $db->GetAll('SELECT * FROM user WHERE id<40');
$rs = $db->GetRow('SELECT * FROM user WHERE id=1');
$rs = $db->GetOne('SELECT login FROM user WHERE id=1');

Metoda GetAll() zwraca wiele rekordów – wszystkie będące wynikiem zapytania. Wynik zapisywany jest w tablicy dwuwymiarowej $rs. Elementami tablicy głównej są tablice z polami jednego rekordu pobranego z bazy danych.
Metoda GetRow() zwraca jeden rekord w postaci tablicy jednowymiarowej. Jeżeli zapytanie zwróci więcej danych, zapisany zostanie jedynie pierwszy rekord.
Metoda GetOne() zwraca pojedynczą wartość. Jeżeli zapytanie zwróci więcej danych, zwrócona zostanie jedynie wartość pierwszej kolumny z pierwszego rekordu wyniku zapytania.

Biblioteka ADODB jest dużym ułatwieniem dla każdego programisty. 3 z 6 stron tworzonych na szkoleniu Zawodowy Webmaster wykorzystują ją do wszelkich operacji na bazie danych. Oprócz opisanych powyżej możliwości na szkoleniu wykorzystywane są również złączenia, podzapytania i funkcje agregujące.