|
|
| Zadając pytanie dotyczące PHPNuke podaj jego wersje!! |
| Opreacje na bazach danych (v 1.02) |
WSTĘP
Wspaniałą cechą jaką ma PHP jest możliwość operowania na bazach danych, w których to mogą być przechowywane najróżniejszego rodzaju dane. Spytacie pewnie, czemu nie korzystać ze zmiennych? Powód jest prosty: w przypadku zmiennych nie można zmienić i przechowywać wartości na tak długo jak się chce. Innymi słowy, gdy skrypt zapisze pod zmienną $wiek podany przez odwiedzającego wiek, to po ponownym wywołaniu tego skryptu (czyli np po wejściu na stronę chwilę później) odwiedzający musi jeszcze raz podawać swój wiek (oczywiście są sytuacje wyjątkowe, takie jak korzystanie z cookies, ale nie o nich tutaj mowa). Inną zaletą baz danych jest łatwość decydowania jakie dane chcemy w bazie zapisać, odczytać czy też zmienić.
Ponieważ najpopularniejszym rodzajem baz danych stosowanych w tworzeniu stron internetowych jest MySQL, to na tej bazie się skupimy.
Dane w bazie danych są przechowywane w regularnych tabelach, czyli nie ma komórek zawierających dwa wiersze czy dwie kolumny:
--------------------------------------
|dana 1a | dana 2a | dana 3a|
--------------------------------------
|dana 1b | dana 2b | dana 3b|
--------------------------------------
|dana 1c | dana 2c | dana 3c |
--------------------------------------
Bazy danych składają się z struktury i z danych (coś jak dziennik klasowy i oceny w nim wpisywane - dziennik ma jakąś strukturę, ustalone rubryki, a wpisywane oceny są danymi )
PIERWSZE KROKI
1) >>> łączenie i rozłączanie się z bazą danych <<<
Na samym początku skrypt musi wiedzieć gdzie w internecie znajduje się baza danych, jak się nazywa jaki jest do niej login i hasło. Najwygodniej będzie te dane zapisać pod zmiennymi. Pozwoli to na proste korzystanie z nich w sytuacji gdy musimy to zrobić wielokrotnie. Za połączenie i wybranie konkretnej bazy danych odpowiadają funkcje mysql_connection oraz mysql_select_db
| PHP: |
 mysql_connect("host", "login", "haslo"); // połączenie z serwerem<br />
mysql_select_db ("nazwa_bazy"); // wybranie konkretnej bazy danych
|
Po wykonaniu wszystkich zamierzonych operacji na bazach danych należy zwolnić zasoby (jeśli wykonaliśmy zapytanie do bazy - o czym w dalszej części tutoriala) i rozłączyć się z bazą, aby to zrobić musimy użyć poniższego kodu:
| PHP: |
 mysql_free_result(mysql_query(zapytanie)); // zwalnianie<br />
mysql_close(mysql_connect("host", "login", "haslo")); // rozłączenie
|
UWAGA:
------------
W nuke, skrypt łączenia bazy danych jest już gotowy. Wystarczy pobrać zmienną globalną z informacjami o bazie danych, co robimy pisząc:
| PHP: |
 global $db;
|
lub
| PHP: |
 global $dbi;
|
w zależności jak będzie zbudowane później zapytanie do bazy danych.
Adres bazy danych, nazwa, login i hasło są przechowywane w zmiennych w pliku config.php, więc jeśli chcemy je zmienić to w tym pliku należy ich szukać. Ponad to w przypadku tego skryptu nie musimy się martwić o rozłączanie z bazą.
------------
2) >>> wykonywanie zapytania do bazy danych <<<
Kiedy jesteśmy już połączeni z bazą danych możemy wykonać każdy rodzaj zapytania MySQL. Zapytaniem nazywamy (upraszczając) takie polecenie, które wykonane w bazie danych zwróci nam jakąś wartość. Można to porównać do sytuacji, gdy pytamy się kogoś: "Jaka jest liczba w książce takiej i takiej, na stronie X, w tabeli o nazwie takiej a takiej, w kolumnie Y i wierszu Z?" Ten ktoś otwiera książkę szuka strony, potem tabeli a w niej odpowiedniej kolumny i wiersza, a następnie mówi nam co tam jest. Zapytanie kierujemy do MySQL korzystając z funkcji mysql_query("zapytanie"), np:
| PHP: |
 mysql_query("SELECT kolumna1, kolumna2 FROM tabela");
