select

Transkrypt

select
SYSTEMY
TELEINFORMATYCZNE
Upload – MySQL
AiR 5r.
Wykład 6
Upload plików
Formularz
<form action="upload.php" method="post"
enctype="multipart/form-data">
<input type="file" name="obrazek1" />
<input type="submit" value="Wyslij" />
</form>
Dostępna jest na serwerze asocjacyjna dwuwymiarowa tablica
$_FILES
nazwy pól input
obrazek1
name
type
tmp_name
error
size
obrazek2
…
Plik upload.php
<?php
//print_r($_FILES);
echo "<BR>";
if (isset($_FILES['obrazek']))
{
if ($_FILES['obrazek']['error']==0)
{
echo "tmp_name:".$_FILES["obrazek"]["tmp_name"];
echo "<BR>name:".$_FILES["obrazek"]["name"];
if (is_uploaded_file($_FILES["obrazek"]["tmp_name"]))
if (!file_exists('./zdjecia/'.$_FILES["obrazek"]["name"]))
{
move_uploaded_file($_FILES["obrazek"]["tmp_name"],'./zdjecia/'.$_FILES["obrazek"]["name"]);
// tu można dodać nazwę pliku do bazy danych
echo "<p>Plik dodany</p>";
}
else echo "<p>Taki plik już był w tym katalogu</p>";
}
}
cd.
$filename = './zdjecia/'.$_FILES["obrazek"]["name"];
if (file_exists($filename))
echo "Plik ". $filename." istnieje";
else {
echo "Plik". $filename ." nie istnieje";
}
$nazwa_kat = 'zdjecia';
echo "<BR />Utworzenie tablicy nazw zdjęć w katalogu: ".$nazwa_kat ."<BR />";
$kat = opendir($nazwa_kat); //otwarcie katalogu do czytania
while ($naz_pliku = readdir($kat)) //warunek zakończenia spisu
if (($naz_pliku !=".")&&($naz_pliku !="..")) //pominięcie . i ..
$tbl[ ]=$naz_pliku;//nazwy do tablicy
closedir($kat); //zamknięcie katalogu
//… dalej wyświetlenie tablicy i …obrazków….
?>
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 A<=C o ile porównywane wyrażenia są tego
samego typu.
Metaznaki
% - zastępuje dowolny ciąg znaków
_
(podkreślnik) – zastępuje 1 dowolny znak
Przykłady:
select * from dostawcy where nazwa like "a%";
nazwa rozpoczyna sie od "a"
select * from dostawcy where nazwa like "%al%";
nazwa zawiera frazę "al"
select * from dostawcy where nazwa like "_a%";
litera "a" na drugim miejscu nazwy
Operatory logiczne w klauzuli WHERE
• NOT: logiczna negacja. MySQL dopuszcza
jako alternatywną notację wykrzyknik (!).
• OR: logiczna alternatywa. MySQL
dopuszcza alternatywną notację ||
• AND: logiczna koniunkcja. Tu również
MySQL dopuszcza notację &&.
Wyrażenia logiczne
Złożone wyrażenia logiczne, zbudowane za
pomocą operatorów logicznych, zwracają:
• 1 jako reprezentację wartości prawdziwej,
• 0 jako reprezentację fałszu.
Przykłady klauzuli WHERE
.. WHERE nazwa_pola1=wartość
.. WHERE n_p1=war1 AND n_p2=war2
.. WHERE n_p1=war1 OR n_p2=war2
.. WHERE n_p between war1 AND war2
.. WHERE cena<100
.. WHERE n_p LIKE '%fraza%'
.. WHERE n_p1=wartosc1 OR n_p2=wartosc2
Przykłady
SELECT id, nazwa FROM dostawcy;
SELECT * FROM magazyn;
SELECT id_t, nazwa from magazyn WHERE
cena_n>50;
SELECT id_t, nazwa from magazyn WHERE cena_n
between 50 and 80;
SELECT id_t, nazwa from magazyn WHERE
cena_n>50 and cena_n<80 ;
SELECT id_t, nazwa from magazyn WHERE
cena_n>50 and cena_n<80 ORDER BY cena_n ;
SELECT id_t, nazwa from magazyn WHERE
cena_n>50 and cena_n<80 ORDER BY cena_n
desc;//desc oznacza kolejność malejącą
lub użycie operatora between
Można też używać kwerendę SELECT do obliczeń:
SELECT 4*5;
Można też wykonywać operacje na polach:
SELECT nazwa, cena*5 from towary;
SELECT 4*5;
SELECT kat, count(id_t) from towary group by kat;
Porada: wypróbowywać poprawność kwerend
w MyPHPAdmin
Wyrażenia arytmetyczne na polach tabeli
Proste operatory arytmetyczne to dodawanie (+), odejmowanie (-),
mnożenie (*) i dzielenie (/).
Wynikiem dzielenia przez zero jest NULL.
Ponadto w MySQL dostępny jest dość bogaty zestaw funkcji
matematycznych (wykładnicze, logarytmiczne, trygonometryczne
itp.). W wypadku błędu (nielegalnego argumentu) zwracana jest
wartość NULL.
SELECT cena_netto+VAT*cena_netto AS cena_brutto
FROM magazyn;
alias
tabela
MySQL - FUNKCJE MATEMATYCZNE - niektóre
exp(x) ln(x) sin(x) pow(x,y) sqrt(x) pi()
mysql> 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 <BR>";
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."<BR>";
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
<?php
$connection=
mysql_connect('localhost',student01,
'S@moloty') or die("Nie udało się");
Przykład
mysql_select_db('ksiegarnia');
$sql="select autor, tytul from ksiazki";
$wyn = mysql_query($sql);
echo "<FONT size=5>";
$tabela=mysql_fetch_array($wyn);
//albo w pętli
echo $tabela[0];
//przewinięcie zasobu na początek
echo "<B> ---".$tabela[1]."</B><BR>";
$tabela=mysql_fetch_array($wyn);
echo $tabela[0];
echo "<B> ---".$tabela[1]."</B><BR>";
mysql_data_seek($wyn,0);
while ($wiersz=mysql_fetch_array($wyn))
{
echo $wiersz[0]. "---". wiersz[1] "---".
wiersz[2]."<BR>";
}
?>
Wyświetlenie rezultatów w pętli while
<?php
$pol=mysql_connect('localhost', 'root', 'krasnal') or
die('Nie można się połączyć: ' . mysql_error());
mysql_select_db('hurtownia');
$wynik = mysql_query("SELECT kod_towaru, opis FROM
kategorie");
while ($row = mysql_fetch_array($wynik))
{
echo "ID: ". $row[0]. " Nazwa: ". $row[1]."<BR/>";
}
?>
…lub dostęp asocjacyjny
<?php
$polaczenie=mysql_connect('localhost', 'root', 'krasnal') or
die('Nie można się połączyć: ' . mysql_error());
mysql_select_db('hurtownia');
$wynik = mysql_query("SELECT kod_towaru, opis FROM
kategorie");
while ($row = mysql_fetch_array($wynik))
{
echo "ID:". $row['kod_towaru']." Nazwa:". $row['opis']."<BR>";
echo "<BR>";
}
mysql_close($polaczenie);
?>

Podobne dokumenty