Zmienne w MySQL

W skryptach bazodanowych możemy używać zmiennych do przechowywania danych, a następnie korzystać z nich w dalszej cześci skryptu.
Zmienną ustawia się następująco:

SET @zmienna=10;

Natomiast odwołujemy się do naszej zmiennej następująco:

SELECT @zmienna;

Rozróżniana jest wielkość liter więc @zmienna to nie to samo co @Zmienna.

Krótszy JOIN

Jeśli chcemy połączyć dwie tabele w zapytaniu wg jakiegoś pola, które nosi taką samą nazwę w obu tabelach dobrze jest zamiast ON użyć konstrukcji USING(nazwa_pol). Wówczas zamiast konstrukcji:

SELECT * FROM tabela1 t1 INNER JOIN tabela2 t2 ON t1.id=t2.id

Mamy:

SELECT * FROM tabela1 INNER JOIN tabela2 USING(id)

Już na tym krótkim przykładzie widać, że fragment z USING jest o wiele krótszy. Jeśli zapytanie byłoby bardziej rozbudowane i dotyczyłoby łączenia po paru innych polach tego typu skrót jest bardzo przydatny.

Jak przypisać wartości zawarte w tablicy poszczególnym zmiennym – czyli lista + tablica

Czasem potrzebujemy przypisać wartości z danej tablicy pewnym konkretnym zmiennym. Można to zrobić w bardzo prosty sposób korzystając z listy:

$tablica = array(‘wartosc1′, ‘wartosc2′, ‘wartosc3′);
list($zmienna1, $zmienna2, $zmienna3) = $tablica;

Wówczas $zmienna1 będzie mieć wartość ‚wartosc1’, $zmienna2 – ‚wartosc2’, $zmienna3 – ‚wartosc3’;

Jeśli argumentów w liście po lewej stronie będzie więcej niż elementów tablicy, wartość nadmiarowych będzie pusta.

Moje ulubione nowe funkcje w PHP 5

Z szeregu nowych funkcji wybrałam parę – moim zdaniem bardzo przydatnych – funkcji:

Po pierwsze funkcja array_combine(). Umożliwia stworzenie tablicy asocjacyjnej na podstawie dwóch innych tablic – pierwsza z nich to tablica kluczy, a druga tablica wartości.

$tab1 = array('klucz1', 'klucz2', 'klucz3');
$tab2 = array('wartosc1', 'wartosc2', 'wartosc3');
$tab3 = array_combine($tab1, $tab2);

Wówczas tablica $tab3 ma postać:

$tab3 = array('klucz1'=>'wartosc1', 'klucz2'=>'wartosc2', 'klucz3'=>'wartosc3');

Drugą jak dla mnie dość przydatną funkcją jest http_build_query(). Funkcja ta z argumentów podanych w tablicy (bądź obiektu) jako argumencie wejściowym tworzy łańcuch podobny łańcuchowi powstającemu przy przesyłaniu danych metodą GET. Dlatego też funkcja ta może się przydać do budowania takich właśnie zapytań, ale nie tylko.

Tablicą wejściową może być zwykła tablica:

