Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmienna, obliczana w trakcie jako wartość w tabeli MySQL
Forum PHP.pl > Forum > PHP
Forti
Witam.

Mam pewien problem, otóż posiadam kod, który pobiera pewne dane z plików json z zewnętrznych serwerów.

  1. diablo_api_url = "http://eu.battle.net/api/d3/profile/{$myrow['nazwa']]}-{$myrow['numer']}/";
  2. $diablo_json = file_get_contents($diablo_api_url);
  3. $character_info = json_decode($diablo_json);
  4. $paragon_level = $character_info->paragonLevel;
  5. $class = $character_info->heroes[0]->class;
  6. $h_level = $character_info->paragonLevelHardcore;
  7. $elite = $character_info->kills->elites;
  8.  
  9. $punktacja_totalna = $paragon_level + $h_level + $elite;
  10. settype($punktacja_totalna, "integer");



Kod wyświetlający wygląda tak:

  1. $result = mysql_query("SELECT * FROM sklad ORDER BY punktacja_totalna DESC",$connect);
  2. mysql_query("SET NAMES 'utf8'");
  3. while($myrow = mysql_fetch_assoc($result))
  4. {
  5. }


chce aby $punktacja_totalna była pobierana z bazy danych, obliczana automatycznie i następnie wyświetlana od największej do najmniejszej.

Próbowałem kilku sposobów jednak bezskutecznie.

Czy taki sposób jest prawidłowy:
  1. $punktacja_totalna = mysql_real_escape_string($myrow['punktacja_totalna']);
markonix
Osobiście nie rozumiem co ma jedno do drugiego.

Najpierw piszesz skąd masz dane, dokładniej skąd masz punkty.
Jakie to ma znaczenie dla problemu skoro (tak mi się wydaje) masz już te punkty w tabeli sklad?
Forti
Mam punktu wyliczone na podstawie tego kodu, jednak chce posortować wyniki while wg. tych że punktów. Dlatego chce aby rekord w tabeli 'sklad' był właśnie tą zmienną, ewentualnie robimy tak: wyliczamy punktacja_totalna -> zamieniamy ją na rekord tabeli -> wywołujemy. Tylko jak to zrobić - z tym mam problem.

Kod który do tej pory zrobiłem:


  1. <?php
  2.  
  3.  
  4. include("config.php");
  5.  
  6.  
  7.  
  8. $result = mysql_query("SELECT * FROM sklad ORDER BY punktacja_totalna DESC",$connect);
  9.  
  10. while($myrow = mysql_fetch_assoc($result))
  11. {
  12.  
  13.  
  14.  
  15. $nazwa=$myrow['nazwa'];
  16. $numer=$myrow['numer'];
  17.  
  18.  
  19. $diablo_api_url = "http://eu.battle.net/api/d3/profile/{$nazwa}-{$numer}/";
  20. $diablo_json = file_get_contents($diablo_api_url);
  21. $character_info = json_decode($diablo_json);
  22. $paragon_level = $character_info->paragonLevel;
  23. $class = $character_info->heroes[0]->class;
  24. $h_level = $character_info->paragonLevelHardcore;
  25. $elite = $character_info->kills->elites;
  26. $suma = $paragon_level ; // wiem że ta linijka jest bezsensu, jest tutaj pewne działanie matematyczne którego nie chce zdradzać
  27. $ssuma = $h_level ;
  28. $sssuma = $elite ;
  29. $ssssuma = $myrow['achiv'] ;
  30. $punktacja_totalna = $suma + $ssuma + $sssuma + $ssssuma;
  31. settype($punktacja_totalna, "integer");
  32.  
  33. // i tutaj trzeba $punktacja_totalna wrzucić do bazy danych a następnie wyniki sortować wg. tego rekordu, jeżeli dobrze rozumiem.
  34.  
  35. ?>



kod wyświetla się prawidłowo wszelkie zmienne, tylko trzeba go odpowiednio posortować.

może inaczej, mam cały kod poniżej. Obecnie wyniki sortują się wg. wyników z bazy MySQL (w tym przypadku 'achiv'), a chce by sortowały się wg. zmiennej $punktacja_totalna.

Rozumiem, że muszę całkowicie przerobić pętlę while - obecnie nie potrzebnie pobieram w ten sposób dane. Mogę je pobrać, wyniki wrzucić w tablicę
  1. $tablica[1]['nazwa']
tylko nie bardzo wiem jak to zrobić.

  1. <?php
  2. include("config.php");
  3.  
  4.  
  5.  
  6.  
  7. $result = mysql_query("SELECT * FROM sklad ORDER BY achiv DESC",$connect);
  8.  
  9. while($myrow = mysql_fetch_assoc($result))
  10. {
  11.  
  12.  
  13.  
  14. $nazwa=$myrow['nazwa'];
  15. $numer=$myrow['numer'];
  16.  
  17.  
  18. $diablo_api_url = "http://eu.battle.net/api/d3/profile/{$nazwa}-{$numer}/";
  19. $diablo_json = file_get_contents($diablo_api_url);
  20. $character_info = json_decode($diablo_json);
  21. $paragon_level = $character_info->paragonLevel;
  22. $class = $character_info->heroes[0]->class;
  23. $h_level = $character_info->paragonLevelHardcore;
  24. $elite = $character_info->kills->elites;
  25. $suma = $paragon_level; // wiem że ta linijka jest bezsensu, jest tutaj pewne działanie matematyczne którego nie chce zdradzać.
  26. $ssuma = $h_level;
  27. $sssuma = $elite;
  28. $ssssuma = $myrow['achiv'];
  29. $punktacja_totalna = $suma + $ssuma + $sssuma + $ssssuma;
  30. settype($punktacja_totalna, "integer");
  31.  
  32.  
  33.  
  34. ?>
  35.  
  36. <div id="gen0"><hr size="1"></div>
  37. <div id="kontakt1">
  38. <div id="pole1"><div><b>nice Score</b></div><div id="p3"><?= $punktacja_totalna ?></div></div>
  39. <div id="pole1"><div>Battle Tag</div><div id="p1"><?= $nazwa ?>#<?= $numer ?></div></div>
  40. <div id="pole1"><div>Paragon Level</div><div id="p3"><?= $paragon_level ?></div></div>
  41. <div id="pole1"><div>Hardcore plvl</div><div id="p3"><?= $h_level ?></div></div>
  42. <div id="pole1"><div>Zabitych Elit</div><div id="p3"><?= $elite ?></div></div>
  43. </div>
  44.  
  45. <?php
  46.  
  47.  
  48.  
  49. }
  50.  
  51.  
  52.  
  53. ?>
markonix
Oki, chyba rozumiem.

Dwie opcje:

1) Zapisujesz do to bazy, czyli robisz pętlę po składzie i aktualizujesz każdemu liczbę punktów. Potem już mając to w bazie proste ORDER BY. Jedyny minus to że wykonujesz 2 razy te samo zapytanie.
2) Tworzysz tablice z wyniku z bazy, do tablicy dodajesz wartość punktów i potem korzystasz z funkcji sortujących po wartości http://stackoverflow.com/questions/1597736...iven-key-in-php
Ewentualnie liczbę punktów ładujesz w index albo to brzydko by wyglądało.

