Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Wyświetlanie danych z jednej tabeli
zwieracz
post 17.10.2008, 19:05:25
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


Witam
Mam tabelę w bazie mysql w której są następujące kolumny: id, cytat, autor, zrodlo, tag;
dane w kolumnach: autor, zrodlo, tag; mogą się powtarzać.
Chciałbym pokazać listę autorów na daną literę wraz ze źródłami mniej więcej w ten sposób:

autor1
- zrodlo1, zrodlo2, zrodlo3
autor2
- zrodlo, zrodlo4
autor3
- zr........

na razie zrobiłem coś takiego:

  1. <?php
  2. $q = mysql_query("SELECT DISTINCT autor, FROM xxx
  3. WHERE autor LIKE '".mysql_real_escape_string($_GET['letter'])."%' ORDER BY autor ASC");
  4. while ($x = mysql_fetch_assoc($q))
  5. {
  6. extract($x);
  7. echo $autor;
  8. }
  9. ?>


Co pokazuje mi listę autorów na daną literę przekazywaną przez GET i jest ok. Ale jak dołączyć do każdego autora jego źródła?questionmark.gif
Proszę o wskazówki
Go to the top of the page
+Quote Post
webasek
post 18.10.2008, 09:26:43
Post #2





Grupa: Zarejestrowani
Postów: 274
Pomógł: 35
Dołączył: 18.07.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Masz w jednej tabeli nazwiska autorów i ich cytaty itd... jeśli tak to najpierw poczytaj o tworzeniu baz danych (konkretne poszukaj o postaciach normalnych) ew. zapytaj na forum jak stworzyć taką bazę. Odpowiedź na pytanie możesz kombinować z union ale mało efektywne, i jeśli zastosujesz distinct to pojawi się problem baza danych wybierze tylko jeden rekord resztę uzna za takie same. Lepiej zmień bazę danych


--------------------
"Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota,
choć nie jestem pewien co do tej pierwszej." Albert Einstein

Wirtualny Rynek Predykcyjny
Go to the top of the page
+Quote Post
HellRider
post 18.10.2008, 15:17:38
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 7
Dołączył: 12.09.2008
Skąd: localhost

Ostrzeżenie: (0%)
-----


Cytat(zwieracz @ 17.10.2008, 19:05:25 ) *
Witam
Mam tabelę w bazie mysql w której są następujące kolumny: id, cytat, autor, zrodlo, tag;
dane w kolumnach: autor, zrodlo, tag; mogą się powtarzać.
Chciałbym pokazać listę autorów na daną literę wraz ze źródłami mniej więcej w ten sposób:

autor1
- zrodlo1, zrodlo2, zrodlo3
autor2
- zrodlo, zrodlo4
autor3
- zr........
[CUT]


  1. <?php
  2. $res = mysql_query("SELECT autor FROM tabela WHERE autor LIKE ".$_GET['letter']."% ORDER BY autor ASC");
  3. while ($row = mysql_fetch_row($res, MYSQL_ASSOC)){
  4.  echo $row['autor']; //formatuj dowolnie
  5.  
  6.  $res2 = mysql_query("SELECT zrodlo FROM tabela WHERE autor='".$row['autor']."' ORDER BY zrodlo ASC");
  7.  while ($row2 = mysql_fetch_row($res2, MYSQL_ASSOC)){
  8.    echo $row2['zrodlo']; //formatuj dowolnie
  9.  }
  10. }
  11. ?>


Nie testowałem, ale z zasady powinno działać bez zarzutu.
Ana, wszelkie encapsy i slashe pominąłem dla przejrzystości.

Ten post edytował HellRider 18.10.2008, 16:03:30
Go to the top of the page
+Quote Post
zwieracz
post 19.10.2008, 16:07:00
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


dzięki wielkie

webasek:
W sumie zdaję sobie z tego sprawę że powinienem mieć wszystko w innych tabelach i kiedyś tak będę musiał zrobić. Na razie jednak tabela o której mowa używana jest (i stworzona też) przez plugin wp-quotescollection w wordpressie - ja po prostu chciałem się podłączyć innym skryptem do tej tabeli. winksmiley.jpg
Niestety nie przychodzi mi do głowy jak użyć UNION w takiej sytuacji choć już trochę poczytałem o tym złączeniu.

HellRider:
Twoje rozwiązanie zadziałało - nie użyłem co prawda:
  1. <?php
  2. mysql_fetch_row($res, MYSQL_ASSOC)
  3. ?>

bo nie wiedzieć czemu nie działało to u mnie, a zadziałało:
  1. <?php
  2. ?>

w manualu bowiem przeczytałem o powyższych funkcjach:
Cytat
Godne uwagi jest to, że użycie mysql_fetch_assoc() nie jest znacząco wolniejsze od użycia mysql_fetch_row(), a jest bardziej funkcjonalne.
cokolwiek to znaczy??

W sumie wyszło mi coś takiego:
  1. <?php
  2. $res = mysql_query("SELECT DISTINCT autor FROM tabela WHERE autor LIKE '".mysql_real_escape_string($_GET['letter'])."%' ORDER BY autor ASC");
  3. while ($row = mysql_fetch_assoc($res)){
  4. echo "<div>".$row['autor']; //formatuj dowolnie
  5.  
  6. $res2 = mysql_query("SELECT DISTINCT zrodlo FROM tabela WHERE autor='".$row['autor']."' ORDER BY zrodlo ASC");
  7. while ($row2 = mysql_fetch_assoc($res2)){
  8.   echo "<div>".$row2['zrodlo']."</div> "; //formatuj dowolnie
  9. }
  10. echo "</div>";
  11. }
  12. ?>


Mam jeszcze pytanie o szybkość i obciążenie serwera dotyczące tych zapytań do bazy (jak już webasek wspomniał jedna tabela nie jest najszczęśliwszym rozwiązaniem) i czy rzeczywiście użycie mysql_fetch_assoc($res) zamiast mysql_fetch_row($res, MYSQL_ASSOC) (to nie działa) nie spowolni takiego zapytania?
Dodam że na razie w tablicy jest ok 4k rekordów a będzie 2x tyle.

jeszcze raz dzięki
Go to the top of the page
+Quote Post
HellRider
post 20.10.2008, 03:45:57
Post #5





Grupa: Zarejestrowani
Postów: 57
Pomógł: 7
Dołączył: 12.09.2008
Skąd: localhost

Ostrzeżenie: (0%)
-----


Oj, pomyliłem funkcje, nie chodziło mi o
mysql_fetch_row($res, MYSQL_ASSOC)
tylko o
mysql_fetch_array($res, MYSQL_ASSOC), ups smile.gif Działa bez zarzutu.

EDIT: Przez PHP jest to chyba najpopularniejsza metoda wyciągania danych SQL SELECT.
Aplikacje zazwyczaj nie wyciągają 4000 czy 8000 rekordów z bazy prosto na stronę, lecz
filtrują i wyciągają te właściwe, u Ciebie np. autor na $litera i tylko źródła = $autor.

Ten post edytował HellRider 20.10.2008, 05:25:33
Go to the top of the page
+Quote Post
zwieracz
post 20.10.2008, 11:48:49
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


poprawiłem funkcję na mysql_fetch_array($res, MYSQL_ASSOC) i śmiga winksmiley.jpg

Chodzi mi o ilość zapytań do bazy - proszę mi powiedzieć czy dobrze myślę:
są dwa zapytania $res i $res2
zapytanie $res2 jest wykonywane w pętli "while" czyli ile wyników zwróci zapytanie $res tyle razy będzie wykonywane zapytanie $res2
czyli zapytań do bazy będzie bardzo dużo?? Czy nie zablokuje mi to serwera baz danych na jakimś tam wirtualnym hostingu gdzie mam podwieszone jeszcze inne skrypty które odpytują bazę??
Go to the top of the page
+Quote Post
HellRider
post 20.10.2008, 14:01:36
Post #7





Grupa: Zarejestrowani
Postów: 57
Pomógł: 7
Dołączył: 12.09.2008
Skąd: localhost

Ostrzeżenie: (0%)
-----


Jeżeli szukasz na literę "a" i masz trzech autorów, każdy autor ma 5 źródeł to wykona się to tyle razy:
(3 x autor)
x
(5 x źródło)
----
15 // Prosta matematyka.

Hm, czy zablokuje, nie powinno, fora, takie jak forum.php.pl, wykonują kilka zapytań na jedno odświeżenie strony,
pomnóż to razy ilość odświeżeń na minutę w godzinach szczytu, IP.Board potrafi generować masę zapytań, a wiele for śmiga elegancko smile.gif
To przykład, musisz dowiedzieć się jakie możliwości ma Twój serwer oraz jakie restrykcje nakłada, ale nie panikuj,
bo jak serwer MySQL Ci przy tych dwóch while nie wytrzyma, to zmień serwer.

Ten post edytował HellRider 20.10.2008, 14:02:05
Go to the top of the page
+Quote Post
zwieracz
post 20.10.2008, 14:31:16
Post #8





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


No tak ale ja mam 30 autorów na a, każdy z nich ma po 5-10 źródeł czyli może być do 300 zapytań na jedno odświeżenie strony.
do tego nosiłem się z zamiarem żeby w ten sam sposób zrobić pobieranie tagów do każdego autora i tu też będzie dużo zapytań, czyli dochodzi następne 300.
Pytam dlatego że parę razy już serwer baz wyrzucił mi komunikat że nie jest dostępny. a do tej pory pracowało tam parę serwisów na joomli i oscommerce całość ok 1k uu dziennie i nie było problemów (większych winksmiley.jpg )
Go to the top of the page
+Quote Post
golaod
post 20.10.2008, 16:01:33
Post #9





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Słuchaj to jak już się tak bawisz w słuchanie wyżej wypowiadających się panów to ja polecam na każdą kolumnę zrobić osobne zapytania...
  1. <?php
  2. $select = "SELECT * FROM xxx WHERE autor LIKE '".mysql_escape_string(trim(substr($_GET['letter'],0,1)))."%' "; //w końcu jak litera to litera i zabezpieczyć to też trzeba, po drugie jak coś na końcu możesz dodać LIMIT param1,param2  i się pobawić w podstrony
  3. // teraz podczas wywalania na ekran:
  4. $tmp_autor = '';
  5. $selectid = mysql_query($select) or die(mysql_error());
  6. while($wynik = mysql_fetch_array($selectid,MYSQL_ASSOC))
  7. {
  8.  if($tmp_autor!= $wynik['autor'])
  9.  {
  10.    #i tu tworzysz oddzielenie dla nowego autora ktorego wypisujesz tylko raz
  11.  }
  12.  #a tu wyswietlasz reszte rzeczy
  13. }
  14. ?>

Tym sposobem zapytanie jedno.
Go to the top of the page
+Quote Post
zwieracz
post 20.10.2008, 21:53:39
Post #10





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


goload:

Cytat
#i tu tworzysz oddzielenie dla nowego autora ktorego wypisujesz tylko raz

Sęk w tym że nie wiem jak wypisać raz danego autora (wcześniej załatwiałem to poprzez "DISTINCT")

Cytat
#a tu wyswietlasz reszte rzeczy

A tu pewnie jak wyżej

Dzięki za notkę o bezpieczeństwie
Go to the top of the page
+Quote Post
golaod
post 21.10.2008, 09:12:06
Post #11





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Rozumiem, że troszkę u Ciebie słabo z rozeznaniem w temacie. Nie wiem tylko czy zauważyłeś ale napisałem Ci jako takie rozwiązanie. Czyli jedno zapytanie i jak je wyświetlać. Skoro masz jednak problem, zrobię to jeszcze raz.

  1. <?php
  2. #swiadomie nie pisze polaczenia z baza i wybraniu bazy bo to chyba oczywiste prawda ?
  3. $select = "SELECT * FROM xxx WHERE LIKE '".mysql_escape_string(trim(substr($_GET['letter'],0,1)))."%' ORDER BY autor ASC"; #lub DESC jak kto woli
  4. $selectid = mysql_query($select) or die(__LINE__.mysql_error();
  5. $autor_aktualny = '';
  6. while($wiersz = mysql_fetch_array($selectid,MYSQL_ASSOC)
  7. {
  8.  if($wiersz['autor']!=$autor_aktualny)
  9. {
  10.    echo 'Autor: '.$autor_aktualny.' jego dziela:<br />';
  11.    echo $wiersz['dzielo'];
  12.    $autor_aktualny = $wiersz['autor'];
  13.  }
  14.  else
  15.    echo ','.$wiersz['dzielo'];
  16. }
  17. ?>

No chyba to juz wystarczajaca ilosc kodu prawda ? zmien tylko wiersz['dzielo'] na odpowiedni dla Twojej kolumny z dzielem.
Go to the top of the page
+Quote Post
zwieracz
post 21.10.2008, 20:25:35
Post #12





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 17.10.2008

Ostrzeżenie: (0%)
-----


golaod:
Cytat
Rozumiem, że troszkę u Ciebie słabo z rozeznaniem w temacie.

Wiadomo, tak sobie kombinuję trochę.


Myślałem że już sobie poradzę ale jednak nie. Zastosowałem ten algorytm który podałeś w ostatnim poście (z drobną zmianą bo pierwszy wiersz był pusty - zadziałało przesunięcie tego
  1. <?php
  2. $autor_aktualny = $wiersz['autor'];
  3. ?>
na początek pętli if

Wydawało mi się że żeby wyświetlić dane źródło tylko raz; zastosuję sposób który podałeś mi na tacy przy wyświetlaniu raz danego autora - jednak z kolumną autor to się udało bo jest ona sortowana ASC i autorzy są po kolei - kolumna źródło jednak jest posortowana według kolumny autor i ten sam sposób jednak nie wychodzi.

Może jakaś wskazówka? please. hmm może jak posortować kolumnę source by wyświetlić raz dane źródło w ten sam sposób jak "autora" - a może zupełnie inaczej?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 13:17