Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie do bazy, bez przeładowania strony
Forum PHP.pl > Forum > XML, AJAX
Cromwell
Piszę prosty system głosowania.
Wszystko idzie dobrze, tylko jedna rzecz mnie męczy.

Głosowanie wygląda podobnie jak na demotywatory.pl
Są dwa linki, plus i minus, które zmieniają wartość w bazie danych.
O ile zrobić to z przeładowaniem strony nie jest trudne, to chciałbym, aby działało to tak, jak na demotywatorach, bez przeładowania.

A że w JS jestem bardzo słaby, to sam sobie nie poradzę.
Z tego co widzę, na demotywatorach jest użyty jQuery.

Czyli mówiąc prościej - jak zrobić, aby po kliknięciu na link, wysyłało się zapytanie do bazy danych, bez przeładowania strony?
nospor
słowo klucz: AJAX
Z racji, że piszesz w dziale AJAX rozumiem że słowo klucz już znasz. Teraz czas najwyższy poczytać trochę o nim, a następnie gdy będziesz miał konkretny problem z kodem - wróć do nas.
Cromwell
Ok.
Poszukałem, popróbowałem i teraz mam coś takiego:

W head:
  1. <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
  2. <script type="text/javascript">
  3. function plus(id){
  4. $("#plus").load("vote.php?jak=plus&id="+id);
  5. }
  6. function minus(id){
  7. $("#plus").load("vote.php?jak=minus&id="+id);
  8. }


wywołuję to przy pomocy:

  1. echo '<a href="java script:plus('."'".$row['id']."'".')">plus</a>';
  2. echo ' <b id="plus">'.$row['ocena'].'</b> ';
  3. echo '<a href="java script:minus('."'".$row['id']."'".')">minus</a>';

Oczywiście ten fragment jest w pętli i jest wiele takich elementów.

Jeśli zaś chodzi o kod pliku vote.php, wygląda on tak:

  1. include 'config.php'; // łączenie z bazą danych
  2.  
  3. $ip = $_SERVER['REMOTE_ADDR'];
  4. $id = $_GET['id'];
  5.  
  6. $ip_sql=mysql_query("SELECT ip FROM adresy WHERE plik='$id' and ip='$ip'");
  7. $count=mysql_num_rows($ip_sql);
  8.  
  9.  
  10. if ($count == 0)
  11. {
  12. if ($_GET['jak'] == 'plus')
  13. {
  14. mysql_query("UPDATE tekst SET ocena=ocena+1 WHERE id = '$id'");
  15. mysql_query("INSERT INTO adresy VALUES('', '$id', '$ip')");
  16. $query = mysql_query("SELECT ocena FROM tekst WHERE id = '$id'");
  17. $row = mysql_fetch_row($query);
  18. echo $row[0];
  19. }
  20. if ($_GET['jak'] == 'minus')
  21. {
  22. mysql_query("UPDATE tekst SET ocena=ocena-1 WHERE id = '$id'");
  23. mysql_query("INSERT INTO adresy VALUES('', '$id', '$ip')");
  24. $query = mysql_query("SELECT ocena FROM tekst WHERE id = '$id'");
  25. $row = mysql_fetch_row($query);
  26. echo $row[0];
  27. }
  28. }
  29. else
  30. {
  31. echo 'już oddałeś głos!';
  32. }


Całość działa świetnie, ale tylko wtedy, gdy jest tylko jeden rekord w pętli. Jeśli jest kilka, to działa tylko pierwszy.
To znaczy, przy reszcie zmieniają się wartości, ale dopiero po przeładowaniu to widać, natomiast przy pierwszym wywala informację 'już oddałeś głos'.

Może mi ktoś z tym pomóc?
nospor
No bo wynik plusa/minusa dla kazdego rekordu zawsze wkladasz do tego samego elementu o tym samym id PLUS smile.gif
Cromwell
Racja smile.gif
Początkowo nie wiedziałem jak to przerobić, ale w końcu wpadłem na rozwiązanie:

W wywoływaniu:
  1. echo ' <b id="plus'.$row['id'].'">'.$row['ocena'].'</b> ';


W funkcji:
  1. function plus(id){
  2. $("#plus"+id).load("vote.php?jak=plus&id="+id);
  3. }

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.