|
Oczywiście tak wykonane zapytanie nic nam nie da. Trzeba by zapisać wynik zapytania pod jakąś zmienną, by móc cokolwiek sensownego zrobić z tym wynikiem:
| PHP: |
 $result=mysql_query("SELECT kolumna1, kolumna2 FROM tabela");
|
UWAGA:
------------
W nuke, w zapytaniu należy dołączyć zmienną $db lub $dbi zawierającą dane o bazie danych na której ma być wykonane zapytanie:
| PHP: |
 $result = $db->sql_query("SELECT kolumna1, kolumna2 FROM tabela");
|
lub
| PHP: |
 $result=mysql_query("SELECT kolumna1, kolumna2 FROM tabela", $dbi);
|
------------
3) >>> pobieranie, zapisywanie, zmienianie danych w MySQL <<<
W zależności od tego jakich poleceń użyjemy w zapytaniu, możemy dane pobrać, zapisać lub zmienić.
a) pobieranie danych
Do pobierania służy przede wszystkim polecenie SELECT którego używa się razem z FROM. I tak zapytanie:
| PHP: |
 SELECT kolumna1, kolumna2 FROM tabela
|
pobierze nam dane z tabeli o nazwie tabela kolumn o nazwach kolumna1 i kolumna2. Jeżeli chcemy by pobrał dane ale nie z całych kolumn a z konkretnych wierszy w tych kolumnach, musimy dołożyć jeszcze polecenie WHERE:
| PHP: |
 SELECT kolumna1, kolumna2 FROM tabela WHERE kolumna1>3 AND kolumna1<10
|
To zapytanie pobierze nam dane z tabeli tabela z kolumn kolumna1 i kolumna2, ale tylko z tych wierszy gdzie wartości w kolumna1 są większe od 3 i mniejsze od 10.
Pobrane dane możemy od razu posortować rosnąco lub malejąco wg dowolnej kolumny:
| PHP: |
 SELECT kolumna1, kolumna2 FROM tabela WHERE kolumna1>3 AND kolumna1<10 ORDER BY title DESC
|
Jak widzicie, kolumna względem której sortujemy, czyli tutaj title, wcale nie musi być kolumna którą pobieramy. Po nazwie kolumny względem której sortujemy wynik, należy napisać DESC (czyli malejąco) lub ASC (czyli rosnąco). Jeżeli interesuje nas np tylko pierwsze 5 wyników, musimy na końcu zapytania dopisać LIMIT:
| PHP: |
 SELECT kolumna1, kolumna2 FROM tabela WHERE kolumna1>3 AND kolumna1<10 ORDER BY title DESC LIMIT 5
|
Wynik tego zapytania będzie podobny do poprzedniego, z tą różnicą, że pobrane zostanie tylko pięć pierwszych uzyskanych przez zapytanie wierszy. Warto zwrócić uwagę na to iż polecenie ORDER BY znajduje się przed poleceniem LIMIT co oznacza, że pobrane dane najpierw zostaną posortowane, a dopiero potem liczba pobranych wierszy zostanie ograniczona do pierwszych pięciu.
b) zliczanie ilości wierszy w pobranych danych
Często okaże się, że musimy znać ilość wierszy jakie pobraliśmy zapytaniem. Tą informacje możemy uzyskać dzięki funkcji mysql_num_rows(polecenie zapytania do bazy danych), a uzyskany zapisać pod zmienną, np:
| PHP: |
 $row=mysql_num_rows(mysql_query("SELECT kolumna1, kolumna2 FROM tabela"));
