MySQLi – ulepszone (ang. improved) rozszerzenie silnika MySQL. Moduł ten został wprowadzony w PHP5 i pozwala na używanie bazy za pomocą obiektowej składni. Poza tym obsługuje mechanizm transakcji, poprawia bezpieczeństwo i wydajność dzięki „prepare statements” (tj. instrukcji przygotowanych). Od wersji 4.1.3 zaleca się stosowanie rozszerzenia MySQLi.
PODEJŚCIE PROCEDURALNE
Jest analogiczne do standardowego MySQL’a. Do większości znanych instrukcji dodajemy tylko „i” (np.: mysqli_connect, mysqli_query, mysqli_num_rows).
Przykład poniżej demonstruje połączenie z bazą danych za pomocą instrukcji mysqli_connect:
1 2 3 4 5 6 7 8 9 10 11 12 |
$host = "localhost"; $user = "nazwa użytkownika"; $password = "hasło"; $dbname = "nazwa bazy"; $link = mysqli_connect($host, $user, $password, $dbname); if (mysqli_connect_errno()) // zwraca kod błędu ostatniego połączenia { printf("Wystąpił błąd: ", mysqli_connect_error()); exit; } |
Jeśli połączenie z bazą zostało nawiązane możemy zacząć operować na jej tabelach. Stwórz tabelę o nazwie kontakty, w której będą zbierane informacje o wirtualnych osobach, znajomych itp. Możesz to zrobić np. za pomocą aplikacji PHPMyadmin.
Korzystając z instrukcji mysqli_query dodajemy testowy rekord do bazy:
1 |
mysqli_query($link,"INSERT INTO kontakty (imie,nazwisko,wiek) VALUES ('Jan','Kowalski','35')"); |
Pierwszy parametr instrukcji – $link – to identyfikator połączenia; drugi – to instrukcja SQL dodająca (INSERT) rekord do tabeli.
Zawartość tabeli wylistujemy za pomocą kilku linijek kodu 😉 :
1 2 3 4 5 6 7 8 9 10 11 12 |
$sql = mysqli_query($link,"SELECT * FROM kontakty"); // kwerenda do bazy $liczba_rekordow = mysqli_num_rows($sql); // pobieramy liczbę rekordów za pomocą funkcji mysqli_num_rows echo '<p>Liczba rekordów tabeli: '.$liczba_rekordow.'</p>'; if ($liczba_rekordow > 0) { // jeżeli tabela nie jest pusta // pobieramy każdy wiersz z tablicy wyników zapytania (mysqli_fetch_array) while ($wynik = @mysqli_fetch_array($sql)) { echo $wynik["imie"]." ".$wynik["nazwisko"]."<br />"; // i wyświetlamy wyniki } } |
PODEJŚCIE OBIEKTOWE
Te same przykłady zrealizujemy za pomocą techniki obiektowej.
1 2 3 4 5 6 7 8 9 10 11 |
$db = new mysqli("localhost", "nazwa użytkownika", "hasło","nazwa bazy"); // Tworzymy nowy obiekt mysqli (new mysqli) i podajemy parametry połączenia. // Nazwę bazy można pominąć w instrukcji: new mysqli("localhost","nazwa użytkownika","hasło") // i wybrać ją osobno, stosując metodę select_db $db->select_db("nazwa bazy"); if (mysqli_connect_errno()) { printf("Wystąpił błąd: ", mysqli_connect_error()); exit; } |
Analogicznie jak w podejściu proceduralnym dodajemy rekord do tabeli:
1 2 |
$query = $db->query("INSERT INTO kontakty (imie,nazwisko,wiek) VALUES ('Jan','Kowalski','35')"); // przed zapytaniem query podajemy uchwyt połączenia $db |
Wyświetlamy wiersze z tabeli:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$sql = $db->query("SELECT * FROM kontakty"); $liczba_rekordow = $sql->num_rows; // odpowiednik mysqli_num_rows echo '<p>Liczba rekordów tabeli: '.$liczba_rekordow.'</p>'; if ($liczba_rekordow > 0) { for ($i=0;$i<=$liczba_rekordow;$i++) { $wynik = $sql->fetch_assoc(); // fetch_assoc - zwraca tablicę asocjacyjną pobranych wierszy // lub FALSE jeżeli nie ma więcej wyników echo $wynik["imie"]." ".$wynik["nazwisko"]."<br />"; } } $sql->free(); // zwalniamy pamięć $db->close(); // zamykamy połączenie z bazą |
INSTRUKCJE PRZYGOTOWANE
Instrukcje przygotowane – to szablon zapytania wysyłany do serwera MySQL. Przed wykonaniem zapytania do bazy możemy dynamicznie wstawiać zmienne. Dane są wysyłane oddzielnie. Jest to idealne rozwiązanie przy masowym wprowadzaniu rekordów do bazy.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$dbstmt = new mysqli("localhost", "nazwa użytkownika", "hasło"); $dbstmt->select_db("nazwa bazy"); if (mysqli_connect_errno()) { printf("Wystąpił błąd: ", mysqli_connect_error()); exit; } $stmt = $dbstmt->prepare("INSERT INTO kontakty (imie,nazwisko,wiek) VALUES (?,?,?)") or die($dbstmt->error); // Za pomocą metody prepare tworzymy obiekt instrukcji lub zasobu // i przygotowujemy zapytanie do dalszego przetwarzania... // W miejsca zmiennych wstawiamy znaki zapytania "?" $imie = "Jan"; $nazwisko = "Kowalski"; $wiek = 35; $stmt->bind_param('ssi',$imie,$nazwisko,$wiek); // Metoda bind_param zastępuje znaki zapytania wartościami podanymi w zmiennych $imie, $nazwisko, $wiek // Ciąg formatujący ssi - oznacza, że dwie pierwsze wartości są typu tekstowego (s - string) a trzeci to liczba (i - integer) // - dla liczby rzeczywistej podajemy literkę: d (double), itd. $stmt->execute(); // metoda wykonuje zapytanie echo $stmt->affected_rows; // wyświetlamy liczbę wyników zapytania $stmt->close(); // usuwamy instrukcję z pamięci $dbstmt->close(); // zamykamy połączenie z bazą |
Oczywiście instrukcje przygotowane mają również swoje odpowiedniki w rozwiązaniu proceduralnym: mysqli_stmt_prepare(), mysqli_stmt_bind_param(), mysqli_stmt_execute().
Więcej o tajnikach MySQLi przeczytasz w manualu: www.php.net/manual/pl/book.mysqli.php