Webcity.pl


  Pliki XML generowane...

  Upload obrazka do ba...

  PHP w praktyce

  Instalacja forum php...

  Manual - jak wykonać...

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

Obsługa MySQL'a w PHP

Autor: Zyx
   Z nieznanych mi przyczyn do czasu publikacji tego artykułu na Webcity nie było ani jednego tekstu opisującego komunikowanie się z MySQL'em poprzez PHP. Owocowało to czasem dosyć kuriozalnymi (dla mnie) pytaniami na forum. Postanowiłem więc wyciągnąć rękę do ludzi i napisać ten oto tekst...
   MySQL jest darmowym i bardzo dobrym serwerem baz danych, z którym można komunikować się za pomocą języka SQL (Structured Query Language). Jego kurs znajdziesz w serwisie. Należy zwrócić uwagę, iż wersja tegoż języka dla MySQL'a nie ma jeszcze zaimplementowanych wielu zaawansowanych elementów takich jak funkcje, triggery, widoki, kursory, podzapytania (dopiero od MySQL 4.1), a więc jeśli będziesz potrzebować skomplikowanych rozwiązań, by zarządzać informacjami, przyjrzyj się konkurencji: PostgreSQL, Oracle itd.
   Aby umożliwić twórcom innych programów komunikację z serwerem MySQL'a, jego autorzy stworzyli specjalną bibliotekę zwaną libmysql, która zawiera cały zestaw niezbędnych funkcji wykonujących tak zwaną czarną robotę za programistę. Moduł PHP php_mysql korzysta właśnie z tej biblioteki (do niedawna zawierał też własną implementację, którą jednak musiał usunąć z powodu zmiany licencji MySQL'a), co gwarantuje nam, iż korzystanie z niego będzie do złudzenia przypominało używanie libmysql w normalnych programach.
   Po krótkim wprowadzeniu i omówieniu bazy danych, przejdźmy do rzeczy następnej, czyli instalacji modułu. Jest ona banalnie prosta - w systemie Windows cała rzecz sprowadza się do edycji pliku php.ini i usunięcia średnika z linii:

;extension=php_mysql.dll

Pod Linuxem sprawa jest troszkę trudniejsza, bowiem należy od nowa skompilować PHP z dyrektywą:

--with-mysql=sciezka_do_libmysql

UWAGA: W starszych wersjach PHP (< 4.3.2) nie musisz robić NIC, byś mógł korzystać z MySQL'a.

   Łączenie się z bazą danych
Jak zapewne wiesz z rozmaitych kursów MySQL'a, aby połączyć się z bazą danych, należy posiadać: adres serwera, oraz dane użytkownika, poprzez którego chcemy zalogować się do serwera (nazwa i hasło). Domyślnie przy pracy w domu wystarczą parametry: localhost, root, [puste], natomiast w przypadku serwerów on-line admin powinien podać odpowiednie parametry z momentem utworzenia konta WWW. Do łączenia się i rozłączania służą funkcje

mysql_connect('localhost', 'root', '');

oraz

mysql_close();

Wypadałoby teraz wspomnieć o pewnej właściwości tychże funkcji, co odbije się w liczbie parametrów podawanych do pozostałych funkcji modułu. Przyjrzyj się takiemu kodowi:

<?php

   mysql_connect('localhost', 'root', '');

   ...

   mysql_close();

?>

Utworzyliśmy tutaj jedno połączenie z bazą i domyślnie wszystkie pozostałe funkcje będą pracowały właśnie na nim. Ale jest sytuacja, gdy będą nam potrzebne dwa połączenia - i co wtedy? Wtedy korzystamy z tego, iż mysql_connect() może zwrócić ich identyfikatory jako zmienne:

<?php

   $polaczenie1 = mysql_connect('localhost', 'root', '');
   $polaczenie2 = mysql_connect('localhost', 'kalasanty', '314159265358979');

   ...

   mysql_close($polaczenie1);
   mysql_close($polaczenie2);

?>

Samo połączenie się z serwerem nie oznacza, iż od razu możemy wysyłać do niego zapytania - w końcu nie wybraliśmy jeszcze bazy, na jakiej będziemy operować. Tu przychodzi nam z pomocą funkcja mysql_select_db(), której używa się w następujący sposób:

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('moja_kurde_baza');

   ...

   mysql_close();
?>

Jeśli posiadamy większą ilość połączeń, jako pierwszy parametr możemy podać zmienną identyfikującą dane połączenie: mysql_select_db('mojakurdebaza', $polaczenie1); - taka zasada obowiązuje w prawie wszystkich funkcjach. Jeśli podajemy identyfikator połączenia, zawsze znajdzie się on jako parametr ostatni.

   Wysyłanie zapytań do bazy i raportowanie błędów
Skoro umiemy się z bazą połączyć, przydałaby się nam umiejętność wysyłania do niej poleceń. Użyjemy w tym celu funkcji mysql_query():

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   $result = mysql_query('SELECT * FROM klienci');

   mysql_close();
?>

Funkcja ta wysyła do bazy pojedyncze zapytanie, zwracając jego wynik. Na ten element powinieneś zwracać największą uwagę, ponieważ:
   - Dla zapytań SELECT, EXPLAIN, DESCRIBE, SHOW zwracany jest identyfikator zbioru wyników umożliwiający pobranie danych poprzez odpowiednie funkcje.
   - Dla pozostałych zapytań zwraca TRUE lub FALSE w zależności od tego, czy zadziałały, czy nie.
   - Jeśli zrobimy błąd składni w zapytaniu, funkcja zwróci FALSE (nawet w przypadku zapytań SELECT).

Dlatego też najlepiej używać tej funkcji w takim połączeniu:

