Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Nie pobiera pierwszego wyniku z tabeli
Forum PHP.pl > Forum > Przedszkole
MeTeorek
Witam,

Jestem amatorem i kod który napisałem z pewnością do najlepszych nie należy, lecz do tej pory z takim problemem się nie spotkałem.

Do rzeczy: Mam prosty skrypcik, który pobiera dane z kilku tabel, aktualizuje je, do niektórych coś dodaje, jedną usuwa. Generalnie skrypt działa, wszystko się wykonuje, tak jak powinno, tyle że pomija pierwszy wiersz z bazy danych. Próbowałem już kilku kombinacji, ale nic z tego. Problem na pewno nie leży w skrypcie który zapisuje dane w tej tabeli, tylko już w docelowym - pobierającym go.

By ułatwić zrozumienie kodu:
- skrypt wyświetla w liście mini formularze, na podstawie tabeli 'dzialka', po kliknięciu [zatwierdz] wykonuje kod.

Nie wiem, czy to co napisałem jest jasne, więc wersja obrazkowa:

Tak wygląda skrypt w działaniu:


Tak wygląda zawartość bazy:


a tak jest ustawiona tabela


Jak widać pobiera 2 na 3 wyniki. Manipulacja "DESC" - "ASC" w zapytaniu, zmienia tylko tyle, że albo nie wyświetla pierwszego albo ostatniego wyniku.

oto kod:
  1. <?
  2. $dzialka = mysql_query("SELECT * FROM dzialka WHERE `status`='0' ORDER BY `id` DESC LIMIT 10") or die('Błąd zapytania o dzialki');
  3. $dzia = mysql_fetch_assoc ($dzialka);
  4. $gracz = mysql_query("SELECT * FROM permissions_inheritance WHERE `child`='".$dzia['nick']."'") or die('Błąd zapytania o gracza');
  5. $gracz = mysql_fetch_assoc ($gracz);
  6.  
  7. if(isset($_POST['ok'])) {
  8.  
  9.  
  10. //TEN FRAGMENT WYKONUJE SIE DOPIERO POZNIEJ, WIEC NIE MA ON ZNACZENIA, A BY TYLKO ZASMIECAL//
  11.  
  12. }
  13. while ($dzial = mysql_fetch_assoc($dzialka)) {
  14.  
  15. <fieldset><b>Nick gracza:</b> ".$dzial['nick']."<br>
  16. <b>Coordy:</b> x:".$dzial['min_x'].", z:".$dzial['min_z']." / x:".$dzial['max_x'].", z:".$dzial['max_z']." <br>
  17. <form action='' method='post'>
  18. <select name='stan'>
  19. <option value='1'>Akceptuj</option>
  20. <option value='0'>Odrzuc</option>
  21. </select><br>
  22. <input type='text' name='tekst'> - wypełnij jeśli odrzucasz wniosek <br>
  23. <input type='hidden' name='id' value='".$dzial['id']."'/>
  24. <input type='hidden' name='nick' value='".$dzial['nick']."'/>
  25. <input type='hidden' name='mx' value='".$dzial['min_x']."'/>
  26. <input type='hidden' name='mz' value='".$dzial['min_z']."'/>
  27. <input type='hidden' name='mxx' value='".$dzial['max_x']."'/>
  28. <input type='hidden' name='mxz' value='".$dzial['max_z']."'/>
  29. <input type='submit' value='Zatwierdz' name='ok'/>
  30. </form></fieldset><br>
  31. ";
  32.  
  33. }
  34.  
  35.  
  36. ?>


Mogę ten błąd w sposób sztuczny generalnie pominąć, ale będzie to nieeleganckie :)


Z góry dziękuję za pomoc
Sephirus
Używasz funkcji mysql_fetch_assoc przed pętlą while... zatem

jesli baza zwraca trzy rekordy to :

mysql_fetch_assoc - pierwsze wywołanie (1szy rekord jest zdjęty ze "stosu")

potem mamy while:

mysql_fetch_assoc - pobiera 2
mysql_fetch_assoc - pobiera 3

koniec...

  1. <?
  2. $dzialka = mysql_query("SELECT * FROM dzialka WHERE `status`='0' ORDER BY `id` DESC LIMIT 10") or die('Błąd zapytania o dzialki');
  3. $dzia = mysql_fetch_assoc ($dzialka); // W TYM MIEJSCU JEST POBIERANY PIERWSZY REKORD
  4. $gracz = mysql_query("SELECT * FROM permissions_inheritance WHERE `child`='".$dzia['nick']."'") or die('Błąd zapytania o gracza');
  5. $gracz = mysql_fetch_assoc ($gracz);
  6.  
  7. if(isset($_POST['ok'])) {
  8.  
  9.  
  10. //TEN FRAGMENT WYKONUJE SIE DOPIERO POZNIEJ, WIEC NIE MA ON ZNACZENIA, A BY TYLKO ZASMIECAL//
  11.  
  12. }
  13. while ($dzial = mysql_fetch_assoc($dzialka)) { // TU IDĄ DALSZE REKORDY od 2 do końca


ROZWIĄZANIE:

Zamień pętle WHILE na DO...WHILE

  1. do {
  2. //twój kod...
  3. } while ($dzial = mysql_fetch_assoc($dzialka);


i zmień w kodzie przy pierwszym wywołaniu mysql_fetch_assoc nazwe zmiennej $dzia na $dzial wink.gif

czyli:

  1. <?
  2. $dzialka = mysql_query("SELECT * FROM dzialka WHERE `status`='0' ORDER BY `id` DESC LIMIT 10") or die('Błąd zapytania o dzialki');
  3. $dzial = mysql_fetch_assoc ($dzialka);
  4. $gracz = mysql_query("SELECT * FROM permissions_inheritance WHERE `child`='".$dzial['nick']."'") or die('Błąd zapytania o gracza');
  5. $gracz = mysql_fetch_assoc ($gracz);
  6.  
  7. if(isset($_POST['ok'])) {
  8.  
  9.  
  10. //TEN FRAGMENT WYKONUJE SIE DOPIERO POZNIEJ, WIEC NIE MA ON ZNACZENIA, A BY TYLKO ZASMIECAL//
  11.  
  12. }
  13. do {
  14. // kod...
  15. } while ($dzial = mysql_fetch_assoc($dzialka));
Rysh
Wydaje mi się, że jest to spowodowane wywołaniem dwa razy funkcji mysql_fetch_assoc, nie chce Cie wprowadzać w błąd ale od tego rozpocząłbym poszukiwania, poza tym reszta skryptu wydaje się ok. Zamiast dawać 2 zapytania do bazy mógłbyś walnąć 1.
MeTeorek
Oboje mieliście rację smile.gif Nie miałem pojęcia, że "mysql_fetch_assoc" może "zjeść" wyniki smile.gif

Przejrzałem kod po uwadze @Rysh i okazało się że linijki od 3 do 5 są zbędne smile.gif Wystarczyło je usunąć i problem też się rozwiązał.

Dziękuję za pomoc!
Rysh
No widzisz, głupi błąd a do bazy trafiało za każdym jedno zapytanie więcej 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.