• 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

+1 głos
37 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 Mędrzec (196,660 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 Mędrzec (196,660 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 Mędrzec (196,660 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
0 odpowiedzi 50 wizyt
0 głosów
1 odpowiedź 47 wizyt
pytanie zadane 5 lipca 2018 w SQL, bazy danych przez armen10 Początkujący (420 p.)
0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 31 października 2016 w PHP przez Q_Nick Mądrala (5,030 p.)

86,442 zapytań

135,202 odpowiedzi

300,338 komentarzy

57,191 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...