Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]+[JS] Zapytanie SQL w JS, Ciągłe wywoływanie ostatniego zapytania...
peja1990
post
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Witam, piszę skrypt, który ma odpowiadać za zmianę języka witryny dla danego użytkownika serwisu (oparcie o adres IP dla gości) i mam pewien problem, gdyż mam do wyboru 3 języki (PL,EN,DE).
Chcę aby po kliknięciu w jedną z flag wysunęło się okienko w dolnym rogu witryny (pozycja fixed), gdzie pojawia się tekst o wyborze języka, informacja o ładowaniu języka itp.
To zrobiłem i działa bez zarzutu ale problem tkwi w tym, że do każdego skryptu dodałem zapytanie SQL, które ma update'ować rekord danego użytkownika np. gdy jego aktualny język to "pl", a kliknie w flagę angielską to zapytanie ma z'update'ować rekord dla jego IP w komórce "lang" z "pl->en".

Mój kod wygląda tak:
  1. <script type="text/javascript">
  2. // Język niemiecki
  3. $(document).ready(
  4. function() {
  5. $(".lang_de").click(
  6. function() {
  7. $(".popup").slideDown();
  8. setInterval(function() {
  9. $(".popup").slideUp();
  10. }, 6000);
  11. var sql = ['<?php mysql_query('UPDATE guests SET lang="de" WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"') or die (mysql_error()); ?>'];
  12. var contents = ['<?php echo $LANG['popup']['lang']['load']; ?>', '<?php echo $LANG['popup']['lang']['change']['de']; ?>'];
  13. var current = 0;
  14. setInterval(function() {
  15. document.getElementById('load_content').innerHTML = contents[current++];
  16. document.getElementById('load_sql').innerHTML = sql;
  17. }, 2000);
  18. setInterval(function() {
  19. parent.location='<?php $PHP_SELF; ?>';
  20. }, 8000);
  21. });
  22. });
  23. // Język angielski
  24. $(document).ready(
  25. function() {
  26. $(".lang_en").click(
  27. function() {
  28. $(".popup").slideDown();
  29. setInterval(function() {
  30. $(".popup").slideUp();
  31. }, 6000);
  32. var sql = ['<?php mysql_query('UPDATE guests SET lang="en" WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"') or die (mysql_error()); ?>'];
  33. var contents = ['<?php echo $LANG['popup']['lang']['load']; ?>', '<?php echo $LANG['popup']['lang']['change']['en']; ?>'];
  34. var current = 0;
  35. setInterval(function() {
  36. document.getElementById('load_content').innerHTML = contents[current++];
  37. document.getElementById('load_sql').innerHTML = sql;
  38. }, 2000);
  39. setInterval(function() {
  40. parent.location='<?php $PHP_SELF; ?>';
  41. }, 8000);
  42. });
  43. });
  44. // Język polski
  45. $(document).ready(
  46. function() {
  47. $(".lang_pl").click(
  48. function() {
  49. $(".popup").slideDown();
  50. setInterval(function() {
  51. $(".popup").slideUp();
  52. }, 6000);
  53. var sql = ['<?php mysql_query('UPDATE guests SET lang="pl" WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"') or die (mysql_error()); ?>'];
  54. var contents = ['<?php echo $LANG['popup']['lang']['load']; ?>', '<?php echo $LANG['popup']['lang']['change']['pl']; ?>'];
  55. var current = 0;
  56. setInterval(function() {
  57. document.getElementById('load_content').innerHTML = contents[current++];
  58. document.getElementById('load_sql').innerHTML = sql;
  59. }, 2000);
  60. setInterval(function() {
  61. parent.location='<?php $PHP_SELF; ?>';
  62. }, 8000);
  63. });
  64. });
  65. </script>
  66. <div class="top">
  67. <span class="line"></span>
  68. <div class="center">
  69. <div class="box">
  70. <ul class="left">
  71. <li class="log_webmail"><?php echo $LANG['top']['log_webmail']; ?></li>
  72. <li class="log_system"><?php echo $LANG['top']['log_system']; ?></li>
  73. </ul>
  74. <ul class="right">
  75. <li class="lang_de <?php if($GUEST['lang']=='de') {echo 'active';} ?>"></li>
  76. <li class="lang_en <?php if($GUEST['lang']=='en') {echo 'active';} ?>"></li>
  77. <li class="lang_pl <?php if($GUEST['lang']=='pl') {echo 'active';} ?>"></li>
  78. <li><?php echo $LANG['top']['change_lang']; ?></li>
  79. </ul>
  80. </div>
  81. </div>
  82. </div>
  83.  
  84. <div class="popup"><div class="bg"><?php echo $LANG['popup']['lang']['select'].$br.'<div id="load_content"></div>'.'<div id="load_sql"></div>'; ?></div></div>


Wszystko działa ładnie, lecz nie ważne którą flagę kliknę, zawsze wywoływane jest ostatnie zapytanie mySQL, w tym przypadku dla języka PL.
Dla przykładu: mój aktualny język to EN, klikam w DE, a skrypt i tak wywołuje zapytanie dla PL i zmienia mi język na PL a nie na DE.

Próbowałem to robić na wiele sposobów, lecz jeszcze nie udało mi się znaleźć odpowiedniego, dlatego piszę na forum mając nadzieję, że ktoś z Was mi pomoże (IMG:style_emoticons/default/smile.gif)

Za pomoc będę niezmiernie wdzięczny.
Za każdą odpowiedź daję "POMÓGŁ" !

Serdecznie pozdrawiam.
Kamil Dunaj.
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(peja1990 @ 22.09.2011, 13:57:37 ) *
Za każdą odpowiedź daję "POMÓGŁ" !

Uważaj lepiej z tym - łatwo możesz zarobić warna za takie praktyki. Oznaczenie "Pomógł" służy do oznaczania faktycznie pomocnych odpowiedzi, a nie każdych odpowiedzi.
Go to the top of the page
+Quote Post
peja1990
post
Post #3





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Dobrze mistrzu (IMG:style_emoticons/default/wink.gif)
A jesteś w stanie mi pomóc ?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ogólnie zachęcanie POMOGŁ jest żałosne.

Co do tematu:
1) Tworzysz 3 razy zmienną sql to pewnie ci się za każdym razem nadpisuje
2) Tworzysz w kodzie html zmienną sql, którą potem na serwerze wykonujesz... ałć... bez problemu mogę wykonać dowolne zapytanie na Twojej bazie

Do serwera powinieneś przekazywać tylko aktualnie kliknięty język. To wszystko. Zapytanie sql masz budować już po stronie serwera przed samym wykonaniem.

3) Bez sensu tworzysz x razy ten sam kod. Napisz jedną funkcję, która przyjmie parametry język i po sprawie.
Go to the top of the page
+Quote Post
peja1990
post
Post #5





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(nospor @ 22.09.2011, 14:08:28 ) *
Ogólnie zachęcanie POMOGŁ jest żałosne.