W pierwszej opcji można pokusić się o cache - w zależności od tego jak często liczba punktów się zmienia, nie za każdym razem aktualizować te punkty.
Unikniesz też dużej liczby requestów do strony battle netu (mogą np. Cię zablokować).
Forti
Szczerze powiem, że walcze z tym od kilku dni już.

Dla każdej zmiennej muszę robić inną tablice? Chyba muszę wrócić do podstaw, sam tego nie napisze smile.gif

Zrobiłem coś takiego (kod poniżej). Działa fajnie, jednak wszystkie polade [punkt] zostają zapisane ostatnią otrzymaną wartością $punktacja_totalna.
Domyślam się że, po

  1. UPDATE sklad SET punkt='$punktacja_totalna'

powinien znaleźć się jakiś warunek..

  1. <?php
  2. include("config.php");
  3.  
  4.  
  5.  
  6.  
  7.  
  8. $result = mysql_query("SELECT * FROM sklad ORDER BY punkt DESC",$connect);
  9.  
  10.  
  11. while($myrow = mysql_fetch_assoc($result))
  12. {
  13.  
  14.  
  15.  
  16. $nazwa=$myrow['nazwa'];
  17. $numer=$myrow['numer'];
  18.  
  19.  
  20. $diablo_api_url = "http://eu.battle.net/api/d3/profile/{$nazwa}-{$numer}/";
  21. $diablo_json = file_get_contents($diablo_api_url);
  22. $character_info = json_decode($diablo_json);
  23. $paragon_level = $character_info->paragonLevel;
  24. $class = $character_info->heroes[0]->class;
  25. $h_level = $character_info->paragonLevelHardcore;
  26. $elite = $character_info->kills->elites;
  27. $suma = $paragon_level;
  28. $ssuma = $h_level;
  29. $sssuma = $elite;
  30. $ssssuma = $myrow['achiv'];
  31. $punktacja_totalna = $suma + $ssuma + $sssuma + $ssssuma;
  32. settype($punktacja_totalna, "integer");
  33.  
  34.  
  35.  
  36.  
  37.  
  38. $a = mysql_query("UPDATE sklad SET punkt='$punktacja_totalna' ",$connect);
  39.  
  40. echo $myrow['punkt'] ;
  41.  
  42. }
  43.  
  44.  
  45. ?>



Wiem że obecnie kod wykonuje bardzo dużo zapytać, postaram się ogarnąć cache w późniejszym czasie - wyniki mogą aktualizować się raz na 1-2 dni, to nie przeszkadza.

Rozwiązałem, dałem zmienna:

  1. $newsid=$myrow['newsid'];


a w linie UPTADE warunek: newsid='$newsid' (przypisywane automatycznie każdej kolumnie).




można zamknąć temat.
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.