Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywolanie funkcji php przez <a
Forum PHP.pl > Forum > PHP
daggerski
Witam mam skrypt up.php

  1. mysql_connect("localhost", "root", "haslo")or die("Nie można nawiązać połączenia z bazą");
  2. mysql_select_db("db")or die("Wystąpił błąd podczas wybierania bazy danych");
  3.  
  4.  
  5.  
  6. $id = $_GET['id'];
  7. $pt = $_GET['pt'] + 1;
  8. echo $id;
  9. echo $pt;
  10.  
  11. $pytanie = "UPDATE obrazki SET punkty=".$pt." WHERE id=".$id."" ;
  12. mysql_query($pytanie);
  13. header("Location: index.php");


skrypt dostaje z index.php po kliknieciu na button getem dwie zmeinne, zmienna id oraz zmienna pt. do zmiennej pt dodaje jeden i zapisuje do bazy ten wynik.

odpowiada za to ta linijka w index.php
  1. <div class="thumbs"> <li><a href="up.php?id='.$row[0].'&pt='.$row[6].'">


Jednak chcialbym to troszke upiekszyc, a najlepiej byloby, aby umiescic ten skrypt dodajacy punkta do index.php a nie do osbnego pliku i wywolywac go javascriptem po nacisnieciu buttona niestety raczkuje w tematyce javascriptu, probowalem cos tam w jquery, a czasu nie mam, aby sie od podstaw uczyc bo przed sylwestrem musze skonczyc a to wlasciwie ostatnia rzecz, ktora mi zostala do zrobienia. Prosze o pomoc. I przepraszam za polskie znaki, ale nie posiadam polskiej czcionki.
Moli
Użyj ajaxa, inaczej tego nie zrobisz winksmiley.jpg
daggerski
A czy moglbys przytoczyc jakis krotki wzor jak to zrobic bo takze z ajaxem cieniutku u mnie...
amii
OK w ramach prezentu świątecznego prawie gotowiec z wyjaśnieniami

Funkcja ajax to instrukcja uruchamiająca AJAX z odpowiednimi parametrami u siebie wywołujesz to np tak:
Żeby ustawić parametry dla index.php to albo JS -> http://forum.php.pl/index.php?showtopic=52...rt=#entry286748
albo bezpośrednio z PHP do wyboru do koloru smile.gif
To jak rozumiem -> <div class="thumbs"> <li><a href="up.php?id='.$row[0].'&pt='.$row[6].'"> ma być przesłane jako parametry więc sobie z tym pokombinuj

Plik index.php
  1. function polacz() {
  2. mysql_connect("localhost", "root", "haslo")or die("Nie można nawiązać połączenia z bazą");
  3. mysql_select_db("db")or die("Wystąpił błąd podczas wybierania bazy danych");
  4.  
  5.  
  6.  
  7. $id = mysql_real_escape_string($_GET['id']); //przefiltruj dane bo ktoś sprytny zrobi ci mysql injection
  8. $pt = mysql_real_escape_string($_GET['pt'] + 1);
  9. echo $id;
  10. echo $pt;
  11.  
  12. $pytanie = "UPDATE obrazki SET punkty=".$pt." WHERE id=".$id."" ;
  13. mysql_query($pytanie);
  14. }




To umieszczasz normalnie w body jako doklejenie funkcji dla inputa
[JAVASCRIPT] pobierz, plaintext
  1. document.getElementById('id_twojego_inputa').onclick = function() {
  2. ajax( {
  3. type: "GET",
  4. url: "index.php.php?id=2&pt=5",
  5. onError: function(msg) {
  6. console.warn(msg)
  7. },
  8. onSuccess: function(msg) {
  9. //tu jakas funkcja ktora cos robi na zwróconych danych w formie text-u lub xml ty chcesz dokonać polaczenia i aktualizacji danych w bazie więc może tak ale nie testowałem czy zadziała
  10. <?php polacz(); ?>
  11. }
  12. });
  13. }
[JAVASCRIPT] pobierz, plaintext


