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

Wstawianie rekordów z kolumny do zmiennych

VPS Starter Arubacloud
+1 głos
231 wizyt
pytanie zadane 29 listopada 2021 w PHP przez razor6017 Użytkownik (780 p.)

Uczę się kodu PHP i próbuję zrobić własny projekt. Tak dla własnej satysfakcji. W bazie jest kilka rekordów i chciałbym te dane włożyć do kilku różnych zmiennych. Dwa różne kody dają dwa różne efekty i nie potrafię zrozumieć dlaczego. Dość powiedzieć, że ten kod sprawia, że wszystkie rekordy z tej kolumny wyświetlają się poprawnie.

<?php
		$row_no = $result->num_rows;
		if ($row_no>0)
		{
			$result->fetch_assoc();
			foreach ($result as $result_row):
				echo "<span>".$result_row['DropName']."</span>";
				
				
			endforeach;
			$result->free();
		} else {
			echo "<p>Tabela jest pusta</p>";
		}
	?>

Natomiast ten powoduje, że do zmiennych wkładany jest ostatni rekord z bazy, co powoduje, że wyświetlenie wszystkich trzech zmiennych daje taki sam, ostatni, trzeci rekord.

	<?php
		
		$row_no = $result->num_rows;
		if ($row_no>0)
		{
			$result->fetch_assoc();
			foreach ($result as $result_row):
				$DropName1=$result_row['DropName'];
				$DropName2=$result_row['DropName'];
				$DropName3=$result_row['DropName'];
				
			endforeach;
			$result->free();
			
			echo "<p>".$DropName1."</p>";
			echo "<p>".$DropName2."</p>";
			echo "<p>".$DropName3."</p>";
		} else {
			echo "<p>Tabela jest pusta</p>";
		}
	?>

Podpowie ktoś jak zedytować kod, żeby uzyskać poprawnie włożone dane do zmiennych? Dodam, że rekordów zawsze jest równe 3.

1 odpowiedź

0 głosów
odpowiedź 30 listopada 2021 przez Wiciorny Ekspert (269,120 p.)
  $DropName1=$result_row['DropName'];
   $DropName2=$result_row['DropName'];
   $DropName3=$result_row['DropName'];

zauważ do każdej zmiennej przypisujesz ten sam element 

następnie wypisujesz te same zmienne do paragrafów 

    echo "<p>".$DropName1."</p>";
   echo "<p>".$DropName2."</p>";
     echo "<p>".$DropName3."</p>";

Dlaczego wrzuca ostatni rekord?  BO najpierw pętla przypisze pierwszy rekord do  DropName1 DropName2 DropName3
 Potem przejdzie drugi raz potem przejdzie 3 raz więc ostatecznie napisane zostanie ostatnie wykonanie  dla 3 rekordu 
A pozostałe zostaną nadpisane. Dalej idąc kończysz endforeach;

 endforeach;
        $result->free();

Dopiero po nim robisz wypisanie, dlatego tak jest. 

        echo "<p>".$DropName1."</p>";
        echo "<p>".$DropName2."</p>";
        echo "<p>".$DropName3."</p>";

 

komentarz 30 listopada 2021 przez razor6017 Użytkownik (780 p.)
No dobra, ale dalej nie powiedziałeś jak zedytować kod, żeby całość działała poprawnie. Wytłumaczyłeś mi na czym polega mój błąd, ale nie powiedziałeś jak to zmienić albo nie dałeś wskazówek, żebym ewentualnie mógł sam do tego dojść
komentarz 30 listopada 2021 przez Wiciorny Ekspert (269,120 p.)
bo naprawa błędu należy do Ciebie skoro kod pisałeś samodzielnie, to rozumiesz jaki błąd popełniłeś i jak to naprawić. Skoro iterujesz po kolekcji która nadpisuje zmienne, to musisz zwracać rezultat zanim wykonasz kolejną iteracje.
https://www.youtube.com/watch?v=ptoG63zBKxE&ab_channel=php-mysqlvideo-tutorials
1
komentarz 1 grudnia 2021 przez razor6017 Użytkownik (780 p.)
Dobra, to już było trudne dla mnie... będę musiał to przeanalizować na spokojnie. Dziękuję.
komentarz 1 grudnia 2021 przez Wiciorny Ekspert (269,120 p.)
w razie czego pytaj po prostu przedstaw pomysł implementacji to ja chętnie pomogę już dopracować
komentarz 1 grudnia 2021 przez razor6017 Użytkownik (780 p.)

