Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Nie pobiera pierwszego wyniku z tabeli
MeTeorek
post 29.03.2012, 10:35:45
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 2.02.2008

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


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

Ten post edytował MeTeorek 29.03.2012, 10:38:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Sephirus
post 29.03.2012, 10:57:34
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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));


Ten post edytował Sephirus 29.03.2012, 11:01:32


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Rysh
post 29.03.2012, 11:00:43
Post #3





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


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.

Ten post edytował Rysh 29.03.2012, 11:05:19


--------------------
Go to the top of the page
+Quote Post
MeTeorek
post 29.03.2012, 11:09:33
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 2.02.2008

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


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!
Go to the top of the page
+Quote Post
Rysh
post 29.03.2012, 11:11:11
Post #5





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


No widzisz, głupi błąd a do bazy trafiało za każdym jedno zapytanie więcej smile.gif


--------------------
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: 14.08.2025 - 08:06