SYSTEMY TELEINFORMATYCZNE
Upload – MySQL AiR 5r.
Wykład 6
Upload plików Formularz
Dostępna jest na serwerze asocjacyjna dwuwymiarowa tablica
$_FILES nazwy pól input
obrazek1 name type tmp_name error size
obrazek2
…
Plik upload.php
Serwer MySQL – język zapytań Firma Oracle wersje: od 3 przez 5.1 aż do 7.1 (MySQLCluster)
też wersje dla Windows
Metody zarządzania bazą: proces mysqld.exe lub mysql_nt.exe(menedżer zadań Windows).
PhpMyAdmin (przeglądarka) Konsola MySQL (lokalnie lub zdalnie) • • • •
Uruchomienie wiersza polecenia (START - Uruchom… cmd – lub Programy –Akcesoria - Wiersz polecenia). Przechodzimy do foldera c:\usr\mysql\bin mysql –u root –p wpisujemy hasło i możemy używać kwerend MySQL
W skryptach PHP
Pliki baz danych tworzone są zwykle w folderze .......mysql/data
Uruchomienie lokalne konsoli MySQL c:\usr\mysql\bin>mysql –u root –p Password:..............
Zgłasza się konsola MySQL – gotowość do wpisywania poleceń: mysql> zdalnie na serwerze folder /var/lib/mysql
Baza danych składa się z tabel Tabele to zestaw rekordów danych elementarnych (pola rekordu) Model relacyjny Normalizacja tabel i związki między nimi (złączenia) - ERD rekord rekord
pole
id
nazwa
adres
1
ABC
Rzeszów...
2
...
...
OPERACJE SQL NA BAZIE (kwerendy) • • • • • •
tworzenie bazy i tabeli selekcja rekordów wstawianie rekordów modyfikacja treści rekordów modyfikacja struktury usuwanie rekordów, tabeli, bazy
Poznanie języka SQL będzie nam potrzebne do wykonania opreacji na bazie w skryptach PHP
TWORZENIE BAZY będziemy tworzyć w PHPMyAdmin, ale można też wykonać kwerendą w zdalnej konsoli MySQL lub wykonać kwerendę w PHP
CREATE DATABASE nazwa_bazy;
TWORZENIE TABELI będziemy tworzyć w PHPMyAdmin ale można tez wykonać kwerendą lub w PHP wykonać kwerendy:
USE nazwa bazy; CREATE TABLE nazwa_tabeli (nazwapola1 typ parametry, nazwapola2 typ parametry, ........itd); parametry: NOT NULL - niepuste
PRIMARY KEY – klucz główny AUTO_INCREMENT - autonumerowanie DEFAULT wartosc_domyślna Np. CREATE TABLE dostawcy (Id INT(10) AUTO_INCREMENT PRIMARY KEY, Nazwa VARCHAR(10), Adres VARCHAR(30));
Każda tabela ma pola określonego typu – jedno z nich powinno być kluczem głównym – wartości w tym polu są unmikalne
TYPY DANYCH Standard ISO SQL (1992) przewiduje około piętnastu typów danych, podzielonych na grupy:
Typy tekstowe - alfanumeryczne (String) VARCHAR(N) jest polem o zmiennej długości nie przekraczającej N
Także BLOB (binarne), SET (zbiór).
Typy liczbowe (Numeric) INT, BIGINT, FLOAT, DECIMAL Na ogół dostępnych jest wiele różnych typów liczbowych, różniących się możliwym zakresem wartości (INT, BIGINT, SMALLINT, ...) i precyzją (FLOAT, DOUBLE PRECISION, ...). Typ DECIMAL(M,D) to liczba (ułamek) dziesiętny o ustalonej liczbie cyfr dziesiętnych w części całkowitej i ułamkowej.
Typy daty i godziny
DATE TIME DATETIME TIMESTAMP
WYŚWIETLENIE (WYBÓR - SELEKCJA) REKORDÓW TABELI z wykorzystaniem klauzul
SELECT [tabela.]{* | [lista_pól]} FROM lista_nazw_tabel [WHERE warunek] [ORDER BY .... ] /sortowanie [GROUP BY ...]; /agregacja – sumowanie lub zliczanie z grupowaniem wg wybranego pola
[ opcja] { do wyboru albo | albo}
Operatory porównania w warunkach • • • • • • •
Równość: Nierówność: Mniejszy lub równy Większy lub równy Większy niż Mniejszy niż Porównanie do wzorca
= lub = > < LIKE
!=
• A BETWEEN B AND C: wyrażenie takie jest równoważne A>=B AND A50 and cena_n50 and cena_n50 and cena_n SELECT sum(pole_liczbowe) from towary; mysql> SELECT ABS(-32);
-> 32
mysql> SELECT SIGN(-32);
-> -1
mysql> SELECT MOD(234, 10); (albo operator %) -> 4 mysql> SELECT FLOOR(1.23); mysql> SELECT FLOOR(-1.23);
-> 1 -> -2
mysql> SELECT ROUND(1.298, 0); mysql> SELECT ROUND(23.298, -1);
-> 1 -> 20
Przykłady: SELECT sum(cena*ilosc)*0.9 FROM towary; SELECT cena*0.9 AS Przecena FROM ksiazki WHERE autor='Tuwim'; SELECT cena*0.9 AS Przecena FROM ksiazki WHERE autor like 'T%'; SELECT cena, VAT, cena+VAT AS Cena_br FROM ksiazki WHERE tytul LIKE '%przygody%';
Funkcje dotyczące daty i godziny CURDATE() lub CURRENT_DATE: zwraca bieżącą datę w postaci YYYY-MM-DD (rok-miesiąc-dzień), lub YYYYMMDD, w pierwszym wypadku jako napis, w drugim jako liczbę całkowitą CURTIME() lub CURRENT_TIME: zwraca bieżącą godzinę w postaci HH:MM:SS (godzina:minuta:sekunda), lub HHMMSS NOW() : zwraca bieżącą datę i godzinę w postaci napisu YYYY-MM-DD HH:MM:SS
DATE_FORMAT(data, format): konwertuje datę na napis, którego format można kontrolować za pomocą napisu formatującego. TIME_FORMAT(czas, format): funkcja analogiczna do powyższej, lecz akceptująca jedynie specyfikatory formatu dotyczące godziny, minuty i sekundy. TO_DAYS(data): zamienia datę na liczbę całkowitą oznaczającą liczbę dni od początku roku 0. Funkcja ta (oraz następna) przydają się do obliczania liczby dni jakie upłynęły między dwiema datami. FROM_DAYS(liczba_dni): zamienia liczbę całkowitą, interpretowaną jako liczba dni od początku roku 0, na datę (napis postaci YYYY-MM-DD).
Przykłady
SELECT TO_DAYS('2010-04-11') zwróci 734238
SELECT FROM_DAYS(734238) zwróci 2010-04-11
SELECT TO_DAYS(CURDATE())TO_DAYS('2010-01-01') zwróci liczbę dni od początku roku do dziś ZAMIAST CURDATE()
można stosować NOW()
WSTAWIENIE REKORDU Z DANYMI DO WYBRANYCH PÓL INSERT INTO tabela VALUES (NULL, wartość1, wartość2...); INSERT INTO tabela SET p_key=NULL, pole1=wartość1, pole2=wartość2...;
Pozostałe pola pozostaną puste, jeśli nie mają cechy WYMAGANIE – not null
Modyfikacja treści REKORDÓW UPATE tabela SET pole=wartosc WHERE warunek_selekcji; Przykłady: UPATE klienci SET nazwisko="Kowalski" WHERE id=8; UPDATE towary SET cena_VAT=cena*1.22 WHERE cena_VAT>30;
USUWANIE REKORDÓW DELETE FROM nazwa_tabeli WHERE warunki; np.: DELETE FROM dostawcy; usuwa wszystkie rekordy !!! DELETE FROM dostawcy WHERE nazwa LIKE 'ABC';
usuwa wszystkie rekordy w których polu Nazwa jest wartość 'ABC'
Korekta struktury tabeli (dodawanie pola, zmiana nazwy pola, zmiana typu pola itp
Kwerenda ALTER TABLE tabela CHANGE | ADD | RENAME .. ; Ewentualnie w miarę potrzeby wykorzystania w projekcie – doczytać w internecie Łatwiejsza jest praca interakcyjna w phpMyAdmin host/phpmyadmin – logowanie na konta studenckie
USUWANIE TABELI DROP TABLE nazwa_tabeli;
DELETE FROM dostawcy; usuwa wszystkie rekordy !!! DELETE FROM dostawcy WHERE nazwa LIKE 'ABC';
usuwa wszystkie rekordy w których polu Nazwa jest wartość 'ABC'
SQL złączenia tabel
Szczególne znaczenie ma klauzula WHERE w postaci:
WHERE tab1.pole_klucz_glowny=tab2.pole_key_kl_obcy
Posiada ważną rolę przy konieczności wyboru danych z dwóch tabel o typie złączenia 1:N
Wybór danych z kilku tabel SELECT tabela1.P1, tabela2.K1,... FROM tabela1,tabela2 WHERE tabela1.key_t1=tabela2.f_key_t2
tabela1
tabela2
Key_t1
Key_t2
P1
K1
P2
K2
P3
K3
P4
f_key_t2
marka id_m
typ
producent
nazwa_p
1
Niemcy
AUDI
1
1
A6
2
Polska
Fiat
2
1
A8
3
Francja
Citroen
3
1
100
4
USA
Ford
4
2
126p
5
2
Cinquecento
6
2
Panda
7
3
Berlingo
8
3
Xara
9
3
C3
1:N
id_t
marka_id
nazwa_t
SELECT typ.nazwa_t, marka. nazwa_p FROM marka, typ WHERE marka.id_m=typ.marka_id Złączenie tabel przez klucz główny tabeli MARKA i klucz obcy w tabeli TYP Uwaga – wymaganie NOT NULL dla pola marka_id
PHP i MySQL Kolejność czynności: • połączenie z serwerem MySQL • wybór bazy • wykonanie kwerendy • wyświetlenie rezultatów (o ile jest to SELECT)
Połączenie z serwerem MySQL mysql_connect(host,user,password) funkcja - zwraca uchwyt do zasobu– tzw. resource id lub false
Przykład: $connection= @mysql_connect('localhost', $user, $password) or die ("Nie udało się"); if ($connection) echo "Połączyłeś się z bazą "; Można pominąć wyświetlenie komunikatu błędu poprzedzając nazwę funkcji znakiem @ die(text) równoważne exit( ) ;
Wybór bazy - parametrem jest nazwa bazy
mysql_select_db(nazwa) mysql_select_db('personel');
Operacje na bazie wykonywane PRZY POMOCY POLECEŃ SQL
mysql_query (SQLstring, connection) funkcja - wysyła zapytanie do aktywnej bazy na serwerze skojarzonym z podanym identyfikatorem połączenia - parametrem jest tekst zapytania MySQL (podany dosłownie lub wcześniej zdefiniowana zmienna tekstowa) mysql_query() zwraca identyfikator wyniku (lub FALSE w przypadku niepowodzenia) jedynie dla zapytań typu SELECT, SHOW, EXPLAIN i DESCRIBE
$wynik =mysql_query($query); Każdą kwerendę MySQL można wykonać w PHP W przypadku kwerendy SELECT zmienna $wynik jest tzw. uchwytem do zasobu - handle
np. dodawanie danych do tabeli 1. Tworzenie interfejsu do dodawania rekordu (formularz) Formularz HTML powinien zawierać pola wejściowe dla każdej kolumny tabeli. Nazwy pól formularza powinny być takie same jak nazwy pól tabeli. MAXLENGHT w polach formularza powinien być taki jak dla odpowiednich pól (jeśli ustalono). 2. Tworzenie skryptu PHP do wstawiania rekordów do tabeli:
//... połączenie z serwerem MySQL $polecenie="INSERT into tabela VALUES (NULL,'" .$_POST['p1name']. "'," .$_POST['p2name']. "," itd $rezultat = mysql_query($polecenie, $connection);
ZMIENNA ZAPYTANIA – łańcuchowa $query="select id_ks, autor, tytul, cena from ksiazki where autor like '%$autor%' and tytul like '%$tytul%' ";
$query="select id_ks, autor, tytul, cena from ksiazki where autor like \"%$autor%\" and tytul like \"%$tytul%\" "; //Jeśli niepuste pola graniczne cen… if ($cena_od != 0) //to przedłużamy zapytanie
$query .= "and cena between
$cena_od and
$cena_do"; echo "Oto postać SQL: $query
";
Pomocnicze funkcje mysql_num_rows($wynik) Funkcja – zwraca liczbę znalezionych rekordów SELECTparametrem jest wartość zmiennej rezultatu ($wynik)
mysql_query Aby pobrać ilość wierszy przetworzonych w operacjach INSERT, UPDATE lub DELETE należy użyć funkcji
mysql_affected_rows(). Przykład: $ile = mysql_num_rows($wynik); echo "Rekordów:". $ile."
";
Wyświetlenie wyników kwerendy Funkcje
mysql_fetch_array($wynik) mysql_fetch_row ( $wynik) ich argumentem jest zmienna będąca wynikiem zapytania, efektem jest tabela z danymi jeśli jest to zapytanie SELECT
mysql_fetch_array($wynik) Funkcja – zwraca tablicę (wiersz) składającą się z pól znalezionego rekordu – sekwencyjnie uruchamiana zwraca kolejne rekordy, parametrem jest zmienna rezultatu zapytania SQL. Kolejne wywołanie MYSQL_FETCH_ARRAY () zwróci następny wiersz z wyniku , lub FALSE jeżeli nie ma więcej wierszy. np. mysql_fetch_array($wynik);
albo alternatywnie
mysql_fetch_row ( $wynik) Zwraca tablicę zawierającą wiersz rekordu lub FALSE jeżeli nie ma więcej wierszy w wynik, pobiera jeden wiersz danych z wyniku skojarzonego z podanym identyfikatorem wyniku. Wiesz zwracany jest jako tablica. Komórki są umieszczone pod indeksami, zaczynając od 0.
Kolejne wywołanie MYSQL_FETCH_ROW () zwróci następny wiersz z wyniku, lub FALSE jeżeli nie ma więcej wierszy. MYSQL_FETCH _ROW szybsze ale mniej elastyczne od MYSQL_FETCH_ARRAY
A zatem...kolejność czynności - połaczenie z Mysql – mysql_connect - otwarcie (wybór) bazy
- mysql_select_db
- sformułowanie zapytania
$zmienna='select…
- wykonanie zapytania mysql_query - ewentualne wyświetlenie wyników zapytania z wykorzystaniem uchwytu do zasobu funkcją mysql_fetch_array
Wyświetlenie rezultatów w pętli while
…lub dostęp asocjacyjny