Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] wstecz - dalej (ID i USER)
Forum PHP.pl > Forum > PHP
fr33d0m
Od 3 godziny nad tym siedzę i chyba nie dam rady sam tego sprostować tak aby pewnie działało (pewnie - bo ogólnie działa).
Chodzi o to, że chcę zrobić płynne cofanie i wybieranie kolejnego profilu z danymi. Za pomocą $_GET['user'] korzystam do wczytywania danych (np. $WezGet['imie']) a za pomoca $_GET['id'] wyciagam aktualne ID i za jego pomocą szukam po bazie danych. Wzór poniżej działa, ale nie jest zsynchronizowany i ID zawsze jest o jedno większe niż USER powinien mieć. Jak temu zaradzić? jak poprawnie to ze sobą zsynchronizować questionmark.gif ja już nie daje rady... idę po kawę sad.gif
  1. <?php
  2. $WezId=filtr($_GET["id"]); //pobiera ?id=
  3. $WezPseudo = mysql_fetch_array(mysql_query("SELECT pseudo FROM dane WHERE id ='$WezId' LIMIT 1")); //pobiera pseudo po ?id=
  4. $WezProfil = mysql_fetch_array(mysql_query("SELECT * FROM dane WHERE id ='$WezId' LIMIT 1")); //pobiera cokolwiek po ?id=
  5. $IdDalej = mysql_result(mysql_query("SELECT MIN(id) FROM dane WHERE id > '$WezId'"),0);
  6. $IdWstecz = mysql_result(mysql_query("SELECT MAX(id) FROM dane WHERE id < '$WezId'"),0);
  7. $WezUser = filtr($_GET["user"]); //pobiera ?user=
  8. $WezGet = mysql_fetch_array(mysql_query("SELECT * FROM dane WHERE pseudo ='$WezUser' LIMIT 1")); //pobiera cokolwiek po ?user=
  9. ?>
  10. <a href="<?php echo $adresHTTP ?>/profil.php?user=<?php echo $WezPseudo['pseudo']; ?>&id=<?php echo $IdWstecz; ?>">prev</a>
  11. <a href="<?php echo $adresHTTP ?>/profil.php?user=<?php echo $WezPseudo['pseudo']; ?>&id=<?php echo $IdDalej; ?>">next</a>
CuteOne
Po pierwsze: pięć zapytań do jednej tabeli o.0 poczytaj jak optymalizować zapytania...
Po drugie: "SELECT MIN(id) FROM dane WHERE id > '$WezId'" co jest...

  1. $select = mysql_query("SELECT id FROM dane WHERE id = '{$WezId}'");
  2.  
  3. if(mysql_num_rows($select)) {
  4.  
  5. $row = mysql_fetch_array($select);
  6.  
  7. echo '<a href="'.$adresHTTP.'/profil.php?user='.$WezPseudo['pseudo'].'&id='.($row['id']+1).'>prev</a>';
  8. }
fr33d0m
Przykład oczywiście działa, tylko co w przypadku gdy ID to losowa liczba z 7 znaków questionmark.gif dlatego próbowałem stosować coś takiego aby pobierało kolejne ID
  1. $IdDalej = mysql_result(mysql_query("SELECT MIN(id) FROM dane WHERE id > '$WezId'"),0);
  2. $IdWstecz = mysql_result(mysql_query("SELECT MAX(id) FROM dane WHERE id < '$WezId'"),0);


Twój przykład ma też taki minus, że gdy będzie przeskok z ID do kolejnego ID którego nie będzie (np. 241->242(usunięty)->243->244...) to wszystko się posypie - zniknie... tak samo w przypadku gdy ID osiągnie swoje maksimum +1.

Jakieś propozycje? czy wymagam zbyt wiele od PHP i SQL ?

edit: znalazłem kolejny rażący błąd w Twoim przykładzie.
Jeśli ID=245(user: aaaa) i klikniemy na "następny" to będzie 246(user:bbbb) - ale jeśli teraz klikniemy dwa razy na "wstecz" pokażę nam się coś takiego: ID=245(user:aaaa) -> ID=244(user: bbbb) - ten błąd występuje jednokrotnie przy dodawaniu i odejmowaniu.

Can anybody help me?
CuteOne
Cytat
Przykład oczywiście działa, tylko co w przypadku gdy ID to losowa liczba z 7 znaków dlatego próbowałem stosować coś takiego aby pobierało kolejne ID

Może mieć 150 znaków i jeżeli istnieje w bazie to ją pobierze.

