ZalogujUzytkownik Haslo
Zaloguj mnie automatycznie przy każdej wizycie    
Rejestracja
Rejestracja
Zaloguj się, by sprawdzić wiadomości
Zaloguj się, by sprawdzić wiadomości

Nauka gry na keyboardzie w Częstochowie Nauka gry na pianinie w Częstochowie Nauka gry na saksofonie w Częstochowie

Poleć to, co sprawdzone i najlepsze Masz inne doświadczenia? Wystaw odpowiednią rekomendacje.
Forum Moja Rekomendacja Strona Główna » Luźne rozmowy na każdy temat

Napisz nowy temat   Odpowiedz do tematu
Kurs PHP Idź do strony Poprzedni  1, 2
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Tomasz



Dołączył: 18 Maj 2008
Posty: 413

PostWysłany: Wto Sie 05, 2008 20:53    Temat postu: Kurs PHP Odpowiedz z cytatem

Referencje

16.1. Kilka słów o referencjach

Referencje pozwalają na utworzenie dwóch zmiennych o tej samej wartości i odwołujących się do jednego miejsca w pamięci. Jest to rozwiązanie problemu dublowania pamięci podczas procesu zwykłego przypisania (poniżej pokazujemy przypisanie i referencję). Dla przykładu:

<?
$b = $a; //zwykłe przypisanie
$b = & $a; //utworzenie referencji
?>

W referencji podczas zmiany wartości zmiennej $b zmienia się też $a i na odwrót, podczas gdy po zwykłym przypisaniu zmienne $a i $b mogą przyjmować inne wartości.

16.2. Zalety referencji

Kolejnym plusem referencji jest możliwość odwoływania się do zmiennych globalnych w funkcji bez użycia słowa global. Dla przykładu:

<?
function podniesOJeden (&$zmienna) {
$zmienna++;
}
$a=5;
podniesOJeden($a);
?>

Po takiej operacji wartość zmiennej $a będzie wynosiła 6. Pomimo że w funkcji zmienna $zmienna nie jest globalna, to jest ona referencją do zmiennej $a i obie odwołują się do tej samej wartości.

16.3. Koniec referencji

Czasem zachodzi potrzeba usunięcia referencji. Poniższy kod może zostać uruchomiony bez obawy o wartość zmiennej $b, ponieważ niszczona jest właśnie referencja – dowiązanie zmiennej do jej wartości, a nie jej zawartość, która dalej zostaje dostępna poprzez $b. Dla przykładu:

<?
$a=1;
$b = & $a;
unset($a);
?>

Polecam www.webhosting.pl
_________________
nauka na keyboardzie impresariat stroiciel agencja artystyczna nauka na pianinie stomatolog
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Tomasz



Dołączył: 18 Maj 2008
Posty: 413

PostWysłany: Wto Sie 05, 2008 20:54    Temat postu: Kurs PHP Odpowiedz z cytatem

Obsługa wyjątków

17.1. Nowa obsługa błędów

W PHP5 dodano obsługę błędów podobną do tej np. z Javy, czyli bazującą na wyjątkach. Opiera się ona na trzech słowach kluczowych: try, catch i throw. Obsługa wyjątków zapisana jest w klasie Exception. Dzięki takiej obsłudze można zapisać błędy do logów albo wyświetlić wszystkie naraz na końcu działania skryptu. Dla przykładu:

<?
function dziel($a, $b) {
if ($b==0) {
throw new Exception("niedozwolone dzielenie przez zero");
}
return (int)$a/(int)$b;
}
try {
dziel(5, 0);
}
catch (Exception $e) {
echo "Błąd to: ".$e->getMessage();
}
?>

W powyższym przykładzie zadeklarowaliśmy funkcję dziel, która (jak łatwo się domyślić) służy do dzielenia dwóch liczb całkowitych przez siebie. Pobiera ona dwa argumenty (liczby) i jeśli drugi z nich wynosi zero, zwraca błąd. Ale to nie jest po prostu błąd typu echo „błąd!”. W przykładzie w bloku try zamykamy taki kod, który może zwrócić błąd (w naszym wypadku wywołanie funkcji dziel(), która może wygenerować wyjątek). Zaraz po try jest catch, w którym decydujemy, co mamy zrobić z wyjątkiem (o ile wystąpił). W zwykłym nawiasie (po catch) podajemy nazwę klasy obsługi wyjątków i zmienną, która stanie się obiektem tej klasy.

17.2. Rozbudowa klasy Exception

Klasa Exception przedstawia się następująco (za php.net):