Co do tematu:
1) Tworzysz 3 razy zmienną sql to pewnie ci się za każdym razem nadpisuje
2) Tworzysz w kodzie html zmienną sql, którą potem na serwerze wykonujesz... ałć... bez problemu mogę wykonać dowolne zapytanie na Twojej bazie

Do serwera powinieneś przekazywać tylko aktualnie kliknięty język. To wszystko. Zapytanie sql masz budować już po stronie serwera przed samym wykonaniem.

3) Bez sensu tworzysz x razy ten sam kod. Napisz jedną funkcję, która przyjmie parametry język i po sprawie.


Dzięki, a jesteś w stanie przedstawić swoją propozycję tego skryptu ?
Go to the top of the page
+Quote Post
sunpietro
post
Post #6





Grupa: Zarejestrowani
Postów: 262
Pomógł: 26
Dołączył: 23.01.2009
Skąd: eZ Systems

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


Od siebie tylko dodam, że mieszanie kodu JS i PHP jest złą praktyką. Powinieneś mieć osobne pliki z obsługą JS i PHP.
Go to the top of the page
+Quote Post
peja1990
post
Post #7





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Super, a potrafisz to zrobić tak jak należy i żeby działało tak jak to opisałem ?

Może napisze ktoś przynajmniej jak zrobić z tego jedną funkcję i jak zainicjować wartość ID dla kodu php w JS.

