• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Php - wyciaganie z bazy - kto pyta nie błądzi

VPS Starter Arubacloud
+2 głosów
2,782 wizyt
pytanie zadane 12 lutego 2017 w PHP przez niezalogowany
zmienione kategorie 12 lutego 2017 przez Arkadiusz Waluk

witam, jestem na etapie nauki php.
Nie rozumiem jednak jedenej rzeczy i nie moge znaleźć wytłumaczenia.

 

					while($row = $result->fetch_assoc()){
						echo "<br>" . $row['nazwa'] ;
						echo "<br>" . $row['opis'];
						echo "<br><br>";
					}

Prosta pęta, która wyciąga wszystkie dane z tabeli.
Moje pytanie jednak brzmi : Skąd pętla wie że ma przejść do kolejnego wiersza? Nie ma tu żadnej ikrementacji ani nic takiego.

5 odpowiedzi

+1 głos
odpowiedź 12 lutego 2017 przez Ehlert Ekspert (212,630 p.)

Żaden return. Poczytaj o generatorach w PHP. Zamiast return używa się yield:

Link

0 głosów
odpowiedź 12 lutego 2017 przez Boshi VIP (100,240 p.)
Fetch assoc wyciąga tylko jeden rekord.  Zatem w pętli leci rekord za rekordem i sprawdza  warunek pętli
komentarz 12 lutego 2017 przez niezalogowany
edycja 12 lutego 2017
Chyba już rozumiem, dla testu wstawiłem sobie do kodu bez pętli kilka razy $row = $result->fetch_assoc();
i za każdym razem po tej linijce dodawałem echo, które wypisywało mi dane z bazy.

Nie wiem czy dobrze ale zrozumiałem to tak że funkcja fetch_assoc() sama z siebie wie że ma przejść do kolejnego wiersza czyż tak?
0 głosów
odpowiedź 12 lutego 2017 przez niezalogowany

Pętla wykonuje się dopóki warunek między nawiasami jest prawdziwy.

while($row = $result->fetch_assoc())

Tylko $row jest warunkiem w tej pętli, dalej jest tylko instrukcja przypisania do $row wartości zwracanej przez funkcję fetch_assoc(). 

fetch_assoc() zwraca wartość NULL (czyli false), kiedy w tabeli nie ma więcej wierszy.

Kiedy w $row jest wartość false pętla przestaje się wykonywać.

komentarz 12 lutego 2017 przez niezalogowany
Chyba już rozumiem, dla testu wstawiłem sobie do kodu bez pętli kilka razy $row = $result->fetch_assoc();
i za każdym razem po tej linijce dodawałem echo, które wypisywało mi dane z bazy.

Nie wiem czy dobrze ale zrozumiałem to tak że funkcja fetch_assoc() sama z siebie wie że ma przejść do kolejnego wiersza czyż tak?
0 głosów
odpowiedź 12 lutego 2017 przez Chess Szeryf (76,710 p.)
<?php 

$link = mysqli_connect("localhost", "root", "", "rejestracja");

$query="select id from logowanie";
$result=mysqli_query($link,$query);

 while ($row = mysqli_fetch_assoc($result)) {
        	
		print_r($row['id']);
		
		if($row['id']==5){
			break;
		}
		
    }

?>

Ta funkcja mysqli_fetch_assoc szuka chyba rekordy, co jeden (1). Popatrz na kod powyżej. Funkcja break, zatrzymuje liczenie rekordów i ich wypisywanie.

Zobacz sobie to:

while ($row = mysqli_fetch_assoc($result)) {
        	
		print_r($row);
		
}

Wyrzuci to:

Array
(
    [id] => 4
)
Array
(
    [id] => 5
)
Array
(
    [id] => 6
)
Array
(
    [id] => 7
)
Array
(
    [id] => 8
)

W zależności, co masz w bazie to, to wypluje.

Czyli ta funkcja nie wyrzuci ci takiego czegoś:

Array
(
    [0] => 4
    [1] => 5
    [2] => 6
    [3] => 7
    [4] => 8
)

Jeśli źle rozumuję, to proszę o poprawienie mnie. :)

–2 głosów
odpowiedź 12 lutego 2017 przez Chess Szeryf (76,710 p.)

Może dla przykładu podam trochę nieco inny kod poprzez który może lepiej to zrozumiesz. A mianowicie ten:

<?php 

function x(&$a){
	return $a=$a+2;
} 

echo x($a)*x($a)+$a;

?>

I jaki jest wynik kodu powyżej, hmm...? Powyższy kod nie ma inkrementacji, a działa. Oblicz to nie korzystając z żadnego kompilatora/interpretera kodu. Oblicz to na kartce lub w myślach. ;)

komentarz 12 lutego 2017 przez Chess Szeryf (76,710 p.)
komentarz 12 lutego 2017 przez niezalogowany

No tutaj wszystko jest dla mnie jasne dzieki tej linijce:
return $a=$a+2;

 

ale tak jak pisałem wydaje mi się że zrozumiałem, prosiłbym jedynie kogoś o potiwerdzenie lub zaprzeczenie:

"Dla testu wstawiłem sobie do kodu bez pętli kilka razy $row = $result->fetch_assoc();
i za każdym razem po tej linijce dodawałem echo, które wypisywało mi dane z bazy.

Nie wiem czy dobrze ale zrozumiałem to tak że funkcja fetch_assoc() sama z siebie wie że ma przejść do kolejnego wiersza czyż tak?
"

komentarz 2 lipca 2020 przez Pelagiusz Nowicjusz (100 p.)

@Chess, Wytłumaczysz dlaczego wyszło 12 ? Co oznacza "&" ? Wiem że jest to iloczyn bitowy.

komentarz 21 lipca 2022 przez bigbag999 Nowicjusz (200 p.)

@Pelagiusz, pewnie już nie oczekujesz tutaj na odpowiedź, ale wyjaśnię to dla innych bo ten temat jest wysoko w Googlach i pewnie regularnie ktoś tu wchodzi :D

 

Znak "&" przy deklaracji zmiennych funkcyjnych oznacza, że zmienna którą podajemy do funkcji jest podawana jako "całość", czyli przesyłamy zmienną do funkcji i ona do nas wraca w takiej postaci, w jakiej została przetworzona przez funkcję. Gdy nie ma znaku "&" przy deklaracji zmiennych funkcyjnych, przesyłamy jedynie wartość naszej zmiennej do funkcji, sama zmienna globalna jest nienaruszona, pomimo że podaliśmy ją do funkcji.

Przykład który pozwoli zwizualizować sobie jak to działa:

function zrob_cos ($a) {
    $a = $a + 1;
}
$x = 5;
zrob_cos($x); // wywołujemy funkcje podając do funkcji wartość zmiennej 'x' czyli liczbe '5'
echo $x; // wypisuje 5 (ponieważ do funkcji trafiła tylko wartość naszej zmiennej x, a nie cała zmienna)

function zrob_cos_inaczej (&$a) {
    $a = $a + 1;
}
$x = 5;
zrob_cos_inaczej($x); // wywołujemy funkcje tym razem przesyłając nie tylko wartość zmiennej x, ale zmienną jako całość
echo $x; // wypisuje 6

 

Podobne pytania

0 głosów
3 odpowiedzi 1,164 wizyt
0 głosów
1 odpowiedź 1,826 wizyt
pytanie zadane 17 czerwca 2017 w SQL, bazy danych przez Haroy Użytkownik (550 p.)
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 4 kwietnia 2022 w PHP przez XxThorusxX Użytkownik (500 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...