Tworzę dla własnej satysfakcji i samorozwoju stronę, która pokazuje - po uprzednim wybraniu z listy rozwijanej konkretnego moba z gry - jakie przedmioty wypadają z niego i jakiej są jakości. Żeby było jasne - z danego moba wypadają zawsze 3 różne przedmioty w zależności od poziomu gracza i każdy jest innej jakości. Skrypt ma wczytywać z bazy MySQL 3 wartości dla 3 różnych rekordów stanowiących podstawę do stworzenia przez kod HTML i CSS obrazu. Jak już możesz się domyślić DropName to nazwa dropu, przedmiotu, itemu wypadającego z moba. DropImage to zdjęcie przedmiotu, natomiast DropQuality określa tło zmieniające się w zależności od jakości przedmiotu. Wszystkie te rekordy to czysty tekst. Nie ma żadnych rekordów int oprócz ID, który jest autoinkrementowany. Przy czym wartości dwóch ostatnich to ścieżka na serwerze do zdjęć. Udało mi się dostosować kod, bo pętla while (jak również podana poniżej foreach) wyświetla już 3 iteracje rekordów, ale dane wkładane do kodu HTML są puste, bo:

Warning: Undefined array key 2 in C:\xampp\htdocs\dropbase\index.php on line 44

A tak wygląda zmodyfikowany kod:

<?php

			foreach ($result as $row):
				echo '<div class="resource-box">';
		
					echo '<div class="resource-box-quality-bg">';
						echo '<img src="'.$row[1].'" width="74" height="90">';

						echo '<div class="resource-box-image">';
							echo '<img src="'.$row[2].'" width="74" height="74">';
						echo '</div>';
			
						echo '<div class="resource-box-text">';
							echo '<span class="resource-box-font">'.$row[3].'</span>';
						echo '</div>';
			
				echo '</div>';
		
				echo '<div class="resource-box-caption">';
					echo '<span>'."$row[4]".'</span>';
				echo '</div>';
			
				echo '</div>';
			endforeach;
			$result->free();
	?>

Dodałem do bazy 4 kolumnę z tekstem informującym od jakiego poziomu leci ten przedmiot, więc teraz są 4 wartości w 3 rekordach. Gdybym zostawił tekst w HTMLu Lvl. 60+ to dla wszystkich przedmiotów byłaby informacja Lvl. 60+ pod obrazem

komentarz 1 grudnia 2021 przez razor6017 Użytkownik (780 p.)

Jeju! Jaki ja jestem głupi... to wszystko moja wina! XD
Kompletnie zapomniałem, że na samym początku kodu wyjmuję z bazy danych tylko jedną kolumnę DropName zamiast wszystkich... dlatego interpreter miał rację, bo wyjmując jedną tabelę pozostałe zmienne nie istnieją!

Poradziłem sobie z pętlą dzięki wcześniejszej Twojej odpowiedzi, Wiciorny.

Poniżej wklejam pętlę dla potomnych:

<?php

	$result->fetch_assoc();
	foreach ($result as $row): ?>
		<div class="resource-box">
			<div class="resource-box-quality-bg">
			 <img src="<?php echo $row['DropQuality']; ?>" width="74" height="90">

				<div class="resource-box-image">
					<img src="<?php echo $row['DropImage']; ?>" width="74" height="74">
				</div>
			
				<div class="resource-box-text">
					<span class="resource-box-font"><?php echo $row['FromLevel'];?></span>
				</div>
			
			</div>
		
			<div class="resource-box-caption">
				<span><?php echo $row['DropName']; ?></span>
			</div>
			
		</div>
		
		<?php endforeach;
		$result->free();?>

Pozdrawiam serdecznie wszystkich amatorów PHP :D

Podobne pytania

0 głosów
1 odpowiedź 72 wizyt
pytanie zadane 5 lipca 2018 w SQL, bazy danych przez armen10 Początkujący (420 p.)
0 głosów
0 odpowiedzi 88 wizyt
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 31 października 2016 w PHP przez Q_Nick Mądrala (5,010 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...