|
Aby zliczyć ilość wierszy w całej wybranej kolumnie wystarczy zliczyć wynik zapytania o wszystkie wiersze w danej kolumnie, czyli:
| PHP: |
 $row=mysql_num_rows(mysql_query("SELECT kolumna1 FROM tabela"));
|
Wynikiem będzie liczba wierszy w kolumnie o nazwie kolumna1.
Podobnie postępujemy gdy chcemy sprawdzić czy tabela zawiera jakiekolwiek rekordy (wiersze). Wystarczy zliczyć wynik zapytania o wszystkie pozycje w tabeli:
| PHP: |
 $row=mysql_num_rows(mysql_query("SELECT * FROM tabela"));
|
Jeśli wynik będzie większy od zera to oznacza, że tabela zawiera rekordy.
c) wyświetlanie pobieranych danych
Pobranie danych to jedno, a ich wyświetlenie to drugie.. Jako, że pobrane dane są z tabeli to i zapisane pod zmienną dane również mają postać tabeli (a raczej macierzy, ale nie wdawajmy się w szczegóły ) gdzie kolumnami są kolumny, a wierszami wiersze, o które zapytaliśmy wcześniej w zapytaniu SQL. Oznacza to że jeśli będziemy chcieli wyświetlić zawartość zmiennej (tej do której zapisaliśmy wynik zapytania) po przez zwykłe wstawienia do kodu $nazwa_zmiennej to nie otrzymamy tego co nas interesuje. Żeby wyświetlić pobrane dane, trzeba sprecyzować z której kolumny i którego wiersza mają być wyświetlone.
Załóżmy, że mamy tabele o nazwie osoby z danymi osobowymi: imieniem, nazwiskiem i wiekiem każdego naszego znajomego. Tak więc imie, nazwisko i wiek, to będą kolumny, a kolejne dane wpisywane w te kolumny to będą wiersze.
---------------------------
| Jan | Nowak | 31 |
---------------------------
| Marek | Kuś | 26 |
---------------------------
| Jan | Raks | 17 |
---------------------------
| Artur | Kitarz | 18 |
---------------------------
| Adam | Borek | 56 |
---------------------------
Pobraliśmy imię i nazwisko z tabeli, a wynik posortowaliśmy malejąco wg wieku i ograniczyliśmy do max 3 pozycji.
| PHP: |
 mysql_query("SELECT imie, nazwisko FROM osoby ORDER BY wiek DESC LIMIT 3");
|
---------------------------
| Adam | Borek | 56 |
---------------------------
| Jan | Nowak | 31 |
---------------------------
| Marek | Kuś | 26 |
---------------------------
Teraz chcemy na stronie wyświetlić elegancko jedną pod drugą, pobrane dane. Aby to zrobić trzeba wyświetlanie dane z żądanych kolumn dla pierwszego wiersza, a następnie zwiększyć numer wiersza o jeden i znowu wyświetlić dane i tak aż do końca. W sytuacji gdy z góry wiemy ile wierszy zwróci nam zapytanie, wiemy do ilu mamy zwiększać numer wiersza przy wyświetlaniu. Jednakże gdy nie wiemy ile wierszy zwróciło nam zapytanie z pomocą przychodzi nam wcześniej opisana funkcja mysql_num_rows. Nie mniej ręczne zmienianie numeru wiersza z którego pobieramy dane jest niezbyt wygodne i opłacalne. Ułatwić sobie życie możemy, pisząc pętle pobierającą dane z kolejnych wierszy aż do ostatniego:
| PHP: |
 while ($row = $db->sql_fetchrow(mysql_query("SELECT imie, nazwisko FROM osoby ORDER BY wiek DESC LIMIT 3"))) { // pętla <br />
echo "Imie: ".$row['imie']."<br>"; // wyświetlenie zawartości kolumny imie w aktualnym wierszu<br />
echo "Nazwisko: ".$row['nazwisko']."<br>"; // wyświetlenie zawartości kolumny nazwisko w aktualnym wierszu<br />
echo "<br>"<br />
}
|
Skupmy się teraz na samym kodzie znajdującym się pomiędzy { }.
| PHP: |
 <br />
