Jakie wartości muszą przyjmować zmienne w funkcji biblioteki mysqli, aby połączyć się z serwerem i bazą danych?
mysqli_connect($a, $b, $c, $d) or die('Brak połączenia z serwerem MySQL.');
A. adres serwera - $c, nazwa bazy danych - $d, login - $b, hasło - $a
B. adres serwera - $a, nazwa bazy danych - $b, login - $c, hasło - $d
C. adres serwera - $c, nazwa bazy danych - $d, login - $a, hasło - $b
D. adres serwera - $a, nazwa bazy danych - $d, login - $b, hasło - $c
Pytanie z egzaminu CKE, czerwiec 2019 (arkusz E.14-X-19.06).
Funkcja mysqli_connect w bibliotece mysqli ma ustaloną kolejność argumentów: adres serwera, login użytkownika, hasło użytkownika oraz nazwa bazy danych. Dlatego w podanym zapisie mysqli_connect($a, $b, $c, $d) zmienna $a oznacza adres serwera MySQL, $b to login, $c to hasło, a $d to nazwa bazy danych. Czyli pasuje odpowiedź: adres serwera - $a, nazwa bazy danych - $d, login - $b, hasło - $c. Praktycznie może to wyglądać tak: mysqli_connect('localhost', 'app_user', 'tajne_haslo', 'sklep'). Moim zdaniem warto zapamiętać nie samą literkę zmiennej, tylko właśnie kolejność parametrów funkcji. W projektach webowych dane połączenia zwykle trzyma się w osobnym pliku konfiguracyjnym albo w zmiennych środowiskowych, żeby nie mieszać ich z logiką aplikacji. Dobrą praktyką jest też używanie osobnego użytkownika bazy z minimalnymi uprawnieniami, ustawienie kodowania utf8mb4 po połączeniu oraz obsługa błędów w sposób bezpieczny. Samo die z komunikatem jest spotykane w prostych ćwiczeniach, ale w prawdziwej aplikacji lepiej nie pokazywać użytkownikowi szczegółów błędu połączenia.
W tym pytaniu łatwo pomylić się przez naturalne skojarzenie, że skoro mówimy o połączeniu z serwerem i bazą danych, to nazwa bazy powinna być zaraz po adresie serwera. W funkcji mysqli_connect tak jednak nie jest. Sygnatura tej funkcji zaczyna się od hosta, potem podaje się nazwę użytkownika MySQL, następnie hasło tego użytkownika, a dopiero później nazwę bazy danych. To nie jest kwestia dowolnej kolejności ani nazewnictwa zmiennych, tylko konkretnego interfejsu funkcji z biblioteki mysqli. Jeśli w miejsce loginu trafi nazwa bazy, a w miejsce hasła login albo odwrotnie, serwer MySQL potraktuje te wartości dosłownie. Efektem może być błąd typu access denied, nieudane uwierzytelnienie albo próba użycia nieistniejącego hosta, zależnie od tego, które pola zostały zamienione. Typowy błąd myślowy polega też na traktowaniu loginu i hasła jako danych przypisanych do bazy, a nie do konta użytkownika na serwerze MySQL. Baza danych jest wybierana po autoryzacji, natomiast login i hasło służą do sprawdzenia, czy aplikacja ma prawo wejść na serwer. Z mojego doświadczenia, przy nauce PHP najlepiej zapisać sobie prosty wzorzec: mysqli_connect(host, user, password, database). Dopiero potem podstawiać pod niego konkretne zmienne, bo same nazwy $a, $b, $c, $d nic nie mówią i mogą człowieka trochę zmylić.