Mateusz Dutkiewicz
KURS MySQL
Spis treści
Wstęp
Instalacja
Pierwsza baza
Pobieranie danych
Dodawanie rekordów
Kasowanie danych
Modyfikacja danych
Przeszukiwanie bazy
Podsumowanie
Funkcje mysql
Wstęp
MySQL to najpopularniejszy serwer bazodanowy, wyprodukowany przez firmę T.c.X DattaKonsultAB. Udostępniany wraz z kodem źródłowym, na zasadach określonych w licencji GNU. Wymienione dalej możliwości MySQL'a sprawiają, iż stanowi poważną konkurencję dla podobnych, lecz komercyjnych produktów: baza danych zdolna pomieścić nawet kilkadziesiąt milionów rekordów (wielkość ta zależy jedynie od fizycznych możliwości komputera) interfejsy API dla najważniejszych języków programowania (m.in. C, PHP, Perl) wykorzystanie mocy komputerów wieloprocesorowych nieograniczona liczba użytkowników mogących jednoczenie korzystać z bazy danych duża szybkość działania (wynikająca jednak w pewnym stopniu z braku niektórych funkcji - np. obsługi transakcji) MySQL może zostać uruchomiony na maszynach pracujących pod kontrolą takich systemów jak Windows, Unix, Mac OS, OS/2. My będziemy opierać się o wersję 3.23.28-gamma pod system Windows, gdyż większość z was na tym systemie pracuje. Serwer MySQL możecie pobrać z mojej strony odwiedzając dział downloads/programy . Do pracy potrzebny będzie nam interpreter języka PHP oraz serwer www np. Apache. Obecnie właśnie najpopularniejszą konfiguracją większości serwerów jest APACHE/PHP/MYSQL charakteryzuje ją niezawodność i duża wydajność, a co najważniejsze wszystkie elementy są darmowe. Pracę z bazą danych zaczniemy od instalacji oraz konfiguracji tych elementów.
Instalacja
MySQL instalujemy w katalogu mysql na dysku systemowym (C:). Typ instalacji jaki wybieramy to custom. Zaznaczmy wszystkie elementy bo przecież nigdy nie wiadomo kiedy coś może się przydać. Baza dodaje się automatycznie do autostartu, powoduje to uruchamianie jej przy starcie systemu. Bazę otwieramy klikając na ikonkę sygnalizacji świetlnej na pasku i wybierając opcję Show me. Najważniejsza część to utworzenie hasła oraz loginu do bazy. Część konfiguracyjna bazy znajduje się w zakładce my.ini Setup . Zmieniamy zawartość okna. Przykładowo powinno ono wyglądać tak:
#This File was made using the WinMySQLadmin 1.0 Tool
#2001-07-27 17:42:13
#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions
[mysqld]
basedir=C:/MYSQL
#bind-address=127.0.0.1
datadir=C:/MYSQL/data
language=C:/MYSQL/share/polish
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[WinMySQLadmin]
Server=C:/MYSQL/bin/mysqld-opt.exe
user=admin
password=haslo
Część pierwsza [mysqld] zawiera podstawowe ustawienia bazy, jej katalog (basedir), katalog z danymi (datadir), język (language) my możemy tu zmienić na language=C:/MYSQL/share/polish (sprawdź najpierw czy taki folder istnieje gdyż tworzony jest w momencie wyboru instalacji typu custom).
Część druga [WinMySQLadmin] to część w której najważniejsze dla nas są dwie zmienne user (użytkownik na którego będziemy logować się do bazy) i password (nasze hasło).
By uaktywnić jakąś inną funkcję lub jakąś wyłączyć wystarczy albo usunąć znak # (hasz) albo go dodać przed zmienną. Zmiany zapisujemy poprzez kliknięcie w przycisk Save Modification znajdujący się z lewej strony. Dodatkowo możemy tu utworzyć skrót w menu START klikając na przycisk Create ShortCut on Start Menu.
MySQL został skonfigurowany.
Teraz zajmiemy się konfiguracja PHP. Otwieramy plik php.ini lub php3.ini (w zależności od wersji php) znajdujący się w katalogu Windows ze zwykłego notatnika. Czasami wystarczy usunąć średnik z linijki ;extension=php3_mysql.dll , który znajduje się na początku linii. Zapisać plik i wszystko będzie grało. Czasami jednak trzeba jeszcze zmodyfikować część tego pliku odnośnie bazy MYSQL:
[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_host = 127.0.0.1
mysql.default_user = admin
mysql.default_password = haslo
Tu musimy podać host na którym pracuje baza ustawiamy lokalny 127.0.0.1 użytkownika oraz jego hasło. Zapisujemy dokonane w pliku zmiany. Jeżeli wszystko wykonaliście poprawnie baza będzie działać.
Uruchamiamy kolejno serwer www np. Apache oraz serwer MYSQL. Jeżeli na ikonce mysql'a na pasku start mamy zielone światło oznacza to, że możemy już pracować.
Dokonamy testu. Otwieramy notatnik i tworzymy plik phpinfo.php w treści wpisujemy :
<?PHP
phpinfo();
?>
Uruchamiamy skrypt z przeglądarki np. http://127.0.0.1/phpinfo.php . W efekcie powinniśmy uzyskać informacje o naszym php. Jeżeli część odnośnie mysql wygląda podobnie i jest oznaczona jako enabled wszystko jest ok.
mysql
MySQL Support |
enabled |
Active Persistent Links |
0 |
Active Links |
0 |
Client API version |
3.23.32 |
Directive |
Local Value |
Master Value |
mysql.allow_persistent |
On |
On |
mysql.default_host |
127.0.0.1 |
127.0.0.1 |
mysql.default_password |
haslo |
haslo |
mysql.default_port |
no value |
no value |
mysql.default_socket |
no value |
no value |
mysql.default_user |
admin |
admin |
mysql.max_links |
Unlimited |
Unlimited |
mysql.max_persistent |
Unlimited |
Unlimited |
Tworzymy pierwszą bazę
Zaczynając pracę z bazą danych trzeba poznać kilka pojęć. Baza MySQL oparta jest na języku SQL (Structured Query Language) i właśnie w nim będziemy tworzyć zapytania czyli polecenia zrozumiałe przez bazę. Baza danych zawiera w sobie tabelki. Tabelka zawiera pola które określają co będzie zawierał dodany do bazy rekord. Przykładowo w bazie chcemy mieć tabelkę z danymi osobowymi tak więc do tabelki wstawiamy pola np.: IMIĘ, NAZWISKO, DATA URODZENIA, ADRES, TELEFON. Dodany rekord przykładowo wyglądał by tak: Jan Kowalski, 1981.12.28, ul.Długa 6 m 23 Toruń, 7632325. Mam nadzieję, że wszystko jest zrozumiałe.
By utworzyć bazę do której będziemy dodawać wpisy skierowane np. z formularza na naszej stronie mamy do dyspozycji 3 sposoby.
Pierwszy polega na utworzeniu pliku który zostanie przetworzony i skompilowany przez bazę danych.
Drugi to praca z programem MySqlManager (znajduje się w katalogu bin).
Trzeci (moim zdaniem najlepszy) to utworzenie skryptu PHP.
Ja przedstawię wam sposób pierwszy i trzeci gdyż te dwa używane są najczęściej.
Sposób pierwszy polega na wykonaniu pliku z instrukcjami utworzenia bazy danych. Na pewno wielu z was spotkało się z gotowymi skryptami php wykorzystującymi bazę MySQL, mają one dołączone pliki o rozszerzeniu .sql . Ten plik kompilujemy. My utworzymy prostą bazę zawierającą dane osobowe. Otwieramy notatnik. I piszemy np. coś takiego:
create database daneosobowe;
connect daneosobowe;
CREATE TABLE dane (
id int(11) DEFAULT '0' NOT NULL auto_increment,
imie char(30),
nazwisko char (30),
dataur date DEFAULT '0000-00-00' NOT NULL,
adres blob,
telefon int(15),
UNIQUE id (id),
PRIMARY KEY (id)
);
INSERT INTO dane VALUES (1,'Jan','Kowalski','1981-12-28','ul.Długa 6 m 23 Toruń','7632325');
Plik zapisujemy np. w katalogu bin naszego SQL'a pod nazwą baza.sql.
Teraz należą się wam wyjaśnienia o co tu chodzi.
Najpierw musimy utworzyć nową bazę danych służy do tego polecenie create database . W tym poleceniu dodajemy oczywiście nazwę bazy jaka ma zostać utworzona polecenie kończymy średnikiem. Gdy bazę utworzyliśmy przydały by nam się jakieś tabelki. Najpierw łączymy się z utworzoną bazą w naszym przypadku connect daneosobowe; . Gdy połączyliśmy się z bazą tworzymy tabelkę poleceniem create table . Polecenie to musi zawierać nazwę tworzonej tabelki (u nas dane) oraz w nawiasie oddzielone przecinkami pola jakie tabelka będzie zawierać. Dostępnych jest kilka typów pól:
char(x) - ciąg znaków o maksymalnej długości x, gdzie x nie może być większy od 255,
blob - ciąg znaków o długości ograniczonej przez twoją pamięć,
int - liczba całkowita z zakresu od do ,
data - data w formacie DBMS (uwaga format odwrotny do normalnego: YYYY-MM-DD),
year - rok, jeśli zostanie podany zły, jego wartość zmieni się w 0000,
decimal(x, y) - liczba dziesiętna, gdzie x oznacza maksymalną liczbę cyfr, a y maksymalną liczbę cyfr po przecinku.
W naszym przykładzie pole id int(11) DEFAULT '0' NOT NULL auto_increment, zawiera dodatkowo określenie default'owej wartości (0), pole to nie może pozostać puste musi zawierać dane (NOT NULL), oraz jest automatycznie numerowane, czyli każdy nowy rekord otrzyma inny id większy od poprzedniego o 1. Dobrze jest dodawać do pól określenie NOT NULL zabezpieczy to nam bazę przed dodawaniem pustych lub niekompletnych rekordów. UNIQUE to określenie pola które jest unikatowe. U nas dla id dane nie mogą być identyczne, nie mogą powstać dwa rekordy o id=1. PRIMARY KEY to określenie klucza głównego.
Tak stworzyliśmy w naszej bazie daneosobowe tabelkę dane. Dodamy pierwszy rekord by baza nie była pusta. Służy do tego polecenie INSERT INTO czyli wstaw w . My wstawiamy INSERT INTO do tabelki dane wartości VALUES poszczególnych pól (1,'Jan','Kowalski','1981-12-28','ul.Długa 6 m 23 Toruń','7632325');
Tak powstał pierwszy rekord.
Przygotowaliśmy plik który zinterpretuje baza więc czas go skompilować.
Otwieramy wiersz poleceń (menu START/Uruchom...) i wpisujemy: c:\mysql\bin\mysql -h127.0.0.1 -uadmin -phaslo
Tłumacząc uruchamiamy mysql'a z parametrami -h (host) -u (user-użytkownik) -p (password-hasło). Uwaga podczas łączenia się z bazą poprzez wiersz poleceń serwer powinien działać jako jeden z procesów systemu. Po zalogowaniu przetwarzamy nasz plik wpisujemy komendę source baza.sql i wciskamy enter. Komenda source przetwarza plik źródłowy u nas pod nazwą baza.sql . Jeżeli plik zapisaliśmy w innym miejscu niż katalog bin mysql'a np. na pulpicie komenda wtedy wygląda np. tak source c:\windows\pulpit\baza.sql . By sprawdzić czy istnieje baza i jej pierwszy rekord wpisujemy kolejno:
connect daneosobowe (wciskamy enter)
select * from dane; (wciskamy enter)
Na ekranie powinniśmy uzyskać np. coś takiego:
Sposób trzeci założenia bazy jest łatwiejszy i zajmuje mniej czasu, a efekt jest ten sam. Stworzymy skrypt php który wykonamy na serwerze. Oto on:
<?php
mysql_connect("127.0.0.1","admin","haslo");
$zapytanie = "CREATE DATABASE daneosobowe";
$wynik = mysql_query($zapytanie);
if($wynik) echo "Baza została założona !<br>";
else {
echo "Baza nie została założona !<br>";
exit;
}
mysql_select_db(daneosobowe);
$zapytanie = "CREATE TABLE dane ( ".
"id int(11) DEFAULT '0' NOT NULL auto_increment, ".
"imie char(30), ".
"nazwisko char (30), ".
"dataur date DEFAULT '0000-00-00' NOT NULL, ".
"adres blob, ".
"telefon int(15), ".
"UNIQUE id (id), ".
"PRIMARY KEY (id) ".
")";
$wynik = mysql_query($zapytanie);
if($wynik) echo "Tabela założona prawidłowo !<br>";
else {
echo "Blad ! Tabela nie została założona !<br>";
exit;
}
$zapytanie = "INSERT INTO dane VALUES(1,'Jan','Kowalski','1981-12-28','ul.Długa 6 m 23 Toruń','7632325')";
$wynik = mysql_query($zapytanie);
if($wynik) echo "Pierwszy rekord dodany prawidłowo !<br>";
else {
echo "Błąd !!! Pierwszy rekord nie został dodany !<br>";
}
?>
Po uruchomieniu skryptu na serwerze powstanie nasza baza z tabelką dane i pierwszym rekordem. By każdy wiedział czy jego skrypt wykonał się prawidłowo dodałem warunki jeżeli w którymś momencie wystąpi błąd poinformuje nas o tym odpowiedni komunikat.
Zawartość skryptu jest podobna do pliku zawierającego komendy dla serwera SQL. Tu jednak plik interpretuje PHP więc musimy użyć jego funkcji mysql_query(zapytanie SQL). Analizując powyższy kod widać, że jest podobny on do pliku z metody pierwszej.
W PHP do połączenia się z serwerem MySQL służy komenda mysql_connect("127.0.0.1","admin","haslo"); jako jego wartości podajemy adres hosta, nasz login i hasło. Do zmiennych przypisujemy zapytania, a następnie poprzez funkcję mysql_query wykonujemy je. Po utworzeniu bazy musimy ją wybrać by dalej można było z nią pracować, służy do tego funkcja mysql_select_db(nazwa-bazy); . Dalej skrypt wykonuje te same polecenia które mieliśmy w sposobie pierwszym.
Tak przygotowaliśmy naszą bazę w następnym rozdziale dodamy do niej rekordy oraz wypiszemy je na stronie www.
Praca z bazą
Teraz będziemy pobierać i dodawać dane do bazy.
Pobieranie danych
Na początek napiszemy skrypt php który na ekranie wyświetli nam dane pobrane z bazy. Zawartość pól wstawimy w tabelkę np. taką:
Dane osobowe |
|||||
ID |
Imię |
Nazwisko |
Data urodzenia |
Adres |
Telefon |
|
|
|
|
|
|
Skrypt przykładowo wygląda tak:
<html>
<head>
<title>Kurs MySQL - Strona Mateusza Dutkiewicza</title>
</head>
<body>
<table border="1" width="98%" cellspacing="0" cellpadding="0" bordercolorlight="#000000">
<tr>
<td width="96%" colspan="6" bgcolor="#C0C0C0">
<p align="center"><b><font size="2">Dane osobowe</font></b></td>
</tr>
<tr>
<td width="6%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2"> ID</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2">Imię</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Nazwisko</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Data
urodzenia</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Adres</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Telefon</font></td>
</tr>
<?php
mysql_connect ("127.0.0.1","admin","haslo");
mysql_select_db (daneosobowe);
$zapytanie = "SELECT * FROM dane ";
$wykonaj = mysql_query ($zapytanie);
while($wiersz=mysql_fetch_array ($wykonaj)) {
echo " <tr>
<td width=\"6%\">".$wiersz['id']."</td>
<td width=\"18%\">".$wiersz['imie']."</td>
<td width=\"18%\">".$wiersz['nazwisko']."</td>
<td width=\"18%\">".$wiersz['dataur']."</td>
<td width=\"18%\">".$wiersz['adres']."</td>
<td width=\"18%\">".$wiersz['telefon']."</td>
</tr>";
}
?>
</table>
</body>
</html>
Początek skryptu to zwykły HTML tworzy tabelkę, php zaś dodaje jej komórki i wstawia dane z bazy.
Przeanalizujmy część w php.
Po połączeniu się z serwerem mysql_connect ("127.0.0.1","admin","haslo"); i wybraniu bazy mysql_select_db (daneosobowe); wykonujemy zapytanie w SQL które pobiera dane z bazy. Służy do tego polecenie SELECT. Tłumacząc to zapytanie na polski wyglądało by tak WYBIERZ * (gwiazdka oznacza wszystkie pola) Z TABELI dane. Posługując się poleceniem select możemy wybrać np. tylko to co zawierają pola imie, nazwisko i adres z naszej bazy. Wtedy zapytanie wyglądał by tak: SELECT imie,nazwisko,adres FROM dane . Dalsza część skryptu zamknięta jest w pętli while. Pobieramy dane z tabeli w bazie do momentu aż się nie skończą. Zapamiętujemy je w tablicy przyporządkowującej. Służy do tego funkcja mysql_fetch_array . Jako wartość tej funkcji podajemy wynik naszego zapytania sql pobierającego dane. Teraz wystarczy przy pomocy komendy php echo utworzyć komórki tabelki w które wstawiamy kolejne wartości zmiennych z tablicy. Skrypt jest uniwersalny działa prawidłowo dla dowolnej liczby rekordów. Nasze dane możemy jednak sortować. Wtedy do zapytania dodajemy polecenie order np. SELECT * FROM dane ORDER BY imie . By posortować dane od największej wartości lub ostatniej litery alfabetu dodajemy wartość DESC np. SELECT * FROM dane ORDER BY imie DESC .
Dodawanie rekordów
Nasza baza zawiera jak na razie jeden rekord. Stworzymy skrypt który doda dane do bazy otrzymane z formularza. Możemy stworzyć dwie strony jedną z formularzem plik .html i skrypt plik .php ja jednak stworzę wszystko w pliku php. Oto skrypt:
<html>
<head>
<title>Kurs MySQL - Strona Mateusza Dutkiewicza</title>
</head>
<body>
<?php
if($send=='Wyslij') {
mysql_connect ("127.0.0.1","admin","haslo");
mysql_select_db (daneosobowe);
$zapytanie = "INSERT INTO dane SET imie='$imie', nazwisko='$nazwisko', dataur='$dataur', adres='$adres',telefon='$telefon'";
$wykonaj = mysql_query ($zapytanie);
echo "<BR>Dane dodane prawidłowo ! Dziękujemy za wypełnieni formularza !";
}
else {
echo "<form method=\"get\" action=\"dodaj.php3\">
<div align=\"center\">
<center>
<table border=\"1\" width=\"50%\" bordercolorlight=\"#000000\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Imie</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"imie\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Nazwisko</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"nazwisko\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Data urodzenia YYYY-MM-DD</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"dataur\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Adres</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"adres\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Telefon</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"telefon\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"100%\" colspan=\"2\">
<p align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"submit\" value=\"Wyslij\" name=\"send\"><input type=\"reset\" value=\"Kasuj\" name=\"B2\"></font></td>
</tr>
</table>
</center>
</div>
</form>";
}
?>
</body>
</html>
Powyższy skrypt mam nadzieję jest dla osób znających php zrozumiały. Tu jednak po połączeniu się z bazą nie pobieramy danych komenda SELECT. Skrypt dodaje dane z formularza. Dane umieszczamy w bazie komenda INSERT. Z tą komendą spotkaliśmy się już podczas tworzenia bazy tam podawaliśmy zawartość wszystkich pól. W tym przypadku dodajemy dane które podał użytkownik. Wiadomo, że w formularzu nie zapytamy o id jakie powinno być nadane kolejnej osobie bo skąd ona miała by to wiedzieć. Tworząc bazę zadeklarowaliśmy autonumerację pola id. INSERT INTO dane SET imie='$imie', nazwisko='$nazwisko', dataur='$dataur', adres='$adres',telefon='$telefon' to zapytanie tworzy nowy rekord w pola wstawiając dane otrzymane z formularza. Polu id przypisuje id większy o 1 od poprzedniego rekordu.
Kasowanie danych
Wiemy już jak dodawać nowe rekordy, ale jak je kasować. Pokaże wam to na prostym skrypcie wypiszemy wszystkie rekordy z bazy i umieścimy w tabelce do której dodamy link kasujący rekord.
<html>
<head>
<title>Kurs MySQL - Strona Mateusza Dutkiewicza</title>
</head>
<body>
<table border="1" width="98%" cellspacing="0" cellpadding="0" bordercolorlight="#000000">
<tr>
<td width="96%" colspan="7" bgcolor="#C0C0C0">
<p align="center"><b><font size="2">Dane osobowe</font></b></td>
</tr>
<tr>
<td width="4%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2"> ID</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2">Imię</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Nazwisko</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Data
urodzenia</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Adres</font></td>
<td width="14%" align="center" bgcolor="#E0E0E0"><font size="2">Telefon</font></td>
<td width="6%" align="center" bgcolor="#E0E0E0"><font size="2">Kasuj</font></td>
</tr>
<?php
mysql_connect ("127.0.0.1","admin","haslo");
mysql_select_db (daneosobowe);
$zapytanie = "SELECT * FROM dane ORDER BY imie DESC";
$wykonaj = mysql_query ($zapytanie);
while($wiersz=mysql_fetch_array ($wykonaj)) {
echo " <tr>
<td width=\"4%\">".$wiersz['id']."</td>
<td width=\"18%\">".$wiersz['imie']."</td>
<td width=\"18%\">".$wiersz['nazwisko']."</td>
<td width=\"18%\">".$wiersz['dataur']."</td>
<td width=\"18%\">".$wiersz['adres']."</td>
<td width=\"14%\">".$wiersz['telefon']."</td>
<td width=\"6%\"><b><a href=\"kasuj.php3?stan=del&iddel=".$wiersz['id']."\">KASUJ</a></b></td>
</tr>";
}
if($stan=='del') {
$zapytanie2="DELETE FROM dane WHERE id=$iddel";
$wynik2 = mysql_query($zapytanie2);
echo "Rekord o id=$iddel został skasowany !";
}
else {
}
?>
</table>
</body>
</html>
Skrypt ten powstał na bazie naszego wcześniejszego skryptu wypisującego dane. Dodałem pole z opcją skasowanie rekordu. Jeżeli do skryptu przyjdą dwie zmienne jedna z id rekordu do skasowania ($iddel) i druga uaktywniająca kasowanie ($stan=='del') wtedy skrypt skasuje rekord. Rekordy kasujemy komendą DELETE podając tabelkę oraz wartość pola np. id. Jeżeli któryś z rekordów ma właśnie taką wartość kasuje je. U nas id zawsze jest różne więc kasujemy tylko jeden rekord. Jeżeli jednak chcieli byśmy skasować więcej rekordów np. rekordy które w polu nazwisko zawierają wartość Kowalski wykonalibyśmy taką komendę : DELETE FROM dane WHERE nazwisko=Kowalski , co w efekcie skasowało by rekordy wszystkich Kowalskich w naszej bazie.
Modyfikacja danych
No tak ale co zrobić gdy chcemy poprawić dane w bazie. Przykład. Nasz Kowalski zmienił numer telefonu lub miejsce zamieszkania. Nie musimy go kasować z bazy i dodawać ponownie, wtedy przecież zmienił by mu się jego id którym dotychczas się posługiwał. Trzeba rekord poprawić. Służy do tego komenda UPDATE. Poniżej przykładowy skrypt.
<html>
<head>
<title>Kurs MySQL - Strona Mateusza Dutkiewicza</title>
</head>
<body>
<table border="1" width="98%" cellspacing="0" cellpadding="0" bordercolorlight="#000000">
<tr>
<td width="96%" colspan="7" bgcolor="#C0C0C0">
<p align="center"><b><font size="2">Dane osobowe</font></b></td>
</tr>
<tr>
<td width="4%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2"> ID</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2">Imię</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Nazwisko</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Data
urodzenia</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Adres</font></td>
<td width="14%" align="center" bgcolor="#E0E0E0"><font size="2">Telefon</font></td>
<td width="6%" align="center" bgcolor="#E0E0E0"><font size="2">Modyfikuj</font></td>
</tr>
<?php
mysql_connect ("127.0.0.1","admin","haslo");
mysql_select_db (daneosobowe);
$zapytanie = "SELECT * FROM dane ORDER BY imie DESC";
$wykonaj = mysql_query ($zapytanie);
while($wiersz=mysql_fetch_array ($wykonaj)) {
echo " <tr>
<td width=\"4%\">".$wiersz['id']."</td>
<td width=\"18%\">".$wiersz['imie']."</td>
<td width=\"18%\">".$wiersz['nazwisko']."</td>
<td width=\"18%\">".$wiersz['dataur']."</td>
<td width=\"18%\">".$wiersz['adres']."</td>
<td width=\"14%\">".$wiersz['telefon']."</td>
<td width=\"6%\"><b><a href=\"modyfikuj.php3?stan=modyf&idmodyf=".$wiersz['id']."\">
Modyfikacja</a></b></td>
</tr>";
}
if($stan=='modyf') {
$zapytanie = "SELECT * FROM dane where id=$idmodyf";
$wykonaj = mysql_query ($zapytanie);
$tablica = mysql_fetch_array($wykonaj);
echo "<form method=\"get\" action=\"modyfikuj.php3\">
<div align=\"center\">
<center>
<table border=\"1\" width=\"50%\" bordercolorlight=\"#000000\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Imie</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"imie\" value=\"".$tablica['imie']."\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Nazwisko</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"nazwisko\" value=\"".$tablica['nazwisko']."\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Data urodzenia YYYY-MM-DD</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"dataur\" value=\"".$tablica['dataur']."\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Adres</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"adres\" value=\"".$tablica['adres']."\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"50%\"><font size=\"2\" face=\"Verdana\">Telefon</font></td>
<td width=\"50%\" align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"text\" name=\"telefon\" value=\"".$tablica['telefon']."\" size=\"20\"></font></td>
</tr>
<tr>
<td width=\"100%\" colspan=\"2\">
<p align=\"center\"><font size=\"2\" face=\"Verdana\"><input type=\"hidden\" name=\"modyfikuj\" value=\"$idmodyf\"><input type=\"submit\" value=\"Modyfikuj\" name=\"send\"></font></td>
</tr>
</table>
</center>
</div>
</form>";
}
elseif ($send=='Modyfikuj'){$zapytanie = "UPDATE dane SET imie='$imie', nazwisko='$nazwisko', dataur='$dataur', adres='$adres',telefon='$telefon' WHERE id=$modyfikuj";
$wykonaj = mysql_query ($zapytanie);
echo "<br>Dane poprawione<BR><a href=\"modyfikuj.php3\">Obejrzyj poprawiona bazę</a>";}
else {
}
?>
</table>
</body>
</html>
Sporo tego kodu, ale dla nas ważna w tym momencie jest jego końcówka w warunku elseif. Skrypt działa tak wyświetla rekordy z bazy. Umieszcza je w tabelce. Każdy rekord ma link do modyfikacji. Po kliknięciu na link wyświetla się formularz zawarty w warunki if. Do formularza wstawiane są dane pobrane z bazy. Po kliknieciu na przycisk modyfikuj modyfikujemy rekord. Część modyfikacyjna jest w warunku elseif. Do modyfikacji rekordu służy komenda UPDATE. Podajemy nowe wartości pól oraz rekord który ma zostać zmodyfikowany (WHERE id=$modyfikuj";).
Przeszukiwanie bazy
Praca z bazą jest łatwa kiedy mamy kilka rekordów, ale co zrobić jeżeli jest ich kilkadziesiąt. Jak odnaleźć telefon do Kowalskiego wśród tylu rekordów. Możemy zrobić wyszukiwarkę. Wpiszemy w nią np. Kowalski, a baza wyświetli tylko te rekordy które w polu nazwisko zawierają nasze zapytanie. Oto przykładowy skrypt:
<html>
<head>
<title>Kurs MySQL - Strona Mateusza Dutkiewicza</title>
</head>
<body>
<table border="1" width="98%" cellspacing="0" cellpadding="0" bordercolorlight="#000000">
<tr>
<td width="96%" colspan="6" bgcolor="#C0C0C0">
<p align="center"><b><font size="2">Dane osobowe</font></b></td>
</tr>
<tr>
<td width="4%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2"> ID</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0">
<p align="center"><font size="2">Imię</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Nazwisko</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Data
urodzenia</font></td>
<td width="18%" align="center" bgcolor="#E0E0E0"><font size="2">Adres</font></td>
<td width="14%" align="center" bgcolor="#E0E0E0"><font size="2">Telefon</font></td>
</tr>
<?php
mysql_connect ("127.0.0.1","admin","haslo");
mysql_select_db (daneosobowe);
if($stan=='szukaj') {
$zapytanie = "SELECT * FROM dane where nazwisko like \"%$znajdz%\" or imie like \"%$znajdz%\" or adres like \"%$znajdz%\"";
$wykonaj = mysql_query ($zapytanie);
while($wiersz=mysql_fetch_array ($wykonaj)) {
echo " <tr>
<td width=\"6%\">".$wiersz['id']."</td>
<td width=\"18%\">".$wiersz['imie']."</td>
<td width=\"18%\">".$wiersz['nazwisko']."</td>
<td width=\"18%\">".$wiersz['dataur']."</td>
<td width=\"18%\">".$wiersz['adres']."</td>
<td width=\"18%\">".$wiersz['telefon']."</td>
</tr>";
}
}
else {
echo "</table><center><br><form method=\"get\" action=\"szukaj.php3\"><input type=\"text\" name=\"znajdz\" size=\"20\"><br><input type=\"submit\" value=\"szukaj\" name=\"stan\"></form></center>";
}
?>
</body>
</html>
Skrypt wybiera z bazy tylko te rekordy które odpowiadają zapytaniu. SELECT * FROM dane where nazwisko like \"%$znajdz%\" or imie like \"%$znajdz%\" or adres like \"%$znajdz%\" Szukamy w polach nazwisko, imie oraz adres. Wynik zapytania wyświetlamy w tabelce.
Jednak czasami chcemy wyświetlić tylko kilka pierwszych rekordów odpowiadających zapytaniu.
Załóżmy, że szukamy pracowników z Warszawy mamy zlecenie dla 2 osób. W tabelce wyświetlimy pierwsze dwa rekordy które zapytaniu odpowiadają. Do zapytania dodajemy limit np. SELECT * FROM dane where nazwisko like \"%$znajdz%\" or imie like \"%$znajdz%\" or adres like \"%$znajdz%\" limit 0,2 . Pierwsza cyfra w limicie określa pierwszy rekord odpowiadający zapytaniu od którego wyświetlamy, a druga, liczbę rekordów które wstawiamy do tabelki. Jest to dobre gdy mamy dużo rekordów. Możemy wtedy ustalić, że na stronie wyświetlamy np. po 20. Limity dla pierwszych trzech stron wyglądały by np. tak : limit 0,20 , limit 20,20 , limit 40,20.
Podsumowanie
Podsumowując nasz kurs, MySQL jest dość łatwy. Jedyne co trzeba dobrze znać to PHP. W tych kilku rozdziałach przedstawiłem to co jest najważniejsze. Z taką wiedzą każdy będzie potrafił stworzyć księgę gości, katalog czy wyszukiwarkę. Na koniec przedstawię wam jeszcze spis i krótkie opisy wszystkich funkcji php potrzebnych do pracy z bazą MySQL
Funkcje MySQL
Opis funkcji pochodzi z podręcznika PHP autorstwa : Stig Sćther Bakken, Alexander Aulbach, Egon Schmid, Jim Winstead, Lars Torben Wilson, Rasmus Lerdorf, Zeev Surask pod redakcją Stig Sćther Bakken .
Funkcje te umożliwiają dostęp do serwerów baz danych MySQL
Więcej informacji o MySQL można znaleźć na http://www.mysql.com (polski mirror to http://sunsite.icm.edu.pl/mysql).
mysql_affected_rows
mysql_affected_rows — Zwraca ilość wierszy przetworzonych w poprzedniej operacji MySQL
Opis
int mysql_affected_rows(int [id_polaczenia] );
mysql_affected_rows zwraca ilość wierszy przetworzonych w ostatniej operacji INSERT, UPDATE lub DELETE na serwerze skojarzonym z podanym identyfikatorem połączenia. Jeżeli identyfikator połączenia nie został podany, domyślnie wykorzystywane jest ostatnie połączenie.
Jeżeli ostatnim zapytaniem było DELETE bez użycia WHERE, wszystkie rekordy zostały usunięte z tabeli, ale ta funkcja zwróci zero.
Ta komenda nie ma zastosowania do operacji SELECT, lecz tylko do operacji, które modyfikują rekordy. Aby uzyskać liczbę wierszy zwróconych przez SELECT, użyj funkcji mysql_num_rows.
mysql_change_user
mysql_change_user — Zmienia użytkownika zalogowanego w aktywnym połączeniu
Opis
int mysql_change_user(string user, string password, string [database] , int [id_polaczenia] );
mysql_change_user zmienia użytkownika zalogowanego w aktywnym połączeniu lub w połączeniu, którego identyfikator podano. Jeżeli podano nazwę bazy, zostanie ona ustawiona, w przeciwnym przypadku zostanie ustawiona bieżąca. Jeżeli nowa kombinacja użytkownik/hasło będzie nieprawidłowa, bieżący użytkownik pozostanie aktywny.
Notatka: Funkcję tę wprowadzono w PHP 3.0.13 i wymaga ona MySQL w wersji 3.23.3 lub późniejszej.
mysql_close
mysql_close — Zamyka połączenie z serwerem MySQL
Opis
int mysql_close(int [id_polaczenia] );
Zwraca: prawda jeżeli sukces, fałsz jeżeli błąd.
mysql_close zamyka połączenie z serwerem MySQL skojarzone z podanym identyfikatorem połączenia. Jeżli identyfikator połączenia nie został podany, domyślnie wykorzystywane jest ostatnie połączenie.
Notatka: Zwykle nie jest potrzebne używanie tej funkcji, jako że połączenia niepodtrzymywane są automatycznie zamykane po zakończeniu wykonywania skryptu.
mysql_close nie zamyka połączeń podtrzymywanych nawiązanych za pomocą funkcji mysql_pconnect.
Przykład 1. Użycie mysql_close
<?php
$link = mysql_connect ("kraemer", "marliesle", "secret") {
or die ("Could not connect");
}
print ("Connected successfully");
mysql_close ($link);
?>
Patrz także: mysql_connect i mysql_pconnect.
mysql_connect
mysql_connect — Otwiera połączenie z serwerem MySQL
Opis
int mysql_connect(string [hostname [:port] [:/sciezka/do/gniazda] ] , string [username] , string [password] );
Zwraca: Dodatni identyfikator połączenia jeżeli sukces lub komunikat błędu jeżeli niepowodzenie.
mysql_connect nawiązuje połączenie z serwerem MySQL. Wszystkie argumenty są opcjonalne i jeżeli ich nie ma brane są wartości domyślne ('localhost', nazwa użytkownika będącego właścicielem procesu serwera, puste hasło).
Argument hostname może również zawierać numer portu, np. "hostname:port" lub ścieżkę do gniaza np. ":/sciezka/do/gniazda" dla localhost'a.
Notatka: Obsługa ":port" została dodana w PHP 3.0B4.
Obsługa ":/sciezka/do/gniazda" została dodana w PHP 3.0.10.
Możesz pominąć wyświetlenie komunikatu błędu przy niepowodzeniu poprzedzając nazwę funkcji znakiem '@'.
Przy drugim wywołaniu mysql_connect z tymi samymi argumentami, nie będzie nawiązywane nowe połączenie, lecz zwrócony zostanie identyfikator już otwartego połączenia.
Połączenie z serwerem zostanie zamknięte zaraz po zakończeniu wykonywania skryptu, chyba że zostanie zamknięte wcześniej przez odpowiednie wywołanie mysql_close.
Przykład 1. Użycie mysql_connect
<?php
$link = mysql_connect ("kraemer", "marliesle", "secret") {
or die ("Could not connect");
}
print ("Connected successfully");
mysql_close ($link);
?>
Patrz także: mysql_pconnect i mysql_close.
mysql_create_db
mysql_create_db — Tworzy bazę MySQL
Opis
int mysql_create_db(string database name, int [id_polaczenia] );
mysql_create_db tworzy nową bazę na serwerze skojarzonym z podanym identyfikatorem połączenia.
Przykład 1. Użycie mysql_create_db
<?php
$link = mysql_pconnect ("kron", "jutta", "geheim") {
or die ("Could not connect");
}
if (mysql_create_db ("my_db")) {
print ("Database created successfully\n");
} else {
printf ("Error creating database: %s\n", mysql_error ());
}
?>
Dla zachowania zgodności w dół użyta może być również funkcja mysql_createdb
Patrz także: mysql_drop_db.
mysql_data_seek
mysql_data_seek — Przesuwa wewnętrzny wskaźnik wyniku
Opis
int mysql_data_seek(int result_identifier, int row_number);
Zwraca: prawda jeżeli sukces, fałsz jeżeli błąd.
mysql_data_seek przesuwa wewnętrzny wskaźnik wiersza wyniku operacji MySQL skojarzony z podanym identyfikatorem wyniku na podany numer wiersza. Następne wywołanie mysql_fetch_row zwróci ten wiersz.
Row_number zaczyna się od 0.
Przykład 1. Użycie mysql_data_seek
<?php
$link = mysql_pconnect ("kron", "jutta", "geheim") {
or die ("Could not connect");
}
mysql_select_db ("samp_db") {
or die ("Could not select database");
}
$query = "SELECT last_name, first_name FROM friends";
$result = mysql_query ($query) {
or die ("Query failed");
}
# fetch rows in reverse order
for ($i = mysql_num_rows ($result) - 1; $i >=0; $i--) {
if (!mysql_data_seek ($result, $i)) {
printf ("Cannot seek to row %d\n", $i);
continue;
}
if(!($row = mysql_fetch_object ($result)))
continue;
printf ("%s %s<BR>\n", $row->last_name, $row->first_name);
}
mysql_free_result ($result);
?>
mysql_db_query
mysql_db_query — Wysyła zapytanie MySQL do bazy MySQL
Opis
int mysql_db_query(string database, string query, int [id_polaczenia] );
Zwraca: Dodatni identyfikator wyniku MySQL prowadzący do wyniku zapytania, lub fałsz jeżeli wystąpił błąd.
mysql_db_query wybiera bazę i wykonuje na niej zapytanie. Jeżeli opcjonalny identyfikator połączenia nie został podany, funkcja będzie próbować znaleźć otwarte połączenie z serwerem MySQL. Jeżeli to się nie powiedzie, będzie próbować je stworzyć tak, jakby wywołane zostało mysql_connect bez argumentów.
Patrz także: mysql_connect.
Dla zachowania zgodności w dół użyta może być również funkcja mysql.
mysql_drop_db
mysql_drop_db — Usuwa bazę MySQL
Opis
int mysql_drop_db(string database_name, int [id_polaczenia] );
Zwraca: prawda jeżeli sukces, fałsz jeżeli niepowodzenie.
mysql_drop_db usuwa całą bazę z serwera skojarzonego z podanym identyfikatorem połączenia.
Patrz także: mysql_create_db. Dla zachowania zgodności w dół użyta może być również funkcja mysql_dropdb.
mysql_errno
mysql_errno — Zwraca numer komunikatu błędu z ostatniej operacji MySQL.
Opis
int mysql_errno(int [id_polaczenia] );
Błędy pochodzące z klienta bazy MySQL już nie powodują wyświetlania ostrzeżeń. Zamiast tego, użyj tych funkcji by otrzymać numer błędu.
<?php
mysql_connect("marliesle");
echo mysql_errno().": ".mysql_error()."<BR>";
mysql_select_db("nonexistentdb");
echo mysql_errno().": ".mysql_error()."<BR>";
$conn = mysql_query("SELECT * FROM nonexistenttable");
echo mysql_errno().": ".mysql_error()."<BR>";
?>
Patrz także: mysql_error
mysql_error
mysql_error — Zwraca tekst komunikatu błędu z ostatniej operacji MySQL
Opis
string mysql_error(int [id_polaczenia] );
Błędy pochodzące z klienta bazy MySQL już nie powodują wyświetlania ostrzeżeń. Zamiast tego, użyj tych funkcji by otrzymać tekst błędu.
<?php
mysql_connect("marliesle");
echo mysql_errno().": ".mysql_error()."<BR>";
mysql_select_db("nonexistentdb");
echo mysql_errno().": ".mysql_error()."<BR>";
$conn = mysql_query("SELECT * FROM nonexistenttable");
echo mysql_errno().": ".mysql_error()."<BR>";
?>
Patrz także: mysql_errno
mysql_fetch_array
mysql_fetch_array — Zapisuje wiersz wyniku w tablicy przyporządkowującej
Opis
array mysql_fetch_array(int result, int [result_type] );
Zwraca tablicę zawierającą pobrany wiersz, lub fałsz jeżeli nie ma więcej wierszy.
mysql_fetch_array jest rozszerzoną wersją mysql_fetch_row. Oprócz zapisywania danych w indeksach numerycznych, zapisuje je też w indeksach przyporządkowujących (asocjacyjnych), używając nazw pól jako kluczy.
Jeżeli dwie lub więcej kolumn wyniku ma te same nazwy, ostatnia kolumna będzie brana pod uwagę. Dostęp do innych kolumn o tej samej nazwie jest możliwy jedynie przez indeksowanie numeryczne lub przez stworzenie aliasa.
select t1.f1 as foo t2.f1 as bar from t1, t2
Godne uwagi jest to, że użycie mysql_fetch_array NIE jest znacząco wolniejsze od użycia mysql_fetch_row, a dostarcza potrzebnej wartości.
Opcjonalny drugi argument result_type w funkcji mysql_fetch_array jest stałą i może przyjmować następujące wartości: MYSQL_ASSOC, MYSQL_NUM i MYSQL_BOTH. (funkcja ta została dodana w PHP 3.0.7)
Po dalsze szczegóły patrz także mysql_fetch_row.
Przykład 1. mysql fetch array
<?php
mysql_connect($host,$user,$password);
$result = mysql_db_query("database","select * from table");
while($row = mysql_fetch_array($result)) {
echo $row["user_id"];
echo $row["fullname"];
}
mysql_free_result($result);
?>
mysql_fetch_field
mysql_fetch_field — Pobiera z wyniku informacje o kolumnie i zwraca jako obiekt
Opis
object mysql_fetch_field(int result, int [field_offset] );
Zwraca: obiekt zawierający informacje o polu
mysql_fetch_field używa się do uzyskania informacji o polach w danym wyniku zapytania. Jeżeli ofset pola nie został podany, zwracane zostanie następne pole nie pobrane jeszcze przez mysql_fetch_field.
Właściwości obiektu:
name - nazwa kolumny
table - nazwa tabeli do której należy kolumna
max_length - maksymalna długość kolumny
not_null - 1 jeżeli pole nie może być puste (null)
primary_key - 1 jeżeli kolumna jest kluczem podstawowym
unique_key - 1 jeżeli kolumna jest kluczem unikatowym
multiple_key - 1 jeżeli kolumna jest kluczem nieunikatowym
numeric - 1 jeżeli kolumna jest liczbowa
blob - 1 jeżeli kolumna jest typu BLOOB
type - typ kolumny
unsigned - 1 jeżeli kolumna jest bez znaku (plus lub minus)
zerofill - 1 jeżeli kolumna jest wypełniona zerami
Patrz także: mysql_field_seek