echo "Imie: ".$row['imie']."<br>"; // wyświetlenie zawartości kolumny imie w aktualnym wierszu<br />
echo "Nazwisko: ".$row['nazwisko']."<br>"; // wyświetlenie zawartości kolumny nazwisko w aktualnym wierszu<br />
echo "<br>"<br />

|
Jak widać znaki ". oraz ." oznaczają tylko wtrącenie polecenia do echo, a same dane wyświetlamy już za pomocą $row['nazwa_kolumny']. Powoduje to wyświetlenie wartości w aktualnym wierszu i kolumnie o podanej nazwie. Aktualny wiersz zmieniamy za pomocą pętli while i polecenia sql_fetchrow. Przyjrzyjmy się więc teraz samej pętli, bo może wyglądać na troszkę skomplikowaną.
Ogólna jej postać wygląda tak:
| PHP: |
 while (warunek) {<br />
kod <br />
}
|
Powoduje to wykonywanie kodu zawartego pomiędzy { i } dopóki warunek jest spełniony, czyli dopóki nie otrzymamy wartości FALSE. W miejscu nazwanym warunek mamy:
| PHP: |
 $row = $db->sql_fetchrow(polecenie zapytania do bazy danych)
|
Funkcja sql_fetchrow zwraca nam pierwszy wiersz:
---------------------------
| Adam | Borek | 56 |
---------------------------
następnie wykonany jest kod pomiędzy { } i zwrócony następny w kolejności wiersz:
---------------------------
| Jan | Nowak | 31 |
---------------------------
i znowu wykonany kod pomiędzy { }. Tak sytuacja się powtarza dopóki nie zabraknie wierszy. Wtedy funkcja zwróci wartość FALSE, czyli fałsz. Będzie to znakiem dla pętli while kod pomiędzy { } ma być pominięty a pętla zakończona.
UWAGA:
------------
Cały kod łączący się z bazą danych, pobierający dane i je wyświetlający wyglądałby więc tak:
| PHP: |
  // połączenie się z bazą danych i zapisanie tego pod zmienną $polaczenie<br />
 $polaczenie = mysql_connect("localhost", "uzytkownik", "haslo"); <br />
 <br />
 // wybór bazy danych<br />
 mysql_select_db ("baza");<br />
 <br />
 // zapisanie treści zapytania pod zmienną $query<br />
 $query = "SELECT imie, nazwisko FROM osoby ORDER BY wiek DESC LIMIT 10"; <br />
 <br />
 // wykonanie zapytania zapisanego pod zmienną $query i zapisanie wyniku pod zmienną $result<br />
 $result = mysql_query ($query); <br />
 <br />
 // wyświetlenie pobranych danych, które są zapisane w $result<br />
 while ($row = $db->sql_fetchrow($result)) {<br />
 echo "Imie: ".$row['imie']."<br>";<br />
 echo "Nazwisko: ".$row['nazwisko']."<br>";<br />
 echo "<br>"<br />
 }<br />
 <br />
 // zwolnienie zasobów<br />
 mysql_free_result($result); <br />
 <br />
 // rozłączenie się<br />
 mysql_close($polaczenie);
|
W powyższym kodzie użyto m.in. dodatkowej zmiennej $result przechowującej wynik zapytania, oraz zmiennej $query przechowującej zapytanie. Takie posunięcie znacznie zwiększy przejrzystość kodu i zaoszczędzi nam żmudnego przepisywania kody gdy jego fragment się powtarza. Co więcej w przypadku błędu w zapytaniu będzie nam łatwiej go znaleźć i poprawić
------------
d) zapisywanie danych
Zapisywanie danych odbywa troszkę podobnie jak ich pobieranie. Różnicą jest to, iż w zapytaniu używamy innych poleceń. Nie stosujemy SELECT i FROM lecz INSERT INTO oraz VALUES:
| PHP: |
 INSERT INTO `nazwa_tabeli` (`pierwsza kolumna do której wpisujemy dane`, `druga kolumna`, `trzecia kolumna`) VALUES ('pierwsza wartość', 'druga', 'trzecia');