<?
class Exception {
protected $message = 'Nieznany wyjątek'; // treść błędu
protected $code = 0; // kod błędu
protected $file; // nazwa pliku z wyjątkiem
protected $line; // linia z wyjątkiem

function __construct($message = null, $code = 0);

final function getMessage(); // wyświetla błąd
final function getCode(); // wyświetla kod błędu
final function getFile(); // wyświetla nazwę pliku z błędem
final function getLine(); // wyświetla linię z błędem
final function getTrace(); // więcej tutaj
final function getTraceAsString(); // getTrace() jako string

function __toString(); // sformatowany błąd do wyświetlenia
}
?>

Klasę Exception można rozbudować o własne metody lub nadpisać już w niej istniejące (można nadpisać __construct() i __toString()). Jeśli nadpisujemy oryginalny konstruktor klasy Exception, powinniśmy wywołać parent::__construct(), aby być pewnym, że wszystkie zmienne zostały poprawnie przydzielone. Oto przykład pokazujący, jak można rozbudować klasę Exception:

<?
class extendedException extends Exception {
function __toString() {
echo "Błąd to: ".$this->getMessage()."<br />";
echo "Wystąpił w linijce ".$this->getLine().?<br />";
echo "i w pliku ".$this->getFile();
}
}
?>

Teraz przerabiamy kod z powyższego przykładu, ale korzystamy z klasy extendedException:

