Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Błąd w wyświetlaniu - w jednym zapytaniu - dwóch list rekordów powiązanych (while).
Forum PHP.pl > Forum > Przedszkole
krzysieklos
Witam.
Chciałbym, wyświetlając listę tytułów dokumentów, wyświetlić pod każdym tytułem przypisane do niego słowa kluczowe np.:
1. Tytuł 1
tagi: słowo 1, słowo 2, słowo 3
-----------------------------
2. Tytuł 2
tagi: słowo 2, słowo 4, słowo 5

itd.
Wymyśliłem coś takiego, ale niestety słowa kluczowe dublują w przyroście kwadratowym (co jest w sumie naturalne przy zastosowaniu dwóch pętli while). Nie wiem, jakiego rozwiązanie użyć. Liczę bardzo na pomoc. Z góry dziękuję. A oto kod:

CODE
if (mysql_connect($mysql_host, $mysql_login, $mysql_haslo) and mysql_select_db($mysql_baza)) {

$wynikzajawki = mysql_query("SELECT * FROM $mysql_tabela WHERE nr=$dzial");
if (!$wynikzajawki) echo "Błąd w zapytaniu SQL: ".mysql_error();
}

if ($wynikzajawki) {
//LISTA TYTUŁÓW
while($danezajawki = mysql_fetch_assoc($wynikzajawki)) {
$zajdocid=$danezajawki["id"];
$zajdoctytul=$danezajawki["tytul"];

$wynikzajtagi = mysql_query("SELECT t.id, t.tag FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");

//LISTA TAGÓW
while($danezajtagi = mysql_fetch_assoc($wynikzajtagi)) {
$idtagow=$danezajtagi["id"];
$jakietagi=$danezajtagi["tag"];

if (++$i>0) $przecinek=", "; else $przecinek="";
$tagg.=''.$jakietagi.''.$przecinek;
$zajtagi=rtrim($tagg, ', ');
}

echo '
'.$zajdoctytul.''.$zajtagi.'';
}
} mysql_close();
piotrooo89
ja bym to tak zrobił:

  1. <?php
  2. $tytuly = SELECT DISTINCT(*) FROM tytuly;
  3.  
  4. while ($row = mysql_fetch_array($tytuly))
  5. {
  6. $tagi = SELECT * FROM tagi WHERE tytul=$row['tytul'];
  7. echo $row['tytul'];
  8. while ($row2 = mysql_fetch_array($tagi))
  9. {
  10. echo $row2['tagi'];
  11. }
  12. }
  13. ?>


to taki pseudo kod przerób sobie, i sprawdź działanie.
krzysieklos
Niestety nic to nie pomogło. Dalej wyświetla mi podwójnie... Dzięki za odzew.
piotrooo89
a pokaż jak to robisz. kod, pokaż kod.
krzysieklos
  1. <?php
  2. if (mysql_connect($mysql_host, $mysql_login, $mysql_haslo) and mysql_select_db($mysql_baza)) {
  3.  
  4. $wynikzajawki = mysql_query("SELECT DISTINCT(*) FROM $mysql_tabela WHERE nr=$dzial");
  5.  
  6. //LISTA TYTUŁÓW
  7. while($danezajawki = mysql_fetch_array($wynikzajawki))
  8. {
  9. $zajdocid=$danezajawki["id"];
  10. $zajdoctytul=$danezajawki["tytul"];
  11.  
  12. $wynikzajtagi = mysql_query("SELECT t.id, t.tag FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");
  13.  
  14. echo $danezajawki["tytul"];
  15.  
  16. //LISTA TAGÓW
  17. while($danezajtagi = mysql_fetch_array($wynikzajtagi))
  18. {
  19.  
  20.  
  21. if (++$i>0) $przecinek=", "; else $przecinek="";
  22. $tagg.=''.$danezajtagi["tag"].''.$przecinek;
  23. $zajtagi=rtrim($tagg, ', ');
  24.  
  25.  
  26. echo ''.$zajtagi.'';
  27. }
  28. }
  29. ?>
piotrooo89
  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT * FROM $mysql_tabelapor, $mysql_tabelatag WHERE $mysql_tabelapor.id_tag=$mysql_tabelatag.id AND at.id_art=$zajdocid ");
  3. ?>


po co JOIN?
krzysieklos
JOIN nic nie zmienia. Problem pewnie tkwi w podwójnym 'while'. To chyba sprawia, że słowa kluczowe się dwoją, troją, itd.
Przejrzałem już cały net i dwie książki. Nie wiem jak to rozwiązać.
piotrooo89
  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT t.id, DISTINCT(t.tag) AS tagi FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");
  3. ?>


i tak spróbuj wypisać:

  1. <?php
  2. $tagg.=''.$danezajtagi["tagi"].''.$przecinek;
  3. ?>
krzysieklos
Niestety - teraz pojawił się komunikat błędu:
[b]
  1. <?php
  2. Warning[/b]:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in while($danezajtagi = mysql_fetch_array($wynikzajtagi))
  3. ?>


Chyba nic z tego...
piotrooo89
DISTINCT(tag) a tak?

i jeszcze dodaj:

  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT t.id, DISTINCT(t.tag) AS tagi FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )") or die(mysql_error());
  3. ?>
krzysieklos
Something is wrong in your syntax obok 'DISTINCT(tag) AS tagi FROM tabela_tagi_artykuly AS at JOIN tabela_tagi AS t ON (at.id_tag=t.' w linii 1

:-(
piotrooo89
ja naprawde na Twoim miejscu zrezygnowałbym z tego JOIN'a. możesz to ładnie połączyć tytul.id_tag=tag.id stosujac tylko klauzule WHERE. pozniej mozna juz tylko stosowac aliasy. malo moge pomoc nie znajac struktury tabeli.
krzysieklos
Tabele są trzy:
tabela_artykuly:
id | tytul | nr <- numer działu, po którym są sortowane listy dokumentów

tabela_tagi:
id | tagi

tabela_tagi_artykuly:
id_tag | id_art

Zapytanie do bazy robiłem na różne sposoby. Wydaje mi się, że nie powinno być dwóch 'while'. Ale jak to ma wyglądać - nie wiem. W każdym razie dzięki za wsparcie.
piotrooo89
wiec tak:

do pobrania tutułów:

  1. <?php
  2. $tyt = SELECT DISTINCT(*) FROM tabela_artykuly
  3. ?>


do poprania tagow:

  1. <?php
  2. $tag = SELECT * FROM tabela_tagi_artykuly, tabela_tagi, tabela_artykuly
  3. WHERE
  4. tabela_tagi_artykuly.id_tag=tabela_tagi.id
  5. AND
  6. tabela_tagi_artykuly.id_art=tabela_artykuly.id
  7. AND
  8. tytul='$zmienna z pierwszej petli tak jak juz Ci pokazalem'
  9. ?>
krzysieklos
Nie wiem. Cały czas krzyczy, że mysql_fetch_array niemożliwe dla zapytania... Będę jeszcze główkował. Może ktoś ma jeszcze jakiś pomysł?
piotrooo89
bardzo Cię przepraszam... mój błąd...

  1. <?php
  2. $tyt = SELECT DISTINCT tytul, id FROM tabela_artykuly
  3. ?>


tak powinno być.
krzysieklos
Dzięki, dzięki. Pokazałeś mi dobry kierunek. W dwóch zapytaniach do bazy użyłem DISTINCT wskazując interesujące mnie komórki. Działa. Raz jeszcze dziękuję. Najlepszego!
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.