Np: var sql = ['<?php mysql_query('UPDATE guests SET lang="TUTAJ WARTOŚĆ ID" WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"') or die (mysql_error()); ?>'];

Ten post edytował peja1990 22.09.2011, 14:17:58
Go to the top of the page
+Quote Post
Kużdo
post
Post #8





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Nadal nie zrozumiałeś. Po stronie przeglądarki nie powinno być żadnych zapytań mysql, kodów PHP itp, bo jest to niebezpieczne dla Twojego skryptu jak i całego serwera. Przez JS masz przesłać tylko i wyłącznie zmienną która informuje jakąś flagę kliknął user. Nic więcej. Reszta ma odbywać się po stronie serwera, tam gdzie nie ma nikt inny dostępu oprócz admina. Dodatkowo powinieneś filtrować tę zmienną czy aby na pewno zawiera to co planowałeś by zawierała. U ciebie są to dwuliterowe oznaczenia języków, więc możesz stworzyć tablicę zawierającą wszystkie dostępne języki i sprawdzać, czy przesłana zmienna znajduje się w tej tablicy, jeśli tak, to wszystko jest ok.
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #9





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


Ja osobiście zrobiłbym to tak:

  1. <ul class="right">
  2. <li class="lang_de <?php if($GUEST['lang']=='de') {echo 'active';} ?>" title="flaga"></li>
  3. <li class="lang_en <?php if($GUEST['lang']=='en') {echo 'active';} ?>" title="flaga"></li>
  4. <li class="lang_pl <?php if($GUEST['lang']=='pl') {echo 'active';} ?>" title="flaga"></li>
  5. <li><?php echo $LANG['top']['change_lang']; ?></li>
  6. </ul>


JQuery:
  1. $('li').click(function(){
  2. var a = $(this).attr("class");
  3. var b = $(this).attr("title");
  4. if(b=="flaga")
  5. {
  6. $.ajax({
  7. type: "POST",
  8. url: "zmiana_flag.php",
  9. data: "a=" + a,
  10. success: function(odpowiedz){
  11. alert(odpowiedz);
  12. },
  13. error: function(){
  14. alert("Błąd!");
  15. }
  16. });
  17. }
  18. });


zmiana_flag.php:
  1. <?
  2. require("dane_do_bazy_danych.php");
  3. //łączenie do mysql...
  4. $flaga = $_POST[a];
  5. $sql=mysql_query(...) or die(mysql_error());
  6.  
  7. if($sql){
  8. echo "ok";
  9. }
  10. // else nie potrzebny, w przypadku błędu zwróci go mysql_error()
  11. ?>


Ten post edytował kpt_lucek 22.09.2011, 19:51:10
Go to the top of the page
+Quote Post
Kużdo
post
Post #10





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Po prywatnej korespondencji z peja1990 wiem, że tam wcale nie trzeba żadnego AJAXa. Po kliknięciu w flagę strona po kilku sek odświeżała się, więc zmianę języka można obsłużyć przez zwykłego GETa/POSTa. Nie wiem nawet czy kod, który przedstawiłem pomoże temu userowi, bo sprawdzając jego stronę już na starcie raziły błędy HTML m.in. cała sekcja head znajdowała się body i to nie tak, że <head>(...)</head> było w body, tylko head było puste, a to co miało tam być, było w body...
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #11





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


Cytat(Kużdo @ 22.09.2011, 20:52:42 ) *
Po prywatnej korespondencji z peja1990 wiem, że tam wcale nie trzeba żadnego AJAXa. Po kliknięciu w flagę strona po kilku sek odświeżała się, więc zmianę języka można obsłużyć przez zwykłego GETa/POSTa. Nie wiem nawet czy kod, który przedstawiłem pomoże temu userowi, bo sprawdzając jego stronę już na starcie raziły błędy HTML m.in. cała sekcja head znajdowała się body i to nie tak, że <head>(...)</head> było w body, tylko head było puste, a to co miało tam być, było w body...

Ok, ale sposób przedstawiony przeze mnie zajmuje zdecydowanie mniej miejsca i komunikacja między MySQL odbywa się za pomocą odrębnego pliku php.
Go to the top of the page
+Quote Post
peja1990
post
Post #12





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(kpt_lucek @ 22.09.2011, 20:40:42 ) *
Ja osobiście zrobiłbym to tak:

  1. <ul class="right">
  2. <li class="lang_de <?php if($GUEST['lang']=='de') {echo 'active';} ?>" title="flaga"></li>
  3. <li class="lang_en <?php if($GUEST['lang']=='en') {echo 'active';} ?>" title="flaga"></li>
  4. <li class="lang_pl <?php if($GUEST['lang']=='pl') {echo 'active';} ?>" title="flaga"></li>
  5. <li><?php echo $LANG['top']['change_lang']; ?></li>
  6. </ul>


JQuery:
  1. $('li').click(function(){
  2. var a = $(this).attr("class");
  3. var b = $(this).attr("title");
  4. if(b=="flaga")
  5. {
  6. $.ajax({
  7. type: "POST",
  8. url: "zmiana_flag.php",
  9. data: "a=" + a,
  10. success: function(odpowiedz){
  11. alert(odpowiedz);
  12. },
  13. error: function(){
  14. alert("Błąd!");
  15. }
  16. });
  17. }
  18. });


zmiana_flag.php:
  1. <?
  2. require("dane_do_bazy_danych.php");
  3. //łączenie do mysql...
  4. $flaga = $_POST[a];
  5. $sql=mysql_query(...) or die(mysql_error());
  6.  
  7. if($sql){
  8. echo "ok";
  9. }
  10. // else nie potrzebny, w przypadku błędu zwróci go mysql_error()
  11. ?>


Super mistrzu, lecz po kliknięciu w flagę teraz nic się nie dzieje, nie chodzi o animację bo to inna sprawa lecz, nie aktualizuje się rekord co jest tutaj najważniejsze. (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Poprawka:

<li lang="de" class="lang_de <?php if($GUEST['lang']=='de') {echo 'active';} ?>" title="flaga"></li>
analogicznie reszta

var a = $(this).attr("lang");

No i tu:
$sql=mysql_query(...) or die(mysql_error());
wstawiłeś zapytanie?
Go to the top of the page
+Quote Post
peja1990
post
Post #14





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(nospor @ 22.09.2011, 21:31:41 ) *
Poprawka:

<li lang="de" class="lang_de <?php if($GUEST['lang']=='de') {echo 'active';} ?>" title="flaga"></li>
analogicznie reszta

var a = $(this).attr("lang");

No i tu:
$sql=mysql_query(...) or die(mysql_error());
wstawiłeś zapytanie?



To już sobie poprawiłem lecz zamiast atrybutu lang dałem id, tylko nie to że nie podmienia na poste pole czy coś tylko w ogóle nie podmienia.
A zapytanie oczywiście, że dałem (IMG:style_emoticons/default/smile.gif)
Gdzie może być błąd ? (IMG:style_emoticons/default/sad.gif)

Do tego w pliku PHP zmieniłem z $_POST[a] na $_POST['a'] i nic (IMG:style_emoticons/default/sad.gif)

Ten post edytował peja1990 22.09.2011, 20:38:13
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Odpal firebuga dla FIrefox i zobacz, czy ci ten ajax idzie, co zawiera itp.
Go to the top of the page
+Quote Post
peja1990
post
Post #16





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(nospor @ 22.09.2011, 21:38:38 ) *
Odpal firebuga dla FIrefox i zobacz, czy ci ten ajax idzie, co zawiera itp.



Ok, ale najpierw muszę zainstalować "lisa" bo ogólnie to nie korzystam z tej przeglądarki (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Naprawdę nie musisz mnie/nas informować o tym. Poprostu zainstaluj i powiedz co ci pokaże.
Go to the top of the page
+Quote Post
peja1990
post
Post #18





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(nospor @ 22.09.2011, 21:49:46 ) *
Naprawdę nie musisz mnie/nas informować o tym. Poprostu zainstaluj i powiedz co ci pokaże.



Nic mi nie pokazuje, tak jakby to był zwykły obrazek z hoverem... Poprostu jedno wielkie NIC ;/

Zaraz Ci pokażę to Ty też sprawdzisz, ok ?

Łapcie, sprawdzajcie: http://detronic.pl/test/pl/start.html

Ten post edytował peja1990 22.09.2011, 20:54:35
Go to the top of the page
+Quote Post
nospor
post
Post #19





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




TEn kod:
$('li').click(function(){ ....
.....
ma być odpalony po załadowaniu strony, czyli
$(document).ready( .........
...........
co już stosowałeś wcześniej. Myśl trochę.
Go to the top of the page
+Quote Post
Kużdo
post
Post #20





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Nadal jestem zdania, że jest to zbędne, ponieważ po kliknięciu w flagę po kilku sekundach strona wczytuje się ponownie, więc znacznie prościej jest to zrobić używając parametru w GETcie, do tego odpada dodatkowy JS, który w tym przypadku jest naprawdę zbędny...
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 23.08.2025 - 13:10