|
Co jeśli chcemy dodać kilka rekordów, jeden po drugim? Pierwsze co przychodzi na myśl, to powtórzyć całe zapytanie. Ale po co, skoro jest możliwość dodania kilku rekordów w jednym zapytaniu, np dodanie 3 danych osobowych do tabeli osoby:
| PHP: |
 INSERT INTO `osoby` (`wiek`, `imie`, `nazwisko`) VALUES (18, 'Adam', 'Borek'), (21, 'Marek', 'Haj'), (36, 'Arek', 'Kuś');
|
Spytacie pewnie dlaczego niektóre wartości są wzięte w `` niektóre w '' a niektóre są po prostu napisane. Otóż bezpieczniej jest stosować ` (przycisk tyldy - obok jedynki) gdy piszemy nazwy tabel i kolumn, natomiast gdy piszemy wartości jakie mają być wpisane stosujemy ' (przycisk apostrofu - obok entera). W tym ostatnim przypadku wyjątkiem są dane które mają być zapisane jako liczba. W takiej sytuacji piszemy po prostu liczbę.
e) zmienianie danych
Aby zmienić jakąś istniejącą wartość musimy w zapytaniu użyć poleceń: UPDATE oraz SET. Problem może polegać na tym, że musimy zdefiniować w którym wierszu kolumny chcemy zmienić wartość:
| PHP: |
 UPDATE `nazwa_tabeli` SET `nazwa_kolumny` = 'nowa wartość' WHERE `jakaś_kolumna`= 'jakaś_wartość'
|
No właśnie.. pewnie zastanawiacie, się: "Co on bredzi? Mówi o wierszach a w zapytaniu ani śladu wiersza, tylko same kolumny."
Otóż wiersze są określane przez warunek WHERE `kolumna`= 'wartość'. Mówi on o tym, że zmiana ma być we wszystkich wierszach w których jakaś_kolumna ma jakąś_wartość. Jeszcze łatwiej będzie to zrozumieć na przykładzie:
---------------------------
| Jan | Nowak | 18 |
---------------------------
| Marek | Kuś | 26 |
---------------------------
| Jan | Raks | 17 |
---------------------------
| Artur | Kitarz | 56 |
---------------------------
| Adam | Borek | 16 |
---------------------------
Jeśli teraz wykonamy zapytanie:
| PHP: |
 UPDATE `nazwa_tabeli` SET `imie` = 'bleble' WHERE `wiek`= 18
|
To spowoduje to zmienienie imion na bleble wszystkich osób które mają wiek = 18, czyli otrzymamy:
---------------------------
| bleble | Nowak | 18 |
---------------------------
| Marek | Kuś | 26 |
---------------------------
| Jan | Raks | 17 |
---------------------------
| bleble | Kitarz | 18 |
---------------------------
| Adam | Borek | 56 |
---------------------------
f) usuwanie danych (rekordów)
Może zajść sytuacja że chcemy usunąć jakiś wiersz z bazy danych. Służy do tego polecenie DELETE oraz FROM i WHERE, które określają skąd i co chcemy usunąć:
| PHP: |
 DELETE FROM `nazwa_tabeli` WHERE `kolumna`='wartość'
|
ZAKOŃCZENIE
Znacie już podstawy operowania danymi w bazach danych i ogólne pojęcie jak to wygląda w Nuke'u. Jest jeszcze mnóstwo różnych poleceń ułatwiających operowanie na bazach danych. Z bazami danych można jeszcze bardzo dużo zrobić, jak choćby tworzyć, zmieniać całą strukturę o czym będzie w późniejszych tutorialach.
*Suchy |
| |
|
|
|
|
|
|