Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Przeglądanie zawartości tablicy asocjacyjnej - foreach
Forum PHP.pl > Forum > Przedszkole
Lukis92
Witam.
Mam tabelę miasto z kolumnami id, nazwa. Chodzi o wyświetlenie jej zawartości. Mam to zrobić za pomocą pętli foreach. Wymyśliłem, że dane pobrane z bazy wstawię do tablicy asocjacyjnej, aby w łatwy sposób dostać się do danych np. row['id'], row['nazwa']. Tylko jest probem, że warunek zadania to użycie pętli foreach, która nie chce być posłuszna biggrin.gif.

Oto kod:
  1. $servername = 'localhost';
  2. $username = 'root';
  3. $password = 'qsdfg';
  4. $dbname = 'baza';
  5.  
  6. //create connection
  7. $conn = mysqli_connect($servername, $username, $password, $dbname);
  8.  
  9. // Check connection
  10. if (!$conn) {
  11. die("Connection failed: " . mysqli_connect_error());
  12. }
  13.  
  14. // select table 'miasto'
  15. $sql = "SELECT id, nazwa FROM miasto";
  16. $result = mysqli_query($conn, $sql);
  17.  
  18. echo '<table border="1">
  19. <tr><th>ID</th><th>Nazwy miast</th></tr>';
  20. while($row = mysqli_fetch_assoc($result)){
  21. foreach($row as $id => $row['nazwa'])
  22. echo '<tr><td>'.$row['id'].'</td><td>'.$row['nazwa'].'</td></tr>';
  23. }
  24. echo '</table>';


Gdy użyję samej pętli while to ładnie wyświetla tabelę. Natomiast foreach powoduje takie cuda:


Szukałem już wielu rozwiązań w internecie i już mam lekko dosyć . Dlatego też piszę tutaj na forum.
SmokAnalog
Tak naprawdę użycie foreach tutaj nie pasuje, bo dane z bazy powinno się pobierać wiersz po wierszu, tak jak Ty to zrobiłeś. Żeby użyć foreach, to musisz pobrać wszystkie wyniki naraz za pomocą mysqli_fetch_all. Ewentualnie możesz wyświetlić każdy wiersz osobno z foreach, żeby iterować każdą komórkę, ale to dosyć dziwne w tym przypadku.
ilidir
Musiałbyś najpierw wstawić do tablicy wszsytko a potem odczytać tablice foreachem.
Lukis92
Dzięki ilidir za pomoc. Niby tak proste rozwiązanie a ciężko było wpaść na nie.
Teraz już wszystko działa jak należy smile.gif Zrobiłem tak:
  1. echo '<table border="1">
  2. <tr><th>ID</th><th>Nazwy miast</th></tr>';
  3. $array = array();
  4. while($row = mysqli_fetch_assoc($result)){
  5. $array[] = $row;
  6. }
  7. foreach($array as $a){
  8. echo '<tr><td>'.$a['id'].'</td><td>'.$a['nazwa'].'</td></tr>';
  9. }
  10. echo '</table>';
SmokAnalog
Czy nauczyciel akceptuje rozwiązania, które są bez sensu? Bo to jest bez sensu. To tak jakbyś robił porządek w pokoju w taki sposób, że wywalasz wszystko na środek i ustawiasz tak jak było.
Lukis92
Nie jest to na uczelnie. Uczę się teraz z czystej chęci. Znalazłem zbiór zadań jakieś uczelni z php i go po kolei przerabiam.
Oto treść:


Może źle rozumiem treść zadania ale myślę, że o to chodziło smile.gif
SmokAnalog
Chcą, żebyś wczytał je do tablicy. Jeśli dane pochodzą z bazy danych, to to nie jest najlepsze wyjście. Ale jeśli chcesz tak zrobić, to użyj mysqli_fetch_all, które automatycznie zbiera wyniki z bazy do tablicy. mysql_fetch_assoc służy do tzw. fetchowania tablicy, czyli ładowania wyników wiersz po wierszu. Składanie tablicy tą metodą to rozwiązanie naokoło.
Lukis92
Więc wczytuję do tablicy pobierając z bazy. Teraz poprawiłem w ten sposób:
  1. echo '<table border="1">
  2. <tr><th>ID</th><th>Nazwy miast</th></tr>';
  3.  
  4. $row = mysqli_fetch_all($result, MYSQLI_ASSOC);
  5.  
  6. foreach($row as $r){
  7. echo '<tr><td>'.$r['id'].'</td><td>'.$r['nazwa'].'</td></tr>';
  8. }
  9. echo '</table>';


Niezła ta funkcja mysqli_fetch_all. Znacznie łatwiejsza w ogarnięciu smile.gif. Czy chodziło Ci o ten sposób rozwiązania?
SmokAnalog
Tak, bardzo dobrze smile.gif Jedyne co bym zmienił to nazwy zmiennych, bo $row teraz tak naprawdę zawiera wszystkie wyniki, więc może $rows?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.