webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Obsługa bazy MySQL za pomocą modułu mysqli

autor: Mateusz Pilszek, ostatnia modyfikacja: 2007-02-23

szukaj: mysqli mysqli  mysqli_connect_error mysqli_connect_error  mysqli_connect_errno mysqli_connect_errno mysql mysql baza danych baza danych

Moduł mysqli powstał, aby umożliwić używanie bazy danych MySQL za pomocą obiektowej składni PHP. Współpracuje on z bazą danych MySQL w wersji 4.1.3 lub wyższej. Rozszerzenie zostało wprowadzone w PHP 5, dlatego osoby, które używają PHP 4 będą musiały łączyć się za pomocą starszego modułu mysql. Aby móc swobodnie posługiwać się modułem mysqli, musisz znać podstawy składni obiektowej PHP.

Aby moduł działał, niezbędna jest modyfikacja pliku php.ini (Windows) lub skompilowanie PHP z dodatkową opcją (Linux). W systemie Windows moduł aktywuje się poprzez odkomentowanie odpowiedniej linijki w pliku php.ini:

;extension=php_mysqli.dll

Należy usunąć średnik na początku powyższej linii i zrestartować serwer WWW. Jeśli na początku nie było średnika, oznacza to, że najprawdopodobniej moduł mysqli już działa.

W systemach Linux przed kompilacją PHP musimy przekazać dodatkową opcję do skryptu ./configure:

--with-mysqli=katalog_programu_mysql/bin/mysql_config

Plik mysql_config znajduje się zazwyczaj w katalogu bin programu MySQL.

Nawiązywanie połączenia z bazą danych

Nawiązanie połączenia z bazą danych odbywa się poprzez utworzenie instancji klasy mysqli. Do konstruktora należy przekazać cztery wartości: nazwę hosta, nazwę użytkownika, hasło użytkownika i nazwę bazy danych, której będziemy używali:

$polaczenie = @new mysqli('host', 'uzytkownik', 'haslo', 'nazwa bazy');

Użyliśmy operatora @, aby w przypadku problemu z połączeniem pozbyć się ostrzeżenia wygenerowanego przez PHP. Zamiast tego możemy sami napisać funkcję obsługi błędów. Pomocne będą dwie funkcje: mysqli_connect_errno i mysqli_connect_error.

Funkcja mysqli_connect_errno zwraca numer błędu. W przypadku, gdy nie wystąpiły błędy, zwraca wartość 0. Funkcja mysqli_connect_error zwraca komunikat błędu. Przyda nam się ona do wygenerowania komunikatu o błędzie:

$polaczenie = @new mysqli('host', 'uzytkownik', 'haslo', 'nazwa bazy');
if (mysqli_connect_errno() != 0){
	echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error() . '</p>';
}
else {
	// tutaj kod wykonywany, gdy zostało uzyskane połączenie z bazą
}

Kod sprawdził, czy połączenie z bazą danych powiodło się. Jeśli wystąpił błąd, wyświetlony zostaje komunikat. W przeciwnym wypadku wykonywane zostają instrukcje zawarte w klauzuli else.

Wykonywanie zapytań

Gdy udało nam się połączyć, możemy wykonać zapytanie do bazy danych. Wykorzystujemy do tego metodę query. Jako jej argument przekazujemy treść zapytania. Nie powinniśmy na jego końcu umieszczać średnika - funkcja zrobi to za nas:

$wynik = @$polaczenie -> query('SELECT * FROM tabela');

W przypadku niepowodzenia metoda zwróci wartość false. Gdy korzystaliśmy z zapytań, które nie zwracają żadnych wartości (INSERT, UPDATE), funkcja zwróci wartość true oznaczającą, że operacja zakończyła się sukcesem. Jeśli korzystamy z operacji typu SELECT lub SHOW na pewno oczekujemy konkretnych wyników. W tym przypadku zostanie zwrócony obiekt mysqli_result, na którym będziemy wykonywali operacje.

Ponownie użyliśmy operatora @, ponieważ chcemy sami wygenerować komunikat o błędzie. Sprawdźmy więc, czy wynik został zwrócony poprawnie:

$wynik = @$polaczenie -> query('SELECT * FROM tabela');
if ($wynik === false){
	echo '<p>Zapytanie nie zostało wykonane poprawnie!</p>';
	$polaczenie -> close();
}
else {
	// tu kod w przypadku, gdy zapytanie zostało wykonane poprawnie
}

Metodą close zakończyliśmy połączenie z bazą danych (zawsze powinniśmy to uczynić przed zakończeniem wykonywania skryptu).

W przypadku, gdy zwrócone zostały poprawne wyniki, możemy rozpocząć przetwarzanie uzyskanych danych.

Przetwarzanie danych

Dla przypomnienia: metoda query może zwrócić wartość true dla operacji, w których niezbędne jest tylko potwierdzenie ich powodzenia (np. GRANT, INSERT). Rozważmy przykład dodania nowego produktu do bazy danych:

$wynik = @$polaczenie -> query("INSERT INTO Produkty(nazwa, cena, ilosc) VALUES ('Kalendarz ścienny', 29, 10)");
if ($wynik === false){
	echo '<p>Zapytanie nie zostało wykonane poprawnie!</p>';
	$polaczenie -> close();
}
else {
	echo '<p>Produkt został pomyślnie dodany do bazy danych!</p>';
	$polaczenie -> close(); // pamiętajmy o rozłączeniu na koniec!
}

Czasami jednak instrukcje typu SELECT zwracają pewne wartości. Do przetwarzania ich służy m.in. metoda fetch_assoc. Zwraca ona wartości kolejnych wierszy wyniku w postaci tablicy, której klucze to nazwy kolumn tabeli. W przypadku, gdy nie ma już więcej wierszy w wyniku, funkcja zwraca wartość null.

Metodę fetch_assoc najlepiej wykorzystywać w pętli while. Spróbujmy wypisać z przykładowej bazy danych listę produktów, których brak w magazynie (ilosc = 0):

$polaczenie = @new mysqli('host', 'uzytkownik', 'haslo', 'nazwa bazy');
if (mysqli_connect_errno() != 0){
	echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error() . '</p>';
}
else {
	$wynik = @$polaczenie -> query("SELECT nazwa, cena FROM Produkty WHERE ilosc = 0");
	if ($wynik === false){
		echo '<p>Zapytanie nie zostało wykonane poprawnie!</p>';
		$polaczenie -> close();
	}
	else {
		echo '<p>Produkty, których brak w magazynie:</p>';
		while (($produkt = $wynik -> fetch_assoc()) !== null){
			echo '<p>Nazwa: ' . $produkt['nazwa'] . '</p>';
			echo '<p>Cena: ' . $produkt['cena'] . '</p>';
			echo '<hr />';
		}
		$wynik -> close(); // zwolnienie pamięci
		$polaczenie -> close();
	}
}

Na koniec zwalniamy pamięć, w której są przechowywane wyniki (metoda close dla zmiennej $wynik). Pamięć zwalniamy tylko w przypadku zapytań SQL, których wynikiem jest obiekt mysqli_result (np. SELECT, SHOW, DESCRIBE). Następnie zamykamy połączenie z bazą danych.

Mateusz Pilszek

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org