Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> zmienna, obliczana w trakcie jako wartość w tabeli MySQL
Forti
post
Post #1





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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


Ten post edytował Forti 19.05.2014, 13:25:27
Go to the top of the page
+Quote Post
markonix
post
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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?
Go to the top of the page
+Quote Post
Forti
post
Post #3





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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. ?>
Go to the top of the page
+Quote Post
markonix
post
Post #4





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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ć).
Go to the top of the page
+Quote Post
Forti
post
Post #5





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 12:19