<?
function dziel($a, $b) {
if ($b==0) {
throw new extendedException("niedozwolone
dzielenie przez zero");
}
return (int)$a/(int)$b;
}
try {
dziel(5, 0);
}
catch (extendedException $e) {
echo $e->__toString();
}
?>

Powyższy kod wyświetli następujący błąd:
Błąd to: niedozwolone dzielenie przez zero
Wystąpił w linijce 9
i w pliku /var/www/kurs/kurs.php

17.3. Metoda getTrace() klasy Exception

Na zakończenie tego rozdziału powiedzmy jeszcze kilka słów na temat metody getTrace(). Zwraca ona bardzo rozbudowane statystyki dotyczące błędu w postaci wielowymiarowej tablicy asocjacyjnej. Pokażmy za jej pomocą statystyki błędu w dzieleniu przez 0, wyświetlone przy użyciu funkcji print_r($e->getTrace()).

Array
(
[0] => Array
(
[file] => c:\usr\krasnal\www\webplanet\kurs\test5.php
[line] => 14
[function] => dziel
[args] => Array
(
[0] => 5
[1] => 0
}
}
}

Polecam www.webhosting.pl
_________________
nauka na keyboardzie impresariat stroiciel agencja artystyczna nauka na pianinie stomatolog
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Tomasz



Dołączył: 18 Maj 2008
Posty: 413

PostWysłany: Wto Sie 05, 2008 20:55    Temat postu: Kurs PHP Odpowiedz z cytatem

Bezpieczeństwo skryptów

Jeden odpowiednio wykorzystany przez hakera błąd w naszym skrypcie może pozwolić na odczytanie haseł użytkowników bazy danych czy zniszczenie całej struktury plików na serwerze. Jeśli nie chcemy, aby tak się stało i nasz serwis został zaatakowany po dwóch miesiącach żmudnego programowania, stosujmy się do poniższych rad.

18.1. Include i require – ich niebezpieczeństwa

Najbardziej niebezpieczne są funkcje include() oraz require(), gdy są użyte w nieodpowiedni sposób. W skrypcie najczęściej zawarty jest taki oto kod:

<?
include($_GET['podstrona']);
?>

Teraz wystarczy, że (przy ustawieniu safe_mode na off – zazwyczaj tak właśnie jest) wywołamy adres index.php?file=/etc/passwd i... nazwa plików mówi sama za siebie – na serwerze unikowym wyświetli się plik z hasłami użytkowników. Aby zachować podstawowy poziom bezpieczeństwa, należy zrobić coś takiego:

<?
include("includes/".$_GET['nazwa'].".php");
?>

Wtedy rozszerzenie będzie na pewno .php i plik będzie „includowany” z foldera ze skryptem. Nie jest to jednak rozwiązanie najlepsze, więc dobrze jest w takim wypadku korzystać ze switch. Dla przykładu:

<?
switch($_GET['nazwa']) {
case "index": include("index.php");break;
case "o_mnie": include("omnie.php");break;
case "download": include("download.php");break;
default: echo "Błąd - taki plik nie istnieje";
}
?>

18.2. Konfiguracja php.ini

W poprzedniej części wspomnieliśmy o trybie safe_mode. Jest to specjalna dyrektywa ustawiana w pliku php.ini (konfiguracja środowiska PHP na serwerze), która określa, czy PHP ma być uruchamiane w trybie bezpiecznym czy nie. Jeśli tylko mamy dostęp do tego pliku, warto ustawić tryb safe_mode na on. Jeśli safe_mode jest włączony, to użytkownik nie ma dostępu do plików, których nie jest właścicielem (tak więc problem tego nieszczęsnego /etc/passwd jest rozwiązany – nikt nie odczyta haseł z serwera). Druga dyrektywa to open_basedir – określa ona folder, powyżej którego w drzewie folderów nie mamy dostępu. Jeżeli więc ustawione jest np. /var/www/users, to skrypt nie będzie miał dostępu np do /var/www. Najlepiej jest mieć te dwie dyrektywy ustawione (włączone), a jeśli nie jest to możliwe, to należy włączyć safe_mode.

18.3. Dane od użytkowników

Najbardziej zagrożonymi na ataki są te fragmenty skryptów, które operują na danych wprowadzonych przez użytkownika w formularzach lub przekazywanych metodą $_GET. Niezbędnym minimum jest w takim wypadku sprawdzenie, czy typ danych jest zgodny z tym, którego oczekujemy. Jeśli czekamy na liczbę całkowitą, aby wykorzystać ją np. do wygenerowania zapytania do bazy danych, ważne jest, aby była to właśnie liczba, a nie ciąg tekstu, który może nam poważnie namieszać w bazie danych (atak SQL Injection). W tym wypadku należy daną – pobraną z formularza lub przesłaną za pomocą GET – rzutować do oczekiwanego typu zmiennej. Dla przykładu:

<?
$doBazy = (int) $_GET['zFormularza'];
?>

Polecam www.webhosting.pl
_________________
nauka na keyboardzie impresariat stroiciel agencja artystyczna nauka na pianinie stomatolog
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Tomasz



Dołączył: 18 Maj 2008
Posty: 413

PostWysłany: Wto Sie 05, 2008 20:57    Temat postu: Kurs PHP Odpowiedz z cytatem

Baza danych MySQL

19.1. Wstęp

Użycie bazy danych to dobra alternatywa wobec plików, zwłaszcza przy budowaniu dużych serwisów czy złożonych statystyk. Pobieranie i zapisywania informacji w bazach danych opiera się na wysyłaniu do serwera bazy zapytań zapisywanych w języku SQL (Structured Query Language) zawartych w kodzie PHP, na które serwer odpowiada, pobierając z bazy odpowiednie dane i wysyłając je do nas. Zrozumienie tego na pewno ułatwi poniższy schemat:

1. Klient wysyła do serwera zapytanie o stronę WWW,
2. Serwer WWW wysyła do parsera kod PHP,
3. Parser wysyła do serwera baz danych zapytanie o jakieś dane,
4. Serwer baz zwraca dane, które są używane dalej w skrypcie,
5. Parser wysyła gotowy kod HTML do serwera WWW,
6. Serwer WWW wysyła kod HTML do przeglądarki klienta.

Przy pisaniu kodu PHP z użyciem baz danych trzeba pamiętać, że jeśli serwer PHP nie znajduje się (fizycznie) na tym samym serwerze (czyli nie ma możliwości odwołania się do niego poprzez localhost), tylko np. w innej części Internetu, może to znacznie zwolnić pracę skryptu. Podczas naszych standardowych testów po uruchomieniu strony z połączeniem do serwera bazy MySQL na innym hoście czas generowania strony wyniósł około 2,5 sekundy, a podczas gdy baza znajdowała się na serwerze lokalnym, nie trwało to nawet 0,01 sekundy.

19.2. Struktura bazy

Schemat obrazuje strukturę bazy danych. Najważniejszym elementem jest oczywiście sama baza – zazwyczaj jedna przydzielana jest dla każdego użytkownika, chociaż na serwerach komercyjnych dostaje się czasem nawet i dziesięć baz. Ingerować w bazy (tworzyć, usuwać) może zazwyczaj tylko administrator. Kolejnym elementem są tabele – to są dopiero struktury przechowujące dane. Są one dowolnie modyfikowane przez użytkownika i może ich być dowolna liczba, bo ograniczenia są zazwyczaj nakładane przez firmy hostingowe na wielkość całej bazy, a nie na liczbę tabel.
Aby ułatwić naukę obsługi bazy MySQL-a i tworzenia własnych przykładów, we wszystkich przykładach tworzona będzie i rozbudowywana baza danych fikcyjnych uczniów jakiejś klasy oraz skrypty ją obsługujące.

19.3. Połączenie z bazą

Przed wykonywaniem operacji na bazie danych należy się z nią połączyć. Trzeba użyć funkcji mysql_connect(host[:port], nazwa użytkownika, hasło). Funkcja ta łączy się z serwerem podanym jako argument host. Opcjonalnie, jeśli MySQL pracuje na innym porcie niż 3306, należy też to podać. Dla przykładu:

<?
$sql = mysql_connect('serwer_baz.org', 'login', 'moje_haslo');
?>

Zmienna $sql podana na początku to uchwyt (handle) do połączenia z bazą. Ponownie potrzebny będzie tylko na końcu wykonywania skryptu, aby rozłączyć się z bazą:

<?
mysql_close($sql);
?>

Jeśli chcemy utworzyć duży serwis, korzystający z bazy i często odświeżany, warto połączyć się z bazą funkcją mysql_pconnect (permanent connect – stałe połączenie), dzięki któremu nie trzeba się za każdym razem łączyć z bazą. Wszystkie argumenty są te same. Występuje tutaj tylko jedna różnica: połączenia pconnect nie trzeba zamykać na końcu skryptu funkcją mysql_close.

19.4. Język SQL

Z bazą „kontaktujemy się” za pomocą zapytań. Są to polecenia pisane w języku SQL (bardzo proste) wysyłane dzięki funkcji mysql_query, która zwraca zmienną z wynikami zapytania. Najczęściej używane tutaj nazwy zmiennych są widoczne na przykładzie, ale oczywiście możemy ustalić swoje własne. Dla przykładu:

<?
$query="ZAPYTANIE";
$res = mysql_query($query);
?>

19.5. Pierwsze operacje, nowa baza

Jeśli mamy dostęp do serwera, możemy sobie założyć bazę. Jedyną sprawą, o której należy pamiętać, jest wywołanie funkcji mysql_create_db(nazwa), która tworzy bazę o nazwie podanej w argumencie. Po utworzeniu i przed rozpoczęciem pracy należy pamiętać, aby też wybrać bazę, z którą chcemy pracować. Robimy to za pomocą polecenia mysql_select_db(nazwa). Dla przykładu:

<?
mysql_create_db("klasa");
mysql_select_db("klasa");
?>

19.6. Nowe tabele

Gdy założyliśmy już bazę danych, kolejnym krokiem jest utworzenie tabel. W tym celu budujemy zapytanie o następującej składni:

"CREATE TABLE nazwa (nazwa1 typ1, nazwa2 typ2,
nazwa3 typ3, nazwa4 typ4, PRIMARY KEY(nazwa))"

