Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pętla w pętli
Forum PHP.pl > Forum > PHP
ZuyPan
Witam.
Mam dziwny błąd - wszystko działa na localhost, ale na testowych serwerach (ugu i cba) już nie. Chodzi o skrypt gdzie w pętli while używam drugi raz pętli while:

  1. $team_a = "SELECT * FROM team";
  2. $team_b = mysql_query($team_a, $polaczenie1);
  3.  
  4. while ($team = mysql_fetch_assoc($team_b)){
  5. $player_a = "SELECT * FROM player WHERE account_id = '$team[account_id]'";
  6. $player_b = mysql_query($player_a, $polaczenie3);
  7. while ($postacie = mysql_fetch_assoc($player_b)){
  8. include ('tmp/'.$tmp.'/team.php');
  9. $podstrona2 .= $p_team;
  10. }
  11. }

Jeśli usunę z pierwszej pętli tę drugą wszystko działa, ale gdy pojawia się ta druga nie dostaję nic. Co dziwne jak już pisałem na localhoscie wszystko działa jak należy. Sprawdzałem - oba zapytania się wykonują. Jedyne co nie działa to "while ($postacie = mysql_fetch_assoc($player_b)){" ta linijka
Fifi209
Pokaż bazę, powiedz co chcesz uzyskać. Pętla w pętli to bardzo zły pomysł.
jarmiar
przecież tutaj aż prosi się o JOINOWANIE zapytania sql

poczytaj o joinowaniu, wtedy zrobisz to za pomocą jednego zapytania i za pomocą jednej pętli wyciągniesz dane
ZuyPan
Ok to przedstawię co chcę uzyskać:
Mam cztery bazy danych a w tym:
* www - baza danych strony www
* player - baza z postaciami graczy w pewnej grze
W bazie danych www jest tabelka team. Za pomocą tej tabeli wyświetlam członków teamu tworzących grę. Dla każdego członka teamu mają zostać wyświetlone też jego postacie. Postacie pobieram z bazy danych player w których jest tabela player.
Oto jak obie tabele wyglądają:
team:
*id
*nick
*account_id
*ranga
*id_rangi
*obowiazki

teraz player: (uproszczona)
*id
*account_id
*name
*level
*exp

Jak widać za pomocą account_id da się połączyć te dwie tabele jadnak joinowanie od zawsze sprawiało mi problemy z tąd takie a nie inne rozwiązanie jakie obrałem. Postaci dla konta może być maks 4 a ja potrzebuje pobrać szczegółowe dane o każdej.

EDIT: to jak pomoże ktoś? da się robić join dla dwóch innych baz danych?
tehaha
to, że nie chciało Ci się nigdy uczyć łączenia tabel to jeszcze nie powód, żeby ktoś odwalał za Ciebie robotę. Czy chcesz czy nie JOIN musisz opanować bo inaczej nie będziesz w stanie napisać wydajnego skryptu. Jeżeli nie chce Ci się uczyć JOIN to możesz to zrobić przy pomocy 2 zapytań:
1. pobierasz tych graczy i zbierasz ich ID do tablicy
2. następnie drugim zapytaniem pobierasz info dla tych graczy zapytaniem z IN(), czyli coś takiego
  1. WHERE id IN(1,2,3,4)


ale oczywiście najlepiej byłoby zrobić JOIN, to powyżej to tylko mniejsze zło niż pętla w pętli, której nigdy nie powinieneś robić w skrypcie, tu masz nawet gotowca z Twoim przypadkiem:

http://bytes.com/topic/php/answers/721490-...erent-databases

a tu instrukcja do JOIN, również z licznymi przykładami użycia: http://dev.mysql.com/doc/refman/5.0/en/join.html
ZuyPan
http://dev.mysql.com/doc/refman/5.0/en/join.html widziałem to już setki razy. Po prostu nie jestem w stanie zrozumieć joina. Zakładasz, że nawet nie próbowałem a to błąd.
Postaram sie coś wykombinować.
EDIT!
Kombinuje jak koń pod górę, ale mi nie wychodzi. Używając:
  1. <?php
  2. $team_a = "SELECT www.team.nick AS nick, player.player.name AS name FROM www.team,player.player";
  3. $team_b = mysql_query($team_a);
  4. if ($team_b){
  5. echo 'tak';
  6. }else{
  7. echo 'nie';
  8. }
  9.  
  10. while ($team = mysql_fetch_assoc($team_b)){
  11. include ('tmp/'.$tmp.'/team.php');
  12. $podstrona2 .= $p_team;
  13. }
  14. ?>

i dostaję błąd Warning: "mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /virtual/h/i/hidan.ugu.pl/xyz.php on line 10". Dodatkowo dostaje też napis "nie" jako potwierdzenie, że zapytanie się nie wykonało... Jakieś rady?
nekomata
1. mysql_query ($zapytanie) or die(mysql_error()) wtedy zobaczysz że masz błędnie zapisane FROM .
2.Takie coś powinno ci pomóc (z palca więc może być literówka ale układ jest OK ) :
Kod
SELECT team.nick AS nick,player.name AS name FROM team,player WHERE player.account_id =  team.account_id
3. W powyższym przykładzie musisz while 'wsadzić' w if'a który zwraca tak.. co po tym że wyświetlasz NIE jak nic z tym 'nie' nie robisz .

Zastosuj te porady to powinno rozwiązać twój problem.
ZuyPan
Jakosik mi to działa, ale nadal źle tongue.gif
  1. $team_a = "SELECT db199709.team.nick AS nick,db199709.team.account_id AS acc_id,db199709.player.name,db199709.player.account_id AS accoun_id FROM db199709.team,db199709.player WHERE db199709.player.account_id == db199709.team.account_id";
  2. $team_b = mysql_query($team_a);
  3.  
  4.  
  5. while ($team = mysql_fetch_assoc($team_b)){
  6.  
  7. if ($team['acc_id'] == $team['accoun_id']){
  8.  
  9. include ('tmp/'.$tmp.'/team.php');
  10. $podstrona2 .= $p_team;
  11. }
  12. }
.
Ogólnie w moim layu każdy członek teamu ma osobne "okienko" i w tym okienku są dane i wyświetlone wszystkie nazwy jego postaci. A gdy ustawie komuś z teamu dwie postacie pojawiają się dwa okienka dla jednego gracza i w każdym po jednej postaci. Jak zrobić, aby postacie były w jednym okienku? Oto kawałek odpowiedzialny za wyświetlanie każdego członka teamu:
  1. <?php
  2. $p_team = '
  3. <div class="boxui box-title">
  4. <h2>'.$team['nick'].'</h2>
  5. <span class="date"><b>'.$team['ranga'].'</b></span>
  6. </div>
  7. <div class="boxui box-con">
  8. <p><b>Stanowisko: </b>'.$team['ranga'].'
  9. <br><b>Obowiązki: </b>'.$team['obowiazki'].'
  10. </p>
  11. <p><b>Postacie: </b>
  12. <br><a href="index.php?strona=profil&id='.$team[accoun_id].'">'.$team['name'].'</a></p>
  13. </div>
  14. <div class="boxui box-end"></div>
  15. ';
  16. ?>
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.