Hmmm nigdy nie miałem podobnego problemu smile.gif najszybszym [chociaż najmniej wydajnym] rozwiązaniem było by pobrać całą bazę i sprawdzić
  1. while($wezid = mysql_fetch_array($selectid)) {
  2. if($wezid['id'] == $WezId) {}
  3. }


innym rozwiązaniem, może być:
  1. $wtyl= mysql_query("SELECT id FROM dane WHERE id < '$wezid' ORDER BY id DESC");
  2. $wprzod= mysql_query("SELECT id FROM dane WHERE id > '$wezid' ORDER BY id ASC");

Nie mam gdzie tego sprawdzić więc ewentualnie musiałbyś trochę to przerobić smile.gif

fr33d0m
Cytat(CuteOne @ 24.10.2010, 20:25:42 ) *
Może mieć 150 znaków i jeżeli istnieje w bazie to ją pobierze.


No nie bardzo, ponieważ przykład wcześniej podałeś PLUS 1 do wyniku a kolejne ID było losowe, a nie o 1 większe tongue.gif
  1. echo '<a href="'.$adresHTTP.'/profil.php?user='.$WezPseudo['pseudo'].'&id='.($row['id']+1).'>prev</a>';


Kolejny przykład przetestowałem... iiii... działa, ale z takim samym bugiem jaki opisałem wyżej
Czyli ID jest zawsze o jedno mniejsze lub większe niż być powinno i występuje to co opisałem wyżej
Cytat
Jeśli ID=245(user: aaaa) i klikniemy na "następny" to będzie 246(user:bbbb) - ale jeśli teraz klikniemy dwa razy na "wstecz" pokażę nam się coś takiego: ID=245(user:aaaa) -> ID=244(user: bbbb) - ten błąd występuje jednokrotnie przy dodawaniu i odejmowaniu.


A pobieranie bazy nie bardzo wchodzi w rachubę ponieważ będzie ponad 3 tysiące userów a serwer mam wykupiony najtańszy w HOME lub bezpłatny 1and1, ale po tym drugim nie spodziewam się zachwycenia.

CuteOne, masz jeszcze jakieś pomysły?? myślę, że gdyby zrobić to poprzez AJAX to by poskutkowało bo pobierał by aktualne ID i wyświetlał aktualne - tylko nie wiem też jak się do tego zabrać i nawet nie wiem czy dobrze główkuje... Nikt inny pomóc nie chce, więc tylko w Tobie moja cała nadzieja winksmiley.jpg mnie logika SQL w tym wypadku przerasta sad.gif
CuteOne
$wtyl= mysql_query("SELECT id FROM dane WHERE id < '$wezid' ORDER BY id DESC");
$row = mysql_fetch_array($wtyl);

echo $row['id'] zwróci pierwszy wiersz [o największym id], którego wartość jest mniejsza od $wezid. Tak więc jeżeli $wezid = 200 a w bazie nie ma wiersza o id 199 skrypt pobierze wiersz o id = 198 [ a jeżeli nie ma i tego wiersza pobierze 197 itd.]

ps. 3 tysiące rekordów to naprawdę niewiele smile.gif na moim domowym PC pobranie do tablicy 700 tysięcy rekordów i wybranie z pośród nich 200 losowych zajmuje ~0.03 sek
fr33d0m
Przy cofaniu:
$GET(ID)=8 pobiera ID z DB=9
$GET(ID)=7 pobiera ID z DB=8
$GET(ID)=6 pobiera ID z DB=7

Przy dodawaniu:
$GET(ID)=8 pobiera ID z DB=7
$GET(ID)=9 pobiera ID z DB=8
$GET(ID)=10 pobiera ID z DB=9

Teraz załóżmy, że cofnęliśmy o 5 profili wstecz i chcemy zmienić kierunek szukania w przód:
Jeśli jest $GET(ID)=5 a załadowane ID z DB ID=6 i klikniemy 2 razy na następny profil (kolejne ID), wyjdzie coś takiego:
$GET(ID)=6 pobiera ID z DB=5 (1 kliknięcie)
$GET(ID)=7 pobiera ID z DB=6 (2 kliknięcie)

Co w efekcie prowadzi do bugu z powtórzeniem ID i tylko(albo aż) w tym problem, ogólnie skrypt hula tak jak powinien.
Da się temu zapobiec questionmark.gif

