Skocz do zawartości
d0nMD

[php/mysql] Niejasności Związane Z If I While

Rekomendowane odpowiedzi

Witam,

Przerabiam kurs o stosowaniu MySQL w PHP i nie rozumiem pewnych kwestii.

Przykładowe źródło:

<?php$result = mysql_query("SELECT * FROM subjects", $connection);if (!$result) {die("Database query failed: " . mysql_error());}while ($row = mysql_fetch_array($result)) {echo $row["menu_name"]. " " . $row["position"] . "<br />";}?>
  • if (!$result)

    Przeglądałem już różne inne kursy i nigdzie nic podobnego nie widziałem. Co właściwie sprawdzamy tym warunkiem? Czy udało się przypisać daną rzecz do '$result'? Czy w tabeli 'subjects' jest cokolwiek (*)?

  • while ...

    Nie widzę, abyśmy w tej pętli robili cokolwiek kluczowego, nawet nie przesuwamy pointera (niestety nie wiem jaka jest polska nazwa), a mimo to otrzymujemy wartości kolejnych pól z bazy.

Z góry dziękuję za wyjaśnienia!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

$result to zmienna przechowująca wynik zapytania. If w przypadku PHP jest bardzo elastyczny - jeśli wartość w nawiasie jest czymkolwiek innym niż "0" lub "false", odczytuje ją jako odpowiedź pozytywną.

 

Powyższy kod można zastąpić kodem:

if ($result) echo 'zapytanie wykonane poprawnie';else  echo "zapytanie zwróciło błąd" . mysql_error();
lub dokładniej (opierając się o C):
if ($result != 0) echo 'zapytanie wykonane poprawnie';else  echo "zapytanie zwróciło błąd" . mysql_error();
Jak widać, pierwsza i druga linijka nie jest nam potrzebna - bardziej interesuje nas to z ELSE. Dlatego, zamiast pytać czy zmienna "jest ok" i wywalać błąd w przeciwnym wypadku, możemy od razu zapytać, czy zmienna "nie jest ok".

if ($result == 0) echo "zapytanie zwróciło błąd" . mysql_error();
Skracając zapis stosujemy do tego znak "!", który jest negacją (zaprzeczeniem) logicznym wartości:

if (!$result) echo "zapytanie zwróciło błąd" . mysql_error();

Odnośnie zaś drugiego problemu w kodzie:

while ($row = mysql_fetch_array($result))
Z punktu widzenia typowego programisty to nie ma prawa działać. Chyba każdy początkujący w PHP dochodzi do takiego wniosku w tym kodzie. Jednak jest mały haczyk. Funkcja mysql_fatch_array() sama podstawia pod zmienną $row kolejne wiersze z wyniku. Dlatego wbrew podstawowym zasadom ASM/Pascala/C/C++ kod działa sam z siebie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak się tak zastanowić, to odpowiedź na pierwsze pytanie powinna być trochę inna - dokładniejsza.

 

Samo if($result) daje nam odpowiedź negatywną w 2 przypadkach - gdy wynik jest tablicą pustą (0) lub gdy polecenie nie zostało wykonane (false). Aby rozróżnić obydwa przypadki dodaje się "!".

1. Gdy mamy 0 (pusta tablica), to !0 = 0, czyli polecenie zostało wykonane poprawnie - nie ma potrzeby wywalania komunikatu o błędzie.

2. Gdy mamy false (polecenie nie zostało wykonane), to !false = true, czyli polecenie nie zostało wykonane poprawnie i wyświetlamy komunikat o błędzie "błąd zapytania". Doklejamy do niego (przy pomocy kropki) nazwę/kod błędu, który w postaci tekstu zwraca nam funkcja mysql_error().

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chyba szkoda strzępić klawiaturę na kolejne podziękowania ;]

Bałem się, że ktoś tylko przytoczy fragmenty dokumentacji z mizernym wyjaśnieniem, a dostałem bardzo szerokie rozwinięcie tematu, wraz z logicznym tokiem myślenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...