d0nMD Opublikowano 20 Grudnia 2009 Zgłoś Opublikowano 20 Grudnia 2009 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! Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 20 Grudnia 2009 Zgłoś Opublikowano 20 Grudnia 2009 $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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
d0nMD Opublikowano 20 Grudnia 2009 Zgłoś Opublikowano 20 Grudnia 2009 Gratuluję wiedzy i jeszcze raz dziękuję ;] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 20 Grudnia 2009 Zgłoś Opublikowano 20 Grudnia 2009 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(). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
d0nMD Opublikowano 20 Grudnia 2009 Zgłoś Opublikowano 20 Grudnia 2009 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...