OK, ma io non ho ancora capito come devo modificare questa stringa per inserire i valori esatti...
Grazie ancora .Codice:data: "id=...&pos=...&ok=...&thread=...",
OK, ma io non ho ancora capito come devo modificare questa stringa per inserire i valori esatti...
Grazie ancora .Codice:data: "id=...&pos=...&ok=...&thread=...",
Ultima modifica di radiodelmomento : 01-10-2011 alle ore 13.27.07
Cerca di farti capire:
Nella tua pagina hai diversi pulsanti, uno per riga. Semplificando una situazione tipo:
Canzone 1 | VOTA |
Canzone 2 | VOTA |
Canzone 3 | VOTA |
...
Canzone n | VOTA |
ora, facendo click su un pulsante VOTA vuoi che venga registrato la preferenza per la canzone corrispondente. Come fare? Potresti richiamare la funzione con un parametro, ad esempio. E quindi qualcosa tipo
onclick="vota(1)" oppure onclick="vota(n)"
e questo parametro lo metti poi nei dati passati (tipo id).
Quanti, quali e di che tipo di parametri vuoi usare è solo a tua discrezione, in base a quello che ti serve.
OK, ma come faccio a fargli capire QUALI sono i parametri?
Ad esempio come faccio a fargli capire che a vota(1) è associato l'id "1", la posizione "10", l'ok "ok" e il thread "sotto"?
Canzone 1 | VOTA | ==> onclick="vota(1)"
Canzone 2 | VOTA | ==> onclick="vota(2)"
Canzone 3 | VOTA | ==> onclick="vota(3)"
...
Canzone n | VOTA | ==> onclick="vota(n)"
e poi
Codice HTML:<script type="text/javascript"> function vota(id_voto) { $.ajax({ type: "POST", url: "ClassificaAJAX.php", data: "id=id_voto" // questi sono esempi, se non ti servono li togli --> &pos=&ok=&thread=", $(this).val('Attendere...').attr('disabled', 'disabled'); success: function(msg){ $(this).val('VOTA').attr('disabled', ''); } }); } </script>
Grazie, ma per gli altri valori come dovrei fare?
Non si può creare una funzione che richiama altri elementi?
Anche modificando il bottone: onclick="vota(n,pos,id ecc.)" ma come faccio a fargli capire che è un'array?
Grazie 1000 ancora
Grazie per la risposta, ti posto tutto il codice...
È esatto?Codice:<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script type="text/javascript"> function vota(n, id, pos, ok, thread) { n = n; id = id; pos = pos; ok = ok; thread = thread; $('#pulsante'+n).val('Attendere...').attr('disabled', true); $.ajax({ type: "POST", url: "ClassificaAJAX.php", data: "id=id&pos=pos&ok=ok&thread=thread", success: function(msg){ $('#pulsante'+n).val(' VOTA '); }, error:function() { $('#pulsante'+n).val(' VOTA ').attr('disabled', false); } }); } </script>
E questo?
Lo chiedo perché la pagina si aggiorna e la query non viene ancora eseguita... :-(Codice PHP:
echo "<td align=\"center\" bgcolor=\"#FFFF99\"><form id=\"form1\" name=\"form1\" method=\"post\">
<input type=\"submit\" name=\"Submit\" value=\" VOTA \" id='pulsante$item' onClick=\"vota('$item, $pos, $ok, $thread'); return false;\" />
</form></td>";
Devo postare anche il codice PHP della pagina?
Grazie 10.000 ancora!
Ultima modifica di radiodelmomento : 01-10-2011 alle ore 15.58.01
Scusami ma con me devi avere pazienza, molta pazienza... soprattutto in JavaScript!
Ho eliminato la parte inutile, e adesso come faccio a fare eseguire il codice quando viene premuto il pulsante?
Dovrebbe già eseguirlo.
quando fai click sul pulsante (onclick) viene richiamata la funzione (vota) che a sua volta fa una richiesta ajax ad una pagina php che registra il voto.
Purtroppo questo non accade...
Può essere dovuto al fatto che, per eseguire la query, i valori li prendo tramite $_GET?
Poi la pagina continua ad aggiornarsi quando viene premuto il bottone.
Ecco la pagina: cosa c'è di errato?
Scusa, ma la chiamata ajax la fai alla stessa pagina?
Non mi pare abbia senso far processare al motore php anche la formattazione della pagina solo per eseguire una registrazione del voto.
EDIT:
stavo dando un'occhiata al sorgente della pagina linkata ma ci vedo un po' di cose che non vanno.
- fai attenzione a </tr><tr>, mi pare manchino un po' di <tr>.
- metti un form per ogni riga. Perchè? E poi un id è, per definizione, univoco. tu usi <form id="form1" per tutti. Così come name ...
- una un solo form e gestisci quale pulsante è stato premuto in base ad altri parametri.
Ultima modifica di simpleticket : 01-10-2011 alle ore 17.01.30
OK, quindi dovrei creare un'altra pagina per mettere soltanto il codice PHP, giusto?
Ma anche se faccio così, ovviamente non funziona!
Solo ora vedo una cosa
semmaiCodice HTML:data: "id=id&pos=pos&ok=ok&thread=thread",
Codice HTML:data: "id=" + id + "&pos=" + pos + "&ok=" + ok + "&thread=" + thread",
-------------------
Non ho provato nulla, ma scritto di getto, MOOOOOOOOOOOOOLTO semplificando ...
nella sezione head metti
poi nel body ipotizzo una situazione volutamente semplificata tipoCodice HTML:<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script type="text/javascript"> function vota(n, id) { $('#pulsante' + n).val('Attendere...').attr('disabled', true); $.ajax({ type: "POST", url: "registravoto.php", data: "id=" + id, success: function(html){ esito = html.split("|"); //ipotizzando un messaggio di ritorno del tipo "esito|voti|perc" li converto la stringa in array if(esito[0] == 'OK'){ $('#voto' + n).html(esito[1]); //cambio il numero di voti $('#perc' + n).html(esito[2]); //aggiorno la percentuale $('#pulsante' + n).val('VOTA'); }else{ alert('si è verificato un errore'); $('#pulsante' + n).val('VOTA').attr('disabled', false); } }, error:function(){ $('#pulsante' + n).val('VOTA').attr('disabled', false); } }); } </script>
ed infine una pagina php del tipoCodice HTML:<form name="votazione" action="" method="post"> <table> <tr> <td>(ID=12)Jovanotti</td> <td><input type="submit" name="Submit1" value="VOTA" id='pulsante1' onclick="vota(1, 12); return false;" /></td> <td id="voti1">xxx voti</td> <td id="perc1">xx%</td> </tr> <tr> <td>(ID=34)Jennifer Lopez</td> <td><input type="submit" name="Submit2" value="VOTA" id='pulsante2' onclick="vota(2, 34); return false;" /></td> <td id="voti2">xxx voti</td> <td id="perc2">xx%</td> </tr> <tr> <td>(ID=132)Bruno Mars</td> <td><input type="submit" name="Submit3" value="VOTA" id='pulsante3' onclick="vota(3, 132); return false;" /></td> <td id="voti3">xxx voti</td> <td id="perc3">xx%</td> </tr> </table> </form>
Facendo attenzione alle semplificazioni del caso ed ai problemi di sicurezza legato al controllo dei parametri qui sorvolatiCodice PHP:
$con = TUA CONNESSIONE
$sql = "UPDATE classifica SET voti = voti + 1 WHERE id_canzone =".$_POST['id'];
$up = @mysql_query($sql, $con);
if(mysql_errno($con) != 0) {
//Eseguo l'estrazione del nuovo numero di voti e ricalcolo le percentuali
//Rifaccio l'estrazione e non aggiungo solo +1 voto per considerare il caso in cui nel frattempo ci sia stata
//un'altra votazione conclusasi in modo corretto
//ricavo i voti e li metto in $voti e la percentuale in $perc
echo "OK|".$voti." voti|".$perc." %";
}else{
echo "KO";
}
Una cosiderazione:
per aumentare la dimensione del pulsante non mi sembra bello usare gli spazi - tipo " VOTA " - ma si può intervenire via css impostando il width.
Ultima modifica di simpleticket : 01-10-2011 alle ore 17.38.31
Grazie per il tempo che stai impiegando aiutandomi!
Purtroppo però sono troppo ottuso e non riesco ancora a fare funzionare questo benedetto codice...
Ho modificato i codici come mi hai detto tu, e la pagina per votare è Classifica_voto.php:
Per il testo vuoto nel bottone provvederò... grazie.Codice PHP:
<?php
ob_start();
function get_client_ip(){
if (isset($_SERVER["REMOTE_ADDR"])){
return $_SERVER["REMOTE_ADDR"];
}
elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
return $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif (isset($_SERVER["HTTP_CLIENT_IP"])){
return $_SERVER["HTTP_CLIENT_IP"];
}else{
return FALSE;
}
}//fine function
//anche se alex sa fare di meglio metto le verifiche come piace a me
$ip=get_client_ip();
$ok = $_GET['ok'];
if($ok=="ok"){
}else{
if($ip==FALSE){//se non riesco a leggere l'ip
?>
<script type="text/javascript">
alert("Errore durante la ricezione del tuo indirizzo IP.")
</script>
<?php
}else{
//mi connetto al db
require_once("templates/vot/connessione.php");
//leggo l'id della canzone
$id=trim(strip_tags($_GET['id']));//ripulisco l'id e lo riduco ad intero
$id=(int)$id;//considerato che gli id delle canzoni partano da 1
if($id < 1){//metto un codice così, tanto per complicare il tutto
?>
<script type="text/javascript">
alert("Codice errore: 401. Vi preghiamo di contattare info@radiolucus.tk per risolvere il problema. Grazie.")
</script>
<?php
}else{
//avendo eliminato tutti i vecchi devo verificare solo che non abbia
//votato la canzone meno di 24 ore fa
$query_v_ut="SELECT * FROM utenti WHERE id_c=$id AND ip='$ip'";
$result_v_ut=mysql_query($query_v_ut);
$ha_votato=mysql_num_rows($result_v_ut);
if($ha_votato > 0){//ha votato meno di 24 ore la canzone
?>
<script type="text/javascript">
alert("Il voto non è stato registrato perché puoi votare solo una volta ogni 24 ore.")
</script>
<?php
}
if($ok_ko==""){//va tutto bene
$pos = $_GET['pos'];
$thread = $_GET['thread'];
//uppo i voti della canzone ed inserisco l'ip e il tempo/canzone dell'utente
$query_up_c="UPDATE canzoni SET voti=voti+1, ultimaposizione=$pos, thread='$thread' WHERE id=$id";
$result_up_c=mysql_query($query_up_c);
//inserisco il blocco all'utente
$query_in_u="INSERT INTO utenti(id_c,ip,data) VALUES($id,'$ip',$adesso)";
$result_in_u=mysql_query($query_in_u);
?>
<script type="text/javascript">
alert("Grazie per aver votato.")
</script>
<?php
}
//visualizzo il messaggio
}
}
}
}
else
{
echo "<br />";
}
ob_end_flush();
?>
Ciao e grazie 100.000 ancora!
Ho cercato di sistemare il tuo codice, ho modificato i $_GET in $_POST e aggiunto un po' di commenti, leggili.
in base a questo il codice JS diventeràCodice PHP:
<?php
ob_start();
function get_client_ip(){
if (isset($_SERVER["REMOTE_ADDR"])){
return $_SERVER["REMOTE_ADDR"];
}
elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
return $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif (isset($_SERVER["HTTP_CLIENT_IP"])){
return $_SERVER["HTTP_CLIENT_IP"];
}else{
return FALSE;
}
}//fine function
//anche se alex sa fare di meglio metto le verifiche come piace a me
$ip=get_client_ip();
$ok = $_POST['ok'];
if($ok=="ok"){
}else{
if($ip==FALSE){//se non riesco a leggere l'ip
exit("KO|Errore durante la ricezione del tuo indirizzo IP.");
}else{
//mi connetto al db
require_once("templates/vot/connessione.php");
//leggo l'id della canzone
$id=trim(strip_tags($_POST['id']));//ripulisco l'id e lo riduco ad intero
$id=(int)$id;//considerato che gli id delle canzoni partano da 1
if($id < 1){//metto un codice così, tanto per complicare il tutto
exit("KO|Codice errore: 401. Vi preghiamo di contattare info@radiolucus.tk per risolvere il problema. Grazie.");
}else{
//avendo eliminato tutti i vecchi devo verificare solo che non abbia
//votato la canzone meno di 24 ore fa
$query_v_ut="SELECT * FROM utenti WHERE id_c=$id AND ip='$ip'";
$result_v_ut=mysql_query($query_v_ut);
$ha_votato=mysql_num_rows($result_v_ut);
if($ha_votato > 0){//ha votato meno di 24 ore la canzone
exit("KO|Il voto non è stato registrato perché puoi votare solo una volta ogni 24 ore.");
}
//Questo qua sotto non l'ho capito
//$ok_ko non avrà mai un valore
//lo stai dichiarando solo ora
//quindi cosa ci sta va fare la condizione (if)?
if($ok_ko==""){//va tutto bene
$pos = $_POST['pos'];
$thread = $_POST['thread'];
//uppo i voti della canzone ed inserisco l'ip e il tempo/canzone dell'utente
$query_up_c="UPDATE canzoni SET voti=voti+1, ultimaposizione=$pos, thread='$thread' WHERE id=$id";
$result_up_c=mysql_query($query_up_c);
//inserisco il blocco all'utente
$query_in_u="INSERT INTO utenti(id_c,ip,data) VALUES($id,'$ip',$adesso)";
$result_in_u=mysql_query($query_in_u);
//adesso recupero i voti aggiornati e la percentuale
$voti = //Codice per recuperare i voti attuali
$perc = //Codice per recuperare la percentuale
exit("OK|".$voti." voti|".$perc." %");
}
//visualizzo il messaggio
}
}
}
// Tutto quello che segue lo commento
// E' un else senza if
//}
//else
//{
//echo "<br />";
//}
ob_end_flush();
?>
e nel body sistema le chiamate di funzione (sostituisci --pos-- e --thread-- con gli oppportuni valori).Codice HTML:<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script type="text/javascript"> function vota(n, id, pos, thread) { $('#pulsante' + n).val('Attendere...').attr('disabled', true); $.ajax({ type: "POST", url: "registravoto.php", data: ({ id: id, ok: 'ok', pos: pos, thread: thread }), success: function(html){ esito = html.split("|"); //ipotizzando un messaggio di ritorno del tipo "esito|voti|perc" li converto la stringa in array if(esito[0] == 'OK'){ $('#voto' + n).html(esito[1]); //cambio il numero di voti $('#perc' + n).html(esito[2]); //aggiorno la percentuale alert('Grazie per aver votato!'); $('#pulsante' + n).val('VOTA'); }else{ alert(esito[1]); $('#pulsante' + n).val('VOTA').attr('disabled', false); } }, error:function(){ $('#pulsante' + n).val('VOTA').attr('disabled', false); } }); } </script>
Ti ricordo di fare gli aggiustamenti del caso e che quello che ti ho scritto è una bozza di codice non provato e volutamente semplificato.Codice HTML:<form name="votazione" action="" method="post"> <table> <tr> <td>(ID=12)Jovanotti</td> <td><input type="submit" name="Submit1" value="VOTA" id='pulsante1' onclick="vota(1, 12, --pos--, --thread--); return false;" /></td> <td id="voti1">xxx voti</td> <td id="perc1">xx%</td> </tr> <tr> <td>(ID=34)Jennifer Lopez</td> <td><input type="submit" name="Submit2" value="VOTA" id='pulsante2' onclick="vota(2, 34, --pos--, --thread--); return false;" /></td> <td id="voti2">xxx voti</td> <td id="perc2">xx%</td> </tr> <tr> <td>(ID=132)Bruno Mars</td> <td><input type="submit" name="Submit3" value="VOTA" id='pulsante3' onclick="vota(3, 132, --pos--, --thread--); return false;" /></td> <td id="voti3">xxx voti</td> <td id="perc3">xx%</td> </tr> </table> </form>
Grazie 1.000.000 (ogni volta aggiungo uno 0! ).
Ho aggiustato i codici come mi hai detto tu modificando $voti ed $perc ma non ho ottenuto niente.
Può essere per quell'$ok_ko?
Come dovrei modificarlo?
Diventerebbe...Codice PHP:
if($ha_votato > 0){//ha votato meno di 24 ore la canzone
exit("KO|Il voto non è stato registrato perché puoi votare solo una volta ogni 24 ore.");
} if($ok_ko==""){//va tutto bene
$pos = $_POST['pos'];
Anche se eseguo il cambiamento, non funziona!Codice PHP:
if($ha_votato > 0){//ha votato meno di 24 ore la canzone
exit("KO|Il voto non è stato registrato perché puoi votare solo una volta ogni 24 ore.");
}else{//va tutto bene
$pos = $_POST['pos'];
Poi la percentuale non posso calcolarla in quella pagina, perché devo avere la somma di tutti i voti. Comunque questa è l'ultima cosa a cui pensare!
Ciao!
--- EDIT ---Ho capito perché si aggiornava la pagina quando premevo il bottone...
Ho modificato
inCodice PHP:
onclick=\"vota($item, $id, $pos, $thread); return false;\"
E adesso la pagina non si aggiorna appena premo il bottone, ma continua a non succedere niente con la quey!Codice PHP:
onclick=\"return false; vota($item, $id, $pos, $thread);\"
Ultima modifica di radiodelmomento : 02-10-2011 alle ore 16.31.29
Prova a richamare la pagina .php direttamente (e visto che hai impostato POST come method) tramite una pagina di appoggio) passandogli i parametri e vedi cosa restituisce.
Ho tolto soltanto "return false;" e come action ho messo Classifica_voto.php, lasciando onclick="vota()".
Sarebbe if($id < 1).KO|Codice errore: 401. Vi preghiamo di contattare --- per risolvere il problema. Grazie.
Può essere che non prende l'id perché, come hai già detto, ripeti i valori?
Oppure con data è tutt'altra cosa?Codice:data: ({ id: id, ok: 'ok', pos: pos, thread: thread }),
Grazie.
Quello che tu credi sia un ripetere i valori è solo una "illusione ottica" perchè chiami allo stesso modo le variabili, solo che la parte a sinistra di (:) è il nome del parametro che passi alla chiamata, mentre la parte a destra è il relativo valore.
Quando richiami la funzione quella parte diventa qualcosa del tipo
data: id=123, ok='ok', pos=9, thread='ciao mamma' ...
per vedere che la registrazione del voto funzioni, come ti suggerivo prima
creati una pagina in cui metti un form con 3 campi (id, pos e thread), come action metti Classifica_voto.php, la esegui, inserisci i valori e premi invia.
E vedi che cosa ti ritorna la pagina php.
Se tutto è ok e il voto viene registrato vuol dire che l'inghippo è da un'altra parte, mentre se hai degli errori o il comportamento non è quello voluto, il problema è li.
Ora permettimi una considerazione:
Tu dici "non posso calcolare la percentuale perchè mi servono tutti i dati"...
Queste sono cose che devi considerare, non basta solo fare due modifiche ad un elemento dell apagina per far le cose per bene con ajax.
E poi ancora, devi considerare che il tutto deve funzionare anche nel caso in cui il client abbia JS disattivato, ecc...
Come vedi son tutte cose che non si possono improvvisare.
Ecco perchè bisogna prima studiare e analizzare quello che si vuole fare, le tecnologie da usare e poi provare a farlo. Non il contraio.
Ho creato la pagina.
IL CODICE FUNZIONA!!!Codice HTML:<form method="POST" action="Classifica_voto.php"> <input type="text" value="1" name="n" /> <input type="text" name="id" value="134" /> <input type="text" name="pos" value="12" /> <input type="text" name="thread" value="uguale" /> <input type="text" value="ok" name="ok" /> <input type="submit" value="vota"/> </form>
Rivedendo il codice di Classifica_voto.php ho notato:
Cosa significa?Codice PHP:
if($ok=="ok"){
}else{//codice per eseguire la query
Per eseguire la query $ok dev'essere impostato su "ok", quindi ho modificato in:
Funziona.Codice PHP:
if($ok=="ok"){
//codice per eseguire la query
È quindi un errore del codice AJAX...
Grazie 10.000.000... a quanti 0 arriveremo?
-- EDIT --Per quanto riguarda la percenutale:
i voti sono tantissimi, e con 1 voto in più la percentuale non si aggiorna.
Per cui poi creo un altro codice per aggiornare periodicamente tutta la tabella ogni TOT.
I browser che non supportano JS verranno reindirizzati automaticamente alla pagina che c'è per ora tramite un <noscript>.
Grazie per i consigli.
Ultima modifica di radiodelmomento : 02-10-2011 alle ore 17.35.11
Ciao, ho provato a modificare il codice JS in:
Quando premo il bottone però l'alert non viene richiamato!Codice:<script type="text/javascript"> function vota(n, id, pos, thread) { alert("ciao"); } </script>
C'è qualcosa che non va nel richiamo della funzione...
Oppure sbaglio io? O.o
Ciao!
Spero che questo messaggio non valga come "riesumazione vecchio topic"...
Sono finalmente riuscito a fare funzionare la classifica!
Non sapete quanto sono felice...
Ho dovuto semplicemente eliminare questo:
Se tolgo jQuery.noConflict(); è tutto perfetto, anche se lascio gli altri due valori.Codice:<script type="text/javascript"> jQuery.noConflict(); var _TEMPLATE_URL = '../../templates/bj_venus/index.html'; var _TOPMOD_HOVER = false; </script>
Vorrei soltanto sapere a che serve e se è importante.
Grazie mille, come sempre è un errore mio.