edit:
Myślę, że z 3 tysięcy userów będzie około 400 dziennie zalogowanych przynajmniej przez 10 minut. Zmiana profilu to nie jedyne zapytanie DB w moim portalu a tańsze serwery płatnych firm, nie są aż tak wydajne jak by się chciało...
CuteOne
Chyba masz coś zwalone w skrypcie... każde kliknięcie powoduje odświeżenie strony z podanym parametrem (ID). Czyli:

Jedno kliknięcie wstecz z ID=5 pobierze z bazy ID=4
Dwa kliknięcia wstecz to tak naprawdę jedno wstecz + jedno wstecz- kolejno z ID=5 pobierze z bazy ID=4, potem ID=4 pobierze z bazy ID=3

Tak powinno działać wstecz i wprzód. Wiec przykład "idziemy wprzód o 3 profili i zmieniamy kierunek" to:: wprzód+wprzód+wprzód+wstecz
bmL
Sprawdź lepiej czy jakieś cache nie działa tutaj na szkodę albo coś bo to co opisałeś jest niemożliwe...
Cytat
$GET(ID)=8 pobiera ID z DB=9
ja się pytam jakim cudem?

ps. zauważyłem że używasz
  1. <?php echo $adresHTTP ?>
też kiedyś tak robiłem ale przerzuciłem się na
  1. <base href="<?php echo $adresHTTP ?>" />
które jest o wiele przyjemniejsze.
fr33d0m
Dziękuje Panowie - zwłaszcza Tobie CuteOne za wytrwałość smile.gif
Faktycznie błąd tkwi w skrypcie, dokładnie w tej linijce:
  1. $WezPseudo = mysql_fetch_array(mysql_query("SELECT pseudo FROM dane WHERE id ='$WezId' LIMIT 1")); //pobiera pseudo po ?id=

a taki mam skrypt:
  1. $DalejId = mysql_query("SELECT id FROM dane WHERE id > '$WezId' ORDER BY id ASC");
  2. if(mysql_num_rows($DalejId))
  3. {
  4. $row = mysql_fetch_array($DalejId);
  5. echo '<a href="'.$adresHTTP.'/profil.php?user='.$WezPseudo['pseudo'].'&id='.($row['id']).'">next</a>';
  6. }


Za pomocą USER= wyświetlałem dane z DB, więc to $WezPseudo opóźniało mi ID - ja skupiłem się wyłącznie na ID pomijając nie oczekiwane kolizje jak ta powyżej blink.gif
Zmieniłem to tak jak poniżej i działa perfekcyjnie smile.gif
  1. $WsteczId = mysql_query("SELECT id, pseudo FROM dane WHERE id < '$WezId' ORDER BY id DESC");
  2. if(mysql_num_rows($WsteczId))
  3. {
  4. $row = mysql_fetch_array($WsteczId);
  5. echo '<a href="'.$adresHTTP.'/profil.php?user='.$row['pseudo'].'&id='.($row['id']).'">next</a>';
  6. }


Pozdrawiam biggrin.gif


edit:
@bmL,
Dla mnie dużo przyjemniejsze jest moje rozwiązanie i myślę, że wydajnościowo niczym się nie różni smile.gif


Jeszcze jedno pytanko dot. wydajności.
Chce aby po wpisaniu samego pseudonimu w przeglądarce, dodawał się ID danego usera z $_GET['user']
dla przykładu coś takiego:
adres.pl/profil.php?user=UserNumber5 -> daje -> adres.pl/profil.php?user=UserNumber5&id=5
Zrobiłem w ramach tego coś takiego i działa, ale czy można to jakoś wydajniej skonstruowaćquestionmark.gif
  1. $WezUser = filtr($_GET['user']); //pobiera ?user=
  2.  
  3. $WezIdHeader = mysql_fetch_array(mysql_query("SELECT id FROM dane WHERE pseudo ='$WezUser' LIMIT 1"));
  4. if($WezUser == true)
  5. {
  6. header("Location: ./profil.php?user=".$WezUser."&id=".$WezIdHeader['id']."");
  7. }
bmL
Cytat(fr33d0m @ 27.10.2010, 17:19:56 ) *
edit:
@bmL,
Dla mnie dużo przyjemniejsze jest moje rozwiązanie i myślę, że wydajnościowo niczym się nie różni smile.gif
[/php]

Wybacz że odświeżę naleśnika ale różni się może nie w linkach ale jak będziesz np. wstawiał style albo skrypty używając stałej URL to będziesz miał niepotrzebne przejścia przez serwer DNS smile.gif
Możesz to zobaczyć w firebugu smile.gif
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.