$result = mysql_query('twoje zapytanie') or die('Błąd w zapytaniu takim a takim. Komunikat: '.mysql_error().'; Numer błędu: '.mysql_errno());

Kod ten spowoduje, że w przypadku zwrócenia wartości FALSE wyświetli się komunikat błędu - raczej małe jest prawdopodobieństwo wyrzucenia FALSE bez żadnej przyczyny. Pozwoli to od razu podjąć odpowiednie czynności zaradcze, od razu wskazując nam miejsce błędu jako wadliwe zapytanie.

   Pobieranie wyników
Bez możliwości pobrania danych z bazy, samo ich istnienie nie miałoby sensu. Dlatego PHP ma zaimplementowanych kilka funkcji służących do tego celu. Najważniejszą rzeczą, którą musisz o nich wiedzieć, jest to, że pojedyncze wywołanie takiej funkcji pobiera tylko jeden rekord, zatem proces pobierania musi odbywać się w pętli. Wygląda to mniej więcej tak:

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   $result = mysql_query('SELECT * FROM klienci');

   while($row = mysql_fetch_row($result)){
      print_r($row);
      echo '<br>';
   }

   mysql_close();
?>

mysql_fetch_row() zwraca tablicę, w której każdy element reprezentuje jedno pole w bazie. Indeksy każdego z pól są wartością numeryczną, zatem pierwsze pole wyniku otrzyma numer 0, drugie 1, trzecie 2 itd. Możesz to zresztą zobaczyć po wykonaniu przykładowego kodu (i posiadaniu odpowiedniej tabeli z danymi).

Oprócz mysql_fetch_row() istnieją też inne funkcje różniące się właśnie sposobem indeksowania elementów tablicy. I tak: mysql_fetch_array() - występują zarówno indeksy numeryczne, jak i tekstowe, zatem do pola można odwołać się albo przez $row[1], albo $row['nazwapola']. mysql_fetch_assoc() zwraca tablicę wyłącznie z indeksami tekstowymi ($row['nazwapola']). Istnieje jeszcze mysql_fetch_object(), która (jak sama nazwa wskazuje), zwraca obiekt: $row -> nazwapola.

Tutaj chciałbym nadmienić pewną rzecz... funkcje omówione w tej, oraz w następnej sekcji nie wymagają identyfikatora połączenia z bazą danych! Zatem konstrukcja w stylu mysql_fetch_array($zbior_wynikow, $polaczenie_z_baza) nie może mieć w żadnym wypadku miejsca. Pamiętaj o tym.
   O wynikach jeszcze słów kilka
Istnieją jeszcze dwie operacje na wynikach, które warto omówić. Na początek - sprawdzamy, ile rekordów zwróciło zapytanie:

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   $result = mysql_query('SELECT * FROM klienci');

   echo 'Zapytanie zwróciło '.mysql_num_rows($result).' wyników';

   mysql_close();
?>

Czyli jedna funkcja z przekazanym identyfikatorem wyniku załatwia nasz problem.

   Teraz sprawa bardziej techniczna - wiadomo, że każdemu wynikowi musi być przydzielona jakaś pamięć. PHP zwalnia pamięć wszystkich naszych wyników przy zrywaniu połączenia z bazą. Lecz jeśli piszemy skrypt, który bardzo obciąża bazę i w dodatku wykonuje się bardzo długo, powinniśmy pomyśleć, by pamięć tę zwolnić samodzielnie po pobraniu interesujących nas danych. Tu z pomocą wkracza mysql_free_result():

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   $result = mysql_query('SELECT * FROM klienci, oponenci, absolwenci, walnieci');

   // tutaj bardzo zlozona operacja przetwarzania wynikow

   mysql_free_result($result);

   // tutaj jeszcze 10 takich operacji

   mysql_close();
?>

W większości zastosowań naprawdę nie trzeba jej używać, ale warto o niej wiedzieć, bo "a nuż się przyda"?

   Dodawanie, usuwanie, poprawianie
Czasem zachodzi potrzeba pobrania ID rekordu, który chwilę wcześniej wstawiliśmy zapytaniem INSERT. To także możemy wykonać, używając odpowiedniej funkcji, a mianowicie mysql_insert_id():

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   mysql_query('INSERT INTO produkty (nazwa, cena) VALUES('Drzwi do wanny', '9.60')');

   echo 'Produkt ten otrzymał ID '.mysql_insert_id().'<br/>';

   mysql_close();
?>

To jednak nie wszystko. Załóżmy, że na gwałt potrzebujesz danych o tym, ile rekordów zostało usuniętych/zmienionych przez zapytanie DELETE, bądź UPDATE. To tez możesz załatwić jedną funkcją - mysql_affected_rows():

<?php

   mysql_connect('localhost', 'root', '');
   mysql_select_db('mojakurdebaza');

   mysql_query('DELETE FROM produkty WHERE cena > 30.99');

   echo 'Skasowano '.mysql_affected_rows().' produktów.<br/>';

   mysql_close();
?>

Pragnę tylko zwrócić uwagę, że zarówno mysql_insert_id(), jak i mysql_affected_rows() mogą żądać identyfikatora połączenia z bazą.

   Zakończenie
Mam nadzieję, że artykuł ten przyzwoicie wyjaśnił Ci, jak komunikować się z bazą MySQL poprzez PHP. Pamiętaj jednak: nie poprzestawaj na tym. MySQL, oraz biblioteki do komunikacji z nim są tak potężnymi narzędziami, że nawet ja po dwóch latach korzystania z nich wciąż odkrywam ich nowe możliwości :). A to jest klucz do sukcesu i do tego, by twoje skrypty stały się profesjonalne.

Powrót