Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]+[JS] Zapytanie SQL w JS
Forum PHP.pl > Forum > Przedszkole
peja1990
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 smile.gif

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

Serdecznie pozdrawiam.
Kamil Dunaj.
phpion
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.
peja1990
Dobrze mistrzu wink.gif
A jesteś w stanie mi pomóc ?
nospor
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.
peja1990
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 ?
sunpietro
Od siebie tylko dodam, że mieszanie kodu JS i PHP jest złą praktyką. Powinieneś mieć osobne pliki z obsługą JS i PHP.
peja1990
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()); ?>'];
Kużdo
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.
kpt_lucek
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. ?>
Kużdo
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...
kpt_lucek
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.
peja1990
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. sad.gif
nospor
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?
peja1990
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 smile.gif
Gdzie może być błąd ? sad.gif

Do tego w pliku PHP zmieniłem z $_POST[a] na $_POST['a'] i nic sad.gif
nospor
Odpal firebuga dla FIrefox i zobacz, czy ci ten ajax idzie, co zawiera itp.
peja1990
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 tongue.gif
nospor
Naprawdę nie musisz mnie/nas informować o tym. Poprostu zainstaluj i powiedz co ci pokaże.
peja1990
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
nospor
TEn kod:
$('li').click(function(){ ....
.....
ma być odpalony po załadowaniu strony, czyli
$(document).ready( .........
...........
co już stosowałeś wcześniej. Myśl trochę.
Kużdo
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...
peja1990
Cytat
TEn kod:
$('li').click(function(){ ....
.....
ma być odpalony po załadowaniu strony, czyli
$(document).ready( .........
...........
co już stosowałeś wcześniej. Myśl trochę.


Masz rację... smile.gif
Teraz jest reakcja na click ale aktualizuje rekord na PUSTY ;/
Dodam, że tutaj zmieniłem na: url: "http://detronic.pl/test/zmiana_flag.php", z pewnych względów, wiecie może dlaczego nie aktualizuje poprawnie rekordu ?

Podgląd: http://detronic.pl/test/pl/start.html

Cytat( @ 22.09.2011, 22:03:45 ) *
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...


Kolego zobacz na to ".../pl/start.html" <- rozszerzenie nie pozwala na użycie metody GET, a nie zmienię na php wink.gif



DZIAŁA exclamation.gif!!!!
DZIĘKI ZA POMOC exclamation.gif!!!!!!!!!!!!!
Kużdo
Cytat(peja1990 @ 22.09.2011, 22:08:49 ) *
Kolego zobacz na to ".../pl/start.html" <- rozszerzenie nie pozwala na użycie metody GET, a nie zmienię na php wink.gif

Kolega nie zna nawet HTMLa, więc sorry, ale postarałbyś się chociaż przeczytać te linki, które Ci podesłałem...

To, że coś ma takie rozszerzenie to nie znaczy, że nie da się już tego wykonać. Skoro jest to HTML, to zmianę języka można obsłużyć w zewnętrznym pliku PHP, który na koniec przekieruje Cię znów na start.html, a jak dla mnie, to ta Twoja strona nadal nie działa, wyskakuje okienko, ale przekierowania późniejszego zero, więc nie wiem jaki pożytek z tego co zrobiłeś... Chyba, że jakoś to przekształcisz... Tak czy siak spójrz na to z innej strony. Teraz masz HTML + JS + zewnętrzny plik PHP do zmiany języka, a tak miałbyś tylko HTML + PHP. Ale jak kto woli...

Linki w postaci:
  1. <a href="http://adres.do/pliku.php?lang=pl"><img src="adres/do/obrazka_pl.png" /></a>
  2. <a href="http://adres.do/pliku.php?lang=en"><img src="adres/do/obrazka_en.png" /></a>
  3. <a href="http://adres.do/pliku.php?lang=de"><img src="adres/do/obrazka_de.png" /></a>


Plik php:
  1. <?php
  2. //polaczenie z baza
  3. $dostepne_jezyki = array('pl', 'en', 'de');
  4.  
  5. if (isset ($_GET['lang']) && in_array($_GET['lang'], $dostepne_jezyki))
  6. {
  7. $query = "UPDATE guests SET lang = '{$_GET['lang']}' WHERE ip = '{$_SERVER['REMOTE_ADDR']}'";
  8. $result = mysql_query($query);
  9. header('Location: hxxp://adres.do.strony/test'.$_GET['lang'].'/start.html');
  10. }
  11. ?>
Musiałem w headerze dać hxxp zamiast http, bo forum dziwnie to konwertowało.

Te dwa fragmenty zaktualizują Twój język w bazie + przekierują Cię na odpowiednie linki:
Kod
http://adres.do.strony/pl/start.html
http://adres.do.strony/en/start.html
http://adres.do.strony/de/start.html
peja1990
Cytat(Kużdo @ 22.09.2011, 22:28:22 ) *
Kolega nie zna nawet HTMLa, więc sorry, ale postarałbyś się chociaż przeczytać te linki, które Ci podesłałem...

To, że coś ma takie rozszerzenie to nie znaczy, że nie da się już tego wykonać. Skoro jest to HTML, to zmianę języka można obsłużyć w zewnętrznym pliku PHP, który na koniec przekieruje Cię znów na start.html, a jak dla mnie, to ta Twoja strona nadal nie działa, wyskakuje okienko, ale przekierowania późniejszego zero, więc nie wiem jaki pożytek z tego co zrobiłeś... Chyba, że jakoś to przekształcisz... Tak czy siak spójrz na to z innej strony. Teraz masz HTML + JS + zewnętrzny plik PHP do zmiany języka, a tak miałbyś tylko HTML + PHP. Ale jak kto woli...

Linki w postaci:
  1. <a href="http://adres.do/pliku.php?lang=pl"><img src="adres/do/obrazka_pl.png" /></a>
  2. <a href="http://adres.do/pliku.php?lang=en"><img src="adres/do/obrazka_en.png" /></a>
  3. <a href="http://adres.do/pliku.php?lang=de"><img src="adres/do/obrazka_de.png" /></a>


Plik php:
  1. <?php
  2. //polaczenie z baza
  3. $dostepne_jezyki = array('pl', 'en', 'de');
  4.  
  5. if (isset ($_GET['lang']) && in_array($_GET['lang'], $dostepne_jezyki))
  6. {
  7. $query = "UPDATE guests SET lang = '{$_GET['lang']}' WHERE ip = '{$_SERVER['REMOTE_ADDR']}'";
  8. $result = mysql_query($query);
  9. header('Location: hxxp://adres.do.strony/test'.$_GET['lang'].'/start.html');
  10. }
  11. ?>
Musiałem w headerze dać hxxp zamiast http, bo forum dziwnie to konwertowało.

Te dwa fragmenty zaktualizują Twój język w bazie + przekierują Cię na odpowiednie linki:
Kod
http://adres.do.strony/pl/start.html
http://adres.do.strony/en/start.html
http://adres.do.strony/de/start.html



Nie mogłeś tak wcześniej ?
Czemu Ty się tak czepiłeś tego html'a ? Haha, gdzie Ty w moim kodzie widzisz coś pomieszanego w sekcji head i body ? Może zainwestuj w okularki ? smile.gif
Przyjrzyj się jeszcze raz kodowi strony tongue.gif Pozatym to tylko szkielet.
I uwierz mi, że to co mam teraz z JS'em jest na 100% lepsze od zwykłego HTML+PHP.
Przekierowania nie potrzebuję na .../en/... itd. bo po co ? smile.gif Mogę to zrobić i w aktualnym kodzie ale to bez sensu bo i tak wszystkie linki automatycznie wraz ze zmianą języka są updateowane smile.gif

WIELKIE DZIĘKI WSZYSTKIM ZA POMOC smile.gif exclamation.gif Uratowaliście mnie exclamation.gif!
Za to dostaliście kilka "pomógł", za każdą pomocną wypowiedź <- to tak nawiasem dla moderatorów tongue.gif

Serdecznie pozdrawiam i jeszcze raz dziękuję smile.gif
Szczególnie użytkownikowi "nospor" jak i użytkownikowi "Kużdo" za poświęcenie sporo swojego czasu wink.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.