Możemy teraz utworzyć tabelę według podanego powyżej zapytania.

"CREATE TABLE uczniowie (id char(2) NOT NULL
AUTO_INCREMENT, imie char(20) NOT NULL,
nazwisko char(40) NOT NULL, urodzony date,
PRIMARY KEY(id) )"

Stworzona zostanie tabela o nazwie uczniowie z polami id, imie, nazwisko, urodzony, przy czym id będzie kluczem podstawowym, czyli indeksem, i nie będzie się mógł powtarzać. Oprócz tego, jeśli dodamy NOT NULL, to klucz nie będzie mógł być pusty. Opcja AUTO_INCREMENT sprawia natomiast, że jeśli nie podamy wartości id do wpisania, to zostanie ona automatycznie wpisania (wartością stanie się wartość poprzedniego rekordu id podniesiona o jeden).
Dostępnych jest wiele rodzajów pól – oto kilka najważniejszych:

* char(x) – ciąg znaków o maksymalnej długości podanej jako parametr x (x<256),
* longtext – ciąg znaków o praktycznie nieograniczonej długości,
* date – data w formacie YYYY-MM-DD,
* year – rok; jeśli zostanie podany zły, jego wartość zmieni się na 0000,
* time – przechowuje czas w formacie timestamp,
* tinyint, smallint, mediumint, int, bigint – liczby całkowite,
* longblob – przechowuje dane binarne (np. obrazki) o praktycznie nieograniczonej wielkości,
* enum, set – podobne jak „radio” w formularzach, do wyboru są tylko opcje zadeklarowane uprzednio przy tworzeniu bazy (np. tak/nie).

19.7. Wstawianie danych

Aby wstawić jakieś dane do tabeli, należy posłużyć się instrukcją INSERT. Jej schemat jest następujący:

"INSERT INTO nazwa_tabeli (pole1, pole2, pole3)
VALUES (wart_pola1, wart_pola2, wart_pola3)"

Jako pole1, pole2 itd. wpisujemy nazwy pól, które chcemy wypełnić, a w wart_pola1 itd. w odpowiedniej kolejności wartości do dodania. Dla przykładu:

"INSERT INTO uczniowie (imie, nazwisko, dziennik)
VALUES ('Kornel', 'Kornelowicz', '1989-12-12')"