To umieszczasz w sekcji head
[JAVASCRIPT] pobierz, plaintext
  1. function ajax( options ) {
  2. options = {
  3. type: options.type || "POST",
  4. url: options.url || "",
  5. onComplete: options.onComplete || function(){},
  6. onError: options.onError || function(){},
  7. onSuccess: options.onSuccess || function(){},
  8. dataType: options.dataType || "text"
  9. };
  10.  
  11. var xml = new XMLHttpRequest();
  12. xml.open(options.type, options.url, true);
  13.  
  14. xml.onreadystatechange = function(){
  15. if ( xml.readyState == 4) {
  16. if ( httpSuccess( xml ) ) {
  17. var returnData = (options.dataType=="xml")? xml.responseXML : xml.responseText
  18. options.onSuccess( returnData );
  19. } else {
  20. options.onError();
  21. }
  22. options.onComplete();
  23. xml = null;
  24. }
  25. };
  26.  
  27. xml.send();
  28.  
  29. function httpSuccess(r) {
  30. try {
  31. return ( r.status >= 200 && r.status < 300 || r.status == 304 || navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined")
  32. } catch(e) {
  33. return false;
  34. }
  35. }
  36. }
[JAVASCRIPT] pobierz, plaintext

#luq
Trochę odbiegnę od tematu ale, @amii możesz wytłumaczyć ten kawałek kodu:

[JAVASCRIPT] pobierz, plaintext
  1. function httpSuccess(r) {
  2. try {
  3. return ( r.status >= 200 && r.status < 300 || r.status == 304 || navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined")
  4. } catch(e) {
  5. return false;
  6. }
  7. }
[JAVASCRIPT] pobierz, plaintext


Kod odpowiedzi HTTP numer 206
Kod
206     Partial Content     Część zawartości – serwer zrealizował tylko część zapytania typu GET, odpowiedź musi zawierać nagłówek Range informujący o zakresie bajtowym zwróconego elementu

Chyba w tym przypadku nie powinno być okej.

Jakiś wyjątek dla Safari... że niby co Safari nie zwraca poprawnych nagłówków HTTP? W ogóle w warunku najpierw porównujesz e.status a na samym końcu sprawdzasz czy jest undefined. http://frontend.pl/2010/12/undefined-jest-be/

Być może ma to jakiś głębszy sens, którego narazie nie rozumiem, wyjaśnij, rzuć linkiem bo IMHO ciekawe winksmiley.jpg
amii
#luq to co wkleiłem to nie mój kod to tak na marginesie winksmiley.jpg kod pochodzi z tego notabene bardzo dobrego kursu JS -> http://www.doman.art.pl/kursjs/kurs/ajax/ajax.html

Ten kawałek kodu zwraca true lub false w zależności od tego czy została zwrócona poprawna strona kodowa. Przeglądarka może np. zwrócić kod 404 itp. co oznacza błąd, dzięki temu mamy zapewnioną obsługę wyjątku dla tego typu sytuacji.

W tym kodzie źródłowym mimo, że kurs jak napisałem jest dobry to mogą być błędy. Zauważyłem klika przerabiając kurs a kodu nie testowałem więc.... trzeba by to przetestować.

[JAVASCRIPT] pobierz, plaintext
  1. xml.onreadystatechange = function(){
  2. if ( xml.readyState == 4) { //najpierw sprawdzamy czy dane są zwrócone i gotowe do użycia. Jeśli tak readyState obiektu XMLHttpRequest (u nas xml) zwróci 4 to znaczy, że są
  3. if ( httpSuccess( xml ) ) { //później testujemy w wewnętrznej funkcji czy przeglądarka zwraca kody z prawidłowego przedziału. O tym Safari przeczytaj najlepiej w źródle
  4. var returnData = (options.dataType=="xml")? xml.responseXML : xml.responseText
  5. options.onSuccess( returnData );
  6. } else {
  7. options.onError();
  8. }
  9. options.onComplete();
  10. xml = null;
  11. }
  12. };
[JAVASCRIPT] pobierz, plaintext
#luq
Cytat(amii @ 30.12.2010, 13:38:48 ) *
Ten kawałek kodu zwraca true lub false w zależności od tego czy została zwrócona poprawna strona kodowa. Przeglądarka może np. zwrócić kod 404 itp. co oznacza błąd, dzięki temu mamy zapewnioną obsługę wyjątku dla tego typu sytuacji.

Sprostowanie - nie żadnej strony kodowej a nagłówek odpowiedzi przesyłany przez serwer.

Ja dokładnie wiem co ma robić ten kod tylko zdziwił mnie ten warunek, sprawdzanie zakresu nagłówków, wyjątek dla Safari i to wszystko wrzucone w try + catch...
W podanym przez Ciebie linku dostałem w sumie wyjaśnienie. Musze obadać dokładnie nagłówki z zakresu 200 - 300 oraz 304 i zobaczyć ten błąd na Safari winksmiley.jpg

Ale ja bym jednak napisał to tak:

[JAVASCRIPT] pobierz, plaintext
  1. function httpSuccess(r) {
  2. if('object' === typeof r){
  3. return (r.status >= 200 && r.status < 300 || 304 == r.status || navigator.userAgent.indexOf("Safari") >= 0 && 'undefined' === typeof r.status);
  4.  
  5. }
  6. else{
  7. return (navigator.userAgent.indexOf("Safari") >= 0);
  8. }
  9. }
[JAVASCRIPT] pobierz, plaintext


Wtedy nie trzeba tego w try pchać (który jest w JS`ie strasznie wolny) i nie wysypie nam się z powodu braku pola status w zmiennej r.
bim2
Do tematu wracając.

Jak zapisujesz jakies dane które dodajesz o 1 to nie przekazuj ich poprzez url, bo kazdy na to wpłynie i doda więcej punktów. Przekazuj tylko id i zrób tak:
  1.  
  2. $pytanie = "UPDATE obrazki SET punkty=punkty+1 WHERE id=".$id."" ;


Tlumacząc:
Cytat
UPDATE obrazki SET punkty=punkty+1 WHERE
Uaktualnij tablę obrazki zmieniając kolumnę punkty na (pobierz wartość z kolumny punkty + 1).


Mam nadzieję, ze w miare ok wytłumaczyłem.
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.