$tab = array('zyrafa', los', 'hipopotam')
http_build_query($tab);

Wówczas stworzony łańcuch wygląda następująco:

0=zyrafa&1=los&2=hipopotam

Może to być tablica asocjacyjna:

$tab = array('duze zwierze'=>'zyrafa', 'rogate zwierze'=>'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab);

Wówczas łańcuch będzie miał postać:

duze+zwierze=zyrafa&rogate+zwierze=los&hipopotamowate=hipopotam

Może być mieszanka tablicy normalnej z asocjacyjną:

$tab = array('zyrafa', 'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab);

Funkcja zwróci wówczas:

0=zyrafa&1=los&hipopotamowate=>hipopotam

Jeśli nie chcemy by elementy były indeksowane samymi cyframi, można do funkcji dodać argument stanowiący przedrostek:

$tab = array('zyrafa', 'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab, 'arg');

Otrzymamy:

arg0=zyrafa&arg1=los&hipopotamowate=>hipopotam

Jak już jesteśmy przy argumentach funkcji należałoby dodać, że można również określić za pomocą jakiego znaku mają być łączone argumenty. Domyślnie jest nim znak &, ale może być to dowolny inny.

$tab = array('zyrafa', 'los', 'hipopotam')
http_build_query($tab, '', '|');

Wówczas stworzony łańcuch wygląda następująco:

0=zyrafa|1=los|2=hipopotam

Jeśli argumentem funkcji będzie tablica wielowymiarowa postaci:

$tab = array
(
	'osoba' => array
			(
 
				'imie' => 'Jan',
				'nazwisko' => 'Kowalski',
				'wiek' => 20
 
			)
);

Wówczas otrzymamy łańcuch postaci

osoba%5Bimie%5D=Jan&osoba%5Bnazwisko%5D=Kowalski&osoba%5Bwiek%5D=20

Jak widać został on już encodowany z postaci:

osoba[imie]=Jan&osoba[nazwisko]=Kowalski&osoba[wiek]=20

MySQL 5 – czego nie było wcześniej cd 2

Triggery zwane inaczej wyzwalaczami, ponieważ ich wywołanie zwykle uzależnione jest od jakiegoś zdarzenia. Zdarzeniem tym zwykle jest jakaś operacja na danych – INSERT, DELETE bądź UPDATE. Wyzwalacz może być wywoływany albo przed (BEFORE) albo po (AFTER) zdarzeniu (włożeniu do bazy rekordu, usunięciu go lub zmienieniu)

Przykładowo utworzony trigger:

CREATE TRIGGER nazwa_triggera
BEFORE UPDATE ON nazwa_tabeli
FOR EACH ROW SET NEW.nazwa_pola="jakis tekst";

Trigger ten jest może średnio przydatny ale dobrze ilustruje możliwości. Co powoduje – otóż przed każdym insertem do tabeli „nazwa_tabeli” w pole nazwa_pola wpisywany jest „jakis_tekst”. Nawet jeśli polecenie INSERT będzie wyglądać mniej więcej tak:

CREATE TRIGGER nazwa_trigger
AFTER DELETE ON nazwa_tabeli
FOR EACH ROW SET @oidy=CONCAT(@oidy,','OLD.id);

To trigger spowoduje, że zamiast tekstu „tralalalala” zostanie w bazie umieszcziony tekst „jakis tekst”. Przyda się to jeśli już po stronie serwera baz danych chcemy w jakiś sposób weryfikować dane zapisywane do bazy. Oczywiście zamiast możemy też zrobić trigger reagujący na UPDATE danych:

CREATE TRIGGER nazwa_triggera
BEFORE UPDATE ON nazwa_tabeli
FOR EACH ROW SET NEW.nazwa_pola="jakis tekst";

Wówczas jeśli wywołamy następujący UPDATE:

UPDATE nazwa_tabeli SET id=id+12 WHERE id>12;

Wszystkie wiersze przetworzone przez to zapytanie, czyli te gdzie w polu id jest liczba większa od 12 w polu nazwa_pola będą miały tekst postaci „jakis tekst”.

Można by też zrobić trigger, który zwróci nam id wszystkich usuniętych z bazy elementów:

CREATE TRIGGER nazwa_triggera
AFTER DELETE ON nazwa_tabeli
FOR EACH ROW SET @oidy=CONCAT(@oidy,','OLD.id);

Następnie usuwamy to co potrzebujemy uprzednio ustawiając zmienną @oidy na pustą:

SET @oidy='';
DELETE FROM nazwa_tabeli WHERE id>100;

Żeby dowiedzieć się jakie id zostały usunięte:

SELECT @oidy

Wówczas otrzymamy ciąg w postaci np.:125,240,2134