W powyższym wypadku wartość pola id zostanie ustalona na 1, ponieważ jest to pierwszy rekord w tabeli. Jeśli wstawialibyśmy to samo jeszcze raz, to miałby on cały czas wartość id o jeden większą od poprzedniej. Wstawmy do bazy kilka pojedynczych rekordów z danymi uczniów:

<?
$res = mysql_query("INSET INTO uczniowie
(imie, nazwisko, dziennik) VALUES ('Wacek', 'Kapusta', '2')");
$res = mysql_query("INSET INTO uczniowie
(imie, nazwisko, dziennik) VALUES ('Jurek', 'Ogórek', '3')");
$res = mysql_query("INSET INTO uczniowie
(imie, nazwisko, dziennik) VALUES ('Wojtek', 'Jarząbek', '4')");
$res = mysql_query("INSET INTO uczniowie
(imie, nazwisko, dziennik) VALUES ('Sebastian', 'Warzywo', '5')");
?>

19.8. Wybieranie konkretnych rekordów

Aby wybrać z bazy danych jakieś dane, należy posłużyć się operatorem SELECT. Jego składnia to:

SELECT pole1, pole2, pole_n FROM nazwa_tabeli
WHERE warunek1 AND warunek2 ORDER BY
nazwa_klucza rodzaj_sortowania LIMIT
klucz_poczatkowy, ilosc_rekordów

Jest to dość zawiłe, dlatego teraz po kolei wytłumaczymy całe zapytanie.

* pole1, pole2, pole_n – określają nazwy pól, które serwer baz ma wysłać w wyniku. Jeśli chce się otrzymać wszystkie, wystarczy wpisać * (gwiazdkę),
* FROM nazwa_tabeli – to chyba najprostszy fragment; określa nazwę tabeli, z której mają być wybrane rekordy,
* WHERE warunek1 AND warunek2 – to warunek (warunki), według których serwer ma przeszukiwać bazę. Można nie podać ich wcale i wtedy wynik będzie zawierał wszystkie rekordy z tabeli. Warunki można łączyć operatorami AND oraz OR, a także brać w nawiasy (tak jak w IF w PHP),
* ORDER BY nazwa_klucza rodzaj_sortowania – określa, według jakiego klucza posortowane mają być wyniki i w jakiej kolejności. Dostępne są dwa rodzaje sortowania: ASC (rosnące) i DESC (malejące),
* LIMIT klucz_poczatkowy, ilosc_rekordów – określa, ile wyników ma być zwróconych. Warto pamiętać, że ilosc_rekordow pokazuje, ile ma być zwróconych rekordów od klucz_początkowy, a nie jest to id klucza końcowego (częsty błąd).

Na schemacie pokazujemy przykład użycia LIMIT. W wynikach jest 16 rekordów, potrzebne są rekordy od 3 do 14. Ważne jest, aby się nie pomylić i w ilosc_rekordow podać całkowitą liczbę potrzebnych rekordów, a nie id ostatniego (tak jak w większości baz danych czy na adresowaniu komórek w Excelu). Dla przykładu:

<?
$res = mysql_query("SELECT * FROM uczniowie
ORDER BY dziennik ASC");
$res = mysql_query("SELECT imie FROM uczniowie
WHERE nazwisko = 'Kapusta'");
$res = mysql_query("SELECT * FROM uczniowie
WHERE dziennik > 5");
//a oto popularny przykład na wyświetlanie porcji
//wyników, np z księgi gości
$res = mysql_query("SELECT * FROM księga
ORDER BY id ASC LIMIT $start, 10");
?>

W warunkach do przeszukiwania mogą też wystąpić takie operatory, jak IN lub BETWEEN. Dla przykładu:

<?
$res = mysql_query("SELECT * FROM uczniowie
WHERE id=5 OR id=7 OR id=10");
//te dwa przykłady to to samo
$res = mysql_query("SELECT imie FROM uczniowie
WHERE id IN(5,7,10)");
$res = mysql_query("SELECT * FROM uczniowie
WHERE dziennik > 5 AND dziennik < 20");
//i to też to samo - between określa zakres
$res = mysql_query("SELECT * FROM uczniowie
WHERE dziennik BETWEEN 5 AND 20");
?>

Zastępcą znanego z instrukcji warunkowych wykrzyknika jest NOT. Można go użyć zarówno przed pojedynczą instrukcją, jak i przed całym nawiasem. Dla przykładu:

<?
$res = mysql_query("SELECT imie FROM uczniowie
WHERE id NOT IN(5,7,10)");
//zwraca wszystkich uczniów o id różnym od 5, 7 lub 10
$res = mysql_query("SELECT * FROM uczniowie
WHERE dziennik NOT BETWEEN 5 AND 20");
//zwraca wszystkich uczniów o id mniejszym od 5 i większym od 20
?>

Nie zawsze da się dokładnie porównać dwa ciągi znaków. Czasem należy posłużyć się operatorem LIKE. Porównuje on konkretną wartość ze wzorcem. Zaznaczmy przy tym, że % (procent) zastępuje w wyrażeniu dowolną liczbę znaków, a _ (podkreślenie) zastępuje dokładnie jeden znak. Dla przykładu:

<?
$res = mysql_query("SELECT * FROM uczniowie
WHERE imie LIKE '%ek' AND nazwisko LIKE '_apusta'");
?>

19.9. Modyfikacja rekordów

Czasem zachodzi potrzeba poprawienia jakiegoś rekordu. Błąd może być wynikiem nieuwagi przy wprowadzaniu danych, ale możemy też chcieć zmienić adres klienta w bazie danych sklepu internetowego. Służy do tego polecenie UPDATE. Jego składnia to:

UPDATE nazwa_tabeli SET pole1='xyz',
pole2 = 'abc', polen = 'bcd' WHERE warunki

Przyjrzyjmy się bliżej temu zapytaniu:

* nazwa_tabeli – to po prostu nazwa tabeli, w której ma nastąpić zamiana rekordów,
* SET pole1='xyz', pole2 = 'abc', polen = 'bcd' – określa pola i wartości, które mają być do nich przydzielone,
* WHERE warunki – określa, które rekordy mają być modyfikowane. W wypadku gdy nie podamy warunku w WHERE, modyfikacji ulegają wszystkie rekordy w tabeli.

Dla przykładu:

<?
$res = mysql_query("UPDATE uczniowie
SET dziennik = 11 WHERE id = 3");
$res = mysql_query("UPDATE uczniowie
SET dziennik = 12 WHERE id = 2");
?>

19.10. Usuwanie rekordów

Do usuwania jednego, kilku określonych rekordów lub zawartości całej tabeli służy DELETE. Jego składnia to:

DELETE FROM nazwa_tabeli WHERE warunki

Oznaczenia są takie same jak w poprzednich poleceniach i nie trzeba ich jeszcze raz opisywać. Warto zaś zaznaczyć, że jeśli niepodany zostanie warunek WHERE, to tabela zostanie wyczyszczona. Dla przykładu:

<?
$res = mysql_query("DELETE
FROM uczniowie WHERE id = 3");
$res = mysql_query("DELETE
FROM uczniowie WHERE id > 15");
?>

19.11. Funkcje do obsługi MySQL-a

W PHP istnieje wiele funkcji do kontaktu z bazą danych MySQL i obsługi zapytań. Podstawowe już znamy:

* mysql_connect – łączy z bazą danych,
* mysql_pconnect – łączy trwale z bazą danych,
* mysql_create_db – tworzy bazę danych,
* mysql_select_db – wybiera bazę danych,
* mysql_close – kończy połączenie z bazą danych,
* mysql_query – wysyła zapytanie do bazy danych.

19.12. mysql_num_rows()

Funkcja mysql_num_rows(rezultat) zwraca liczbę rekordów z wyniku zapytania skierowanego do serwera bazy. Poniższy przykład wyświetla liczę rekordów w tabeli uczniowie:

<?
$res = mysql_query("SELECT * FROM
uczniowie");
$ile = mysql_num_rows($res);
echo $ile;
?>

19.13. mysql_fetch_array()

Funkcja mysql_fetch_array(rezultat [,typ]) zwraca przy każdym wywołaniu kolejny wiersz z wyniku zapytania w postaci tablicy zwykłej lub asocjacyjnej (lub jednej i drugiej). Typ tablicy zależy właśnie od parametru typ. Może on przybrać wartość MYSQL_ASSOC (zwraca wynik w postaci tablicy asocjacyjnej), MYSQL_NUM (w postaci zwykłej tablicy) albo (domyślnie) MYSQL_BOTH (tablicy indeksowanej asocjacyjnie i numerycznie). Dla przykładu:

<?
$res = mysql_query("SELECT
* FROM uczniowie");
while($row =
mysql_fetch_array($res, MYSQL_BOTH)) {
echo ?ID to ?.$row[id].? a jego imie to: ?.$row[1];
}
?>

19.14. mysql_insert_id()

Funkcja mysql_insert_id() zwraca ID wygenerowane dla pola z własnością AUTO_INCREMENT. Uwaga! Funkcja mysql_insert_id() zwróci 0, gdy rekord był dodawany do tabeli bez pola AUTO_INCREMENT. Dla przykładu:

<?
$res = mysql_query("INSERT INTO
uczniowie (imie, nazwisko, dziennik)
VALUES ('Justyna', 'Koma', 13)");
$id = mysql_insert_id();
echo "ID ostatnio dodanego rekordu to: ".$id;
?>

19.15. mysql_result()

mysql_result(rezultat ,wiersz [,kolumna])- Bardzo przydatna funkcja, gdy trzeba się odwołać do konkretnego pola w konkretnym rzędzie wyniku. Wystarczy podać jako pierwszy argument zmienną z rezultatem zapytania, jako drugi wiersz, a jako trzeci (opcjonalnie)pole w danym wierszu (domyślne to 0).

<?
$res = mysql_query("SELECT * FROM uczniowie");
echo mysql_result($res, 0, 1);
//wyświetli imię pierwszego ucznia w tabeli
?>

19.16. mysql_error()

Funkcja mysql_error() pokazuje treść ostatniego błędu wygenerowanego przez serwer MySQL. Warto wywołać tę funkcję po zapytaniu do bazy, które powoduje błędy. Dla przykładu:

<?
$res = mysql_query("SELECT * FROM ucnziowie");
echo mysql_error();
?>

wyświetli coś w stylu „#1146 – Table 'baza.ucnziowie' doesn't exist”.

19.17. Wyświetlanie wyniku zapytania

Częstym błędem początkującego programisty jest próba wykonania następującego kodu:

echo $res;

Niestety, $res jest niejako obiektem zawierającym zgrupowane dane, a więc za pomocą echo nie da się ich bezpośrednio wyświetlić. Istnieją dwie podstawowe metody przeglądania danych z zapytania do MySQL-a. Pierwsza – wiersz po wierszu – i druga – bezpośrednio odwołując się do danego wiersza lub kolumny.

1. Pętla while i mysql_fetch_array
Dla przykładu:

<?
$res = mysql_query("SELECT * FROM config");
while($row = mysql_fetch_array($res, MYSQL_BOTH)) {
echo "config_name to ".$row[0]." a jego wartość to:
".$row[config_value];
}
?>

Przy każdej iteracji pętli zmienna $row staje się czteroelementową tablicą. Dzięki ustawionemu MYSQL_BOTH do rekordów mamy dostęp zarówno poprzez nazwy indeksów (np. config_value), jak i poprzez kolejne cyfry (w danym wypadku config_name to 0, a config_value to 1). Ważne jest to, by wybrać wygodniejszy dla siebie sposób, pamiętając o wadach każdego z nich (MYSQL_ASSOC to więcej pisania, przy MYSQL_NUM natomiast podczas zmiany zapytania może się „posypać” cały skrypt).

2. Funkcja mysql_result()
Metoda ta jest dobra przy pobieraniu pojedynczego elementu z dużego zapytania do bazy. Jej zaletą jest to, że nie trzeba przechodzić przez całą bazę, wadą jest natomiast konieczność znajomości dokładnej lokalizacji wyniku w zapytaniu (współrzędne wiersz i kolumna).
Dla przykładu:

<?
$res = mysql_query("SELECT * FROM config");
echo mysql_result($res,3,1); //wyświetli po prostu '25'
?>

Do administrowania swoją bazą danych, a w szczególności całym serwerem i wszystkimi bazami, polecamy używania darmowego skryptu phpMyAdmin. Pozwala on na bardzo szybki i sprawny nadzór nad bazami, tabelami i użytkownikami baz.

Polecam www.webhosting.pl
_________________
nauka na keyboardzie impresariat stroiciel agencja artystyczna nauka na pianinie stomatolog
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Tomasz



Dołączył: 18 Maj 2008
Posty: 413

PostWysłany: Wto Sie 05, 2008 20:58    Temat postu: Kurs PHP Odpowiedz z cytatem

Smarty

Smarty to system szablonów przygotowany dla PHP. Jego głównym zadaniem jest oddzielenie logiki skryptu (obliczeń, pobierania danych z bazy) od treści wyświetlanych na stronie. Po pierwsze, zwiększa to czytelność samego kodu – bardzo denerwujące jest, gdy fragmenty kodu są poprzedzielane blokami echo wyświetlającymi kilka znaków – a ponadto ułatwia pisanie aplikacji w zespołach. Załóżmy, że nad stroną gazety internetowej pracują dwie osoby: programista i grafik. Jeśli grafik chce zmienić layout strony wyświetlającej artykuły, nie musi zmieniać jej kodu. Wystarczy, że zmieni szablon, i gotowe. I sprawa odwrotna: programista, chcąc zmienić skrypt, nie musi się bać, że precyzyjnie zaprojektowana strona przygotowana przez grafika się rozsypie – zmienia kod PHP, nie ingerując przy tym w layout.

20.1. Instalacja

Aby zainstalować Smarty, trzeba przekopiować folder libs z archiwum smarty do folderu ze stroną. Następnie należy założyć cztery foldery: templates, templates_c, cache i configs, a później w pliku, gdzie chcemy wykorzystać Smarty, „includujemy” klasę libs/Smarty.class.php (uwaga na wielkość liter w systemach uniksowych!). Na końcu wystarczy utworzyć nowy obiekt na bazie klasy Smarty. Dla przykładu:

<?
require('libs/Smarty.class.php');
$smarty = new Smarty;
?>

System szablonów nie może się obyć bez… szablonu. Tworzymy więc pierwszy szablon i zapisujemy go w folderze templates. Dla przykładu:

Plik index.tpl:

Moje imię to:
{$imie}

Przypisujemy nową zmienną szablonu poprzez metodę assign() klasy Smarty. Pobiera ona dwa argumenty: nazwę zmiennej i jej wartość. Następnie wyświetlamy szablon za pomocą display(). Dla przykładu:

<?
require('libs/Smarty.class.php');
$smarty = new Smarty;
$smarty->assign('imie', 'Jacuś');
$smarty->display('index.tpl');
?>

Po uruchomieniu pliku index.php zobaczymy następującą treść:

Moje imię to:
Jacuś

20.2. Składnia Smarty

Domyślnie wszystkie tagi zamykają się w znakach { } (nawiasy klamrowe). Wszystko, co znajduje się poza nimi, wyświetlane jest bez zmian, tagi są natomiast parsowane przez Smarty.

20.3. Komentarze

Komentarze mieszczą się pomiędzy tagami {* i *}. Służą do organizowania struktury szablonu i nie są później w żaden sposób widoczne w kodzie gotowej strony. Dla przykładu:

{* Pokazuje imię ze zmiennej z pliku index.php *}
Moje imię to:
Jacuś

20.4. Zmienne

Zmienne są oznaczane, podobnie jak w PHP, symbolem dolara. Można je wyświetlać na kilka sposobów:

* {$zmienna} – wartość zwykłej zmiennej,
* {$zmienna[66]} – element tablicy o indeksach numerycznych,
* {$zmienna.pole} – element tablicy asocjacyjnej (w PHP: $zmienna['pole']),
* {$obiekt->zmienna} – zmienna obiektu $obiekt,
* {$obiekt->funkcja()} – metoda obiektu $obiekt,
* {$zmienna[pole]} – poprawne tylko w pętlach {section},
* {#foo#} – zmienna konfiguracyjna,
* {$smarty.config.foo} –zmienna konfiguracyjna (inny zapis).

20.5. Funkcje

Każdy tag Smarty albo wyświetla jakąś zmienną, albo uruchamia funkcję. Zmienne już znamy – teraz czas na funkcje. Dla przykładu:

{config_load file="kolorki.conf"}
{include file="gora.tpl"}
{if $podswietlenie}
Witaj, <font color="{#kolorek1#}">{$imie}!</font>
{else}
Witaj, {$imie}!
{/if}
{include file="dol.tpl"}

Są dwa rodzaje funkcji: wbudowane (np. if), których nie można modyfikować, i funkcje modyfikowalne, które są dodawane poprzez system plug-inów (wtyczek). Możemy je łatwo modyfikować, dostosowywać do swoich potrzeb i tworzyć nowe. Są to np. html_options czy html_select_date.

20.6. Inne delimitery tagów Smarty

Delimiterem domyślnie są znaki: { oraz }. Problem zaczyna się, gdy chcemy używać w szablonie np. JavaScriptu, który też korzysta z nawiasów klamrowych. Aby zmienić domyślne delimitery, podmieńmy zmienne left_delimiter i right_delimiter klasy Smarty. Dla przykładu:

<?
require('libs/Smarty.class.php');
$smarty = new Smarty;
$smarty->left_delimiter= '<!--{';
$smarty->right_delimiter= '}-->';
$smarty->assign('tekst', 'cośtam');
$smarty->display('index.tpl');
?>

plik index.tpl:

{* Inny delimiter *}
<script type="text/javascript">
<!--
if (warunek_spełniony){
alert("<!--{$tekst}-->"); //zadziała
}
//-->
</script>

Polecam www.webhosting.pl
_________________
nauka na keyboardzie impresariat stroiciel agencja artystyczna nauka na pianinie stomatolog
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Moja Rekomendacja Strona Główna » Luźne rozmowy na każdy temat Wszystkie czasy w strefie EET (Europa)
Idź do strony Poprzedni  1, 2
Strona 2 z 2

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

Nauka gry na klarnecie w Częstochowie Stomatolog Częstochowa Impresariat Katalog branży artystycznej

Powered by phpBB © 2001, 2002 phpBB Group
iCGstation v1.0 Template By Ray © 2003, 2004 iOptional