Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 33

Discussione: Incremento valore php su file con cookie

  1. #1
    Guest

    Predefinito Incremento valore php su file con cookie

    Buonasera!
    avrei un problema direi alquanto fastidioso...
    ho dei pulsanti sul mio sito e mi piacerebbe che al click oltre a incrementare una variabile verificasse attraverso un cookie se l'utente ha già premuto o no.
    ecco il codice:
    Codice PHP:
    if (isset($_COOKIE['like'])) {
    echo
    '<script type="text/javascript">alert("Error: hai già inserito il tuo parere!");</script>';
    }
    else{
    // Se è stato l'incremento della variabile...
    if (isset($_POST['incrementa'])) {
    // Legge il valore dallo stato condiviso
    $value = read_value();

    // Effettua l'incremento
    $value = $value + 1;

    // Salva il valore modificato
    write_value($value);

    // Restituisce il valore modificato
    echo json_encode($value);
    }

    // Altrimenti, mostra semplicemente il valore attuale senza intervenire attivamente
    else {
    echo
    json_encode(read_value());
    }
    }
    setcookie("like", "like");
    il primo if è quello che controlla se è presente il cookie.
    per evitare contrasti con il codice creo il cookie alla fine di tutte le operazioni/cicli.
    il problema è che non appena clicco la prima volta sul pulsante non incrementa niente!
    Cosa devo modificare?
    GRAZIE INFINITE!

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Il controller.php interagisce col file system (il file di testo) e con la pagina HTML che lo chiama, ma non con l'utente: non può mostrargli un alert. Questo è compito della vista, o interfaccia, non del controller .

    Il controller può restituire un'indicazione che l'operazione non è andata a buon fine, in modo che la sia poi la pagina HTML a leggere tale indicazione ed eventualmente mostrare un alert. Il codice del controller diventerebbe quindi:
    Codice PHP:
    // Se è stato l'incremento della variabile...
    if (isset($_POST['incrementa'])) {
    // Legge il valore dallo stato condiviso
    $value = read_value();

    // Se l'utente ha già votato, restituisce un'indicazione dell'errore
    if (isset($_COOKIE['like'])) {
    return
    json_encode(array(
    'value' => $value,
    'error' => 'hai già inserito il tuo parere'
    ));
    }

    // Effettua l'incremento
    $value = $value + 1;

    // Salva il valore modificato
    write_value($value);

    // Imposta un cookie indicando che l'utente ha già votato
    setcookie("like", "like", time() + 60 * 60 * 24 * 30);

    // Restituisce il valore modificato
    echo json_encode(array(
    'value' => $value,
    'error' => false
    ));
    }

    // Altrimenti, mostra semplicemente il valore attuale senza intervenire attivamente
    else {
    echo
    json_encode(array(
    'value' => read_value(),
    'error' => false
    ));
    }
    Il codice JavaScript andrà modificato di conseguenza.

    Usare un cookie, però, potrebbe non essere la scelta migliore: non solo hanno una scadenza dopo la quale è possibile votare di nuovo (nell'esempio mostrato è impostata a 30 giorni, nella versione che avevi realizzato tu era implicitamente alla chiusura del browser) all'utente basta cancellare i cookies per poter votare di nuovo.

  3. #3
    Guest

    Predefinito

    Eh lo so...pero ho letto in internet che se non metti una data di scadenza restera per sempre...il punto e che devo mettere questi pulsanti in tutte le pagine del mio sito e non so come fare oltre ai cookie...potrei attraverso l indirizzo ip..ma...non vorrei corrompere la privacy degli utenti...hai qualche altra idea?
    Scusamibse ti tormento sempre e ti ringrazio di cuore di seguirmi😫

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    pero ho letto in internet che se non metti una data di scadenza restera per sempre
    Dalla documentazione di PHP:
    [il parametro expire] If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).
    Anche l'IP ha i suoi problemi, essendo dinamico è probabile che ad una connessione successiva dello stesso utente sia diverso. Inoltre possono esserci utenti diversi con lo stesso IP, complicando le cose.

    Senza un sistema di registrazione e autenticazione non è possibile garantire che ciascuno voti al massimo una vota: Prevent Visitors from Voting again.

    Se non hai previsto un meccanismo di autenticazione, lascia pure il cookie o l'IP.
    Volendo si può pensare ad un meccanismo ibrido che consideri presenza simultanea di cookie, IP (con maschera) ed user agent, ma credo sarebbe inutilmente complicato considerando che si potrebbe comunque fregare mascherando IP e user agent.

  5. #5
    Guest

    Predefinito

    Tranquillo utilizzo il tuo codice sopra riportato....una domanda...l'error deve essere anche quello richiamato tramite il bottone?

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Oltre al controller.php cambia solo la parte JavaScript nella pagina HTML:
    Codice HTML:
    <script>
    	// Mostra il valore indicato
    	function show_value(data) {
    		if (data.error == false) {
    			var container = $('#value');
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    </script>
    Non ho modo di provarlo al momento, quindi non stupirti troppo se il JavaScript o il controller non funzionano !

  7. #7
    Guest

    Predefinito

    Mzanella non preoccuparti domani faro un po di prove e se ho problemi ti scrivo...io ti ringrazio di tutto...buona cena!😉

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    EDIT: concordo con mzanella .. Il voto può essere unico solo se si è previsto un sistema di autenticazione
    Ultima modifica di darbula : 03-03-2017 alle ore 00.19.00

  9. #9
    Guest

    Predefinito

    buonasera!
    come promesso ho tentato di fare alcune modifiche al codice ma...
    1. ogni volta che entro nella pagina js alert mi si attiva scrivendomi "undefined" (molto probabilmente perchè mette a video anche il valore di error quando è uguale a false)... non capisco il motivo.
    2. non visualizza lo stato del valore (value)
    3. Non è che nell'HTML vada richiamato anche il value oltre che data?

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Proviamo a il punto della situazione : riporta il codice aggiornato del controller e della pagina HTML (magari solo le parti rilevanti, senza <head> e altre).

  11. #11
    Guest

    Predefinito

    controller.php
    Codice PHP:
    <?php
    $var
    =true;
    // Legge il valore della variabile (stato condiviso) dal file
    function read_value() {
    $filename = "valore.txt";
    if (!
    file_exists($filename) || !is_readable($filename)) {
    touch($filename);
    }

    $value = file_get_contents($filename);
    // Se il file era vuoto, si assume valore 0
    if (empty($value)) {
    $value = 0;
    }

    return
    $value;
    }

    // Scrive lo stato condiviso
    function write_value($value) {
    $filename = "valore.txt";

    file_put_contents($filename, $value);
    }


    // Se è stato l'incremento della variabile...
    if (isset($_POST['incrementa'])) {
    // Legge il valore dallo stato condiviso
    $value = read_value();

    // Se l'utente ha già votato, restituisce un'indicazione dell'errore
    if (isset($_COOKIE['like'])) {
    return
    json_encode(array(
    'value' => $value,
    'error' => 'hai già inserito il tuo parere'
    ));
    }

    // Effettua l'incremento
    $value = $value + 1;

    // Salva il valore modificato
    write_value($value);

    // Imposta un cookie indicando che l'utente ha già votato
    setcookie("like", "like", time() + 60 * 60 * 24 * 30);

    // Restituisce il valore modificato
    echo json_encode(array(
    'value' => $value,
    'error' => false
    ));
    }

    // Altrimenti, mostra semplicemente il valore attuale senza intervenire attivamente
    else {
    echo
    json_encode(array(
    'value' => read_value(),
    'error' => false
    ));
    }
    ?>

    index.html

    Codice HTML:
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script>
    	
    // Mostra il valore indicato
    	function show_value(data) {
    		if (data.error == false) {
    			var container = $('#value');
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    
    
    
    		// Mostra il valore al caricamento dall pagina
    		$('#value').ready(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value').click(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value').click(function () {
    			$.post("controller.php", { incrementa: "true" }, show_value);
    		});
    	</script>
    Ultima modifica di tuttitrucchiInvitaAmici : 03-03-2017 alle ore 18.46.08

  12. #12
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Bisogna aggiungere questo all'inizio di controller.php:
    Codice PHP:
    header('Content-type: application/json');
    in questo modo:
    Codice PHP:
    <?php
    header
    ('Content-type: application/json');

    // Legge il valore della variabile (stato condiviso) dal file
    function read_value() {
    ...
    serve ad indicare che il documento è di tipo JSON, così il JavaScript nell'altra pagina può interpretarlo correttamente. Colpa mia ...

  13. #13
    Guest

    Predefinito

    mzanella non preoccuparti... allora lui funziona pero quando refresho il valore ritorna come prima.
    Ultima modifica di tuttitrucchiInvitaAmici : 03-03-2017 alle ore 21.04.06

  14. #14
    Guest

  15. #15
    Guest

    Predefinito

    Come posso fare?

  16. #16
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Intanto fai la giusta domanda.. Hai bisogno di un contatore per due tasti che mantenga in memoria l'utente (anche tramite cookie)... Va modificato sia l' HTML che PHP... Solo che non capisco cosa sia questo stato condiviso.. PS hai tre id in jquery ma solo due id eppure non unici nella HTML :D (id uguale uno per pagina)
    Ultima modifica di darbula : 06-03-2017 alle ore 18.49.17

  17. #17
    Guest

    Predefinito

    Ok...e cosa devo aggiungere nell html? Ma sopratutto dove?

  18. #18
    Guest

    Predefinito

    qualcuno mi potrebbe aiutare?

  19. #19
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    C'era un piccolo errore nel controller.php.
    Questa parte
    Codice PHP:
    if (isset($_COOKIE['like'])) {
    return
    json_encode(array(
    'value' => $value,
    'error' => 'hai già inserito il tuo parere'
    ));
    }
    va sostituita con
    Codice PHP:
    if (isset($_COOKIE['like'])) {
    echo
    json_encode(array(
    'value' => $value,
    'error' => 'hai già inserito il tuo parere'
    ));
    return;
    }


    Solo che non capisco cosa sia questo stato condiviso..
    Lo stato, in questo caso, è il numero di like ricevuti. È condiviso in quanto diversi utenti possono tentare di accedervi simultaneamente, in una qualunque combinazione di lettura/scrittura.
    Ultima modifica di mzanella : 07-03-2017 alle ore 11.24.40

  20. #20
    Guest

    Predefinito

    Non cambia niente... :(

  21. #21
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    buone feste a tutte le donne. Per evitare collisioni si deve usare i lock ai file http://forum.mrwebmaster.it/threads/...rittura.42860/ nelle funzione javascprit sarebbe utile un contatore che eviti di fare richieste se già l'utente ha premuto uno dei due pulsanti disponibili.. si deve modificare tutto insomma anche la logica del contatore del click se il json avesse il tot dei like e unlike basterebbe incrementare uno dei due pulsanti attualmente disponibili. Scusate purché questo codice sia facile al momento non ve lo posso mostrare..ps mzanella guarda il sorgente html che ti ha postato prima.. Trovate un accordo :)
    Ultima modifica di darbula : 08-03-2017 alle ore 15.44.31

  22. #22
    Guest

    Predefinito

    Mzanella mi potresti dire cosa non va sul mio codice?

  23. #23
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Mzanella mi potresti dire cosa non va sul mio codice?
    Credo che il codice sia corretto, ma la pagina controller.php venga memorizzata in cache.
    Prova aggiungendo queste righe all'inizio del controller.php:
    Codice PHP:
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    e svuotando la cache.

    Segui anche il consiglio di darbula sui lock.

  24. #24
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    più che altro è memorizzata liketel.php (che qui menti e chiami "index.html") il sorgente html di questo link è da sistemare..

  25. #25
    Guest

    Predefinito

    Questob codice e da mettere su una pagina php ecco perche quell estensione....cmq dopo provo mzanella

  26. #26
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Ha ragione maznella ajax jquery setta la cache se si imposta su false si avrà anche la query string _=timestamp https://api.jquery.com/jquery.ajax/#...-ajax-settings
    https://api.jquery.com/jQuery.ajaxSetup/ o il setting per/di $.get https://api.jquery.com/jquery.get/
    Ultima modifica di darbula : 09-03-2017 alle ore 17.35.51

  27. #27
    Guest

    Predefinito

    ok il problema è stato risolto!
    Adesso sto tentando di mettere anche il pulsante non mi piace con la stessa modalità del pulsante mi piace...il problema è che mi sovrappone i valori e non capisco cosa abbia sbagliato.

    index.html
    Codice HTML:
    <div class="container">
    <div class="up fontawesome-thumbs-up" id="update_value" ><div class="spann"> <span id="value"></span></div> </div>  <div class="valore1" style="position: absolute"> <span id="value"></span></div>
    <div class="down fontawesome-thumbs-down" id="update_value2"><div class="spann"> <span id="value2"></span></div> </div>  <div class="valore2" style="position: absolute"> <span id="value2"></span></div>
    </div>
    <?php if (isset($_COOKIE['like'])) {
    	echo "ceeeeeeeeee";
    }
    ?>
     <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script>
    	
    // Mostra il valore indicato
    	/*function show_value(data) {
    		if (data.error == false) {
    			var container = $('#value'); // decido dove visalizzare
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    	*/
    
    
    
    	/*	// Mostra il valore al caricamento dall pagina
    		$('#value').ready(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value').click(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value').click(function () {
    			$.post("controller.php", { incrementa: "true" }, show_value);
    		});
    		
    		// Mostra il valore al caricamento dall pagina
    		$('#value').ready(function () {
    			$.get("controller.php", show_value);
    		});*/
    		</script>
    		<script>
    
    // Mostra il valore indicato
    	function show_value(data) {
    		if (data.error == false) {
    			var container = $('#value2'); // decido dove visalizzare
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    	
    		/**********************************************
    						NON MI PIACE
    		**********************************************/
    		
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value2').click(function () {
    			$.get("controller2.php", show_value);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value2').click(function () {
    			$.post("controller2.php", { incrementa: "true" }, show_value);
    		});
    		// Mostra il valore al caricamento dall pagina
    		$('#value2').ready(function () {
    			$.get("controller2.php", show_value);
    		});
    	</script>
    la 1 parte l'ho messa tra commento per testare se riusciva a eseguire la 2 funzione

    controller2.php

    Codice PHP:
    <?php
    header
    ('Content-type: application/json');
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    // Legge il valore della variabile (stato condiviso) dal file
    function read_value2() {
    $filename = "valore2.txt";
    if (!
    file_exists($filename) || !is_readable($filename)) {
    touch($filename);
    }

    $value = file_get_contents($filename);
    // Se il file era vuoto, si assume valore 0
    if (empty($value)) {
    $value = 0;
    }

    return
    $value;
    }

    // Scrive lo stato condiviso
    function write_value2($value) {
    $filename = "valore2.txt";

    file_put_contents($filename, $value);
    }


    // Se è stato l'incremento della variabile...
    if (isset($_POST['incrementa'])) {
    // Legge il valore dallo stato condiviso
    $value = read_value2();

    // Se l'utente ha già votato, restituisce un'indicazione dell'errore
    if (isset($_COOKIE['like'])) {
    return
    json_encode(array(
    'value' => $value,
    'error' => 'hai già inserito il tuo parere'
    ));
    return;
    }

    // Effettua l'incremento
    $value = $value + 1;

    // Salva il valore modificato
    write_value2($value);

    // Imposta un cookie indicando che l'utente ha già votato
    setcookie("like", "like", time() + 60 * 60 * 24 * 30);

    // Restituisce il valore modificato
    echo json_encode(array(
    'value' => $value,
    'error' => false
    ));
    }

    // Altrimenti, mostra semplicemente il valore attuale senza intervenire attivamente
    else {
    echo
    json_encode(array(
    'value' => read_value2(),
    'error' => false
    ));
    }
    ?>
    Ultima modifica di tuttitrucchiInvitaAmici : 09-03-2017 alle ore 17.51.43

  28. #28
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Cosa intendi per "sovrappone i valori"?
    L'ho appena provato e sembra funzionare .

    Ho visto che hai commentano la funzione show_value nella prima parte per far funzionare la seconda: basta dare alle due funzioni nomi diversi, ad esempio show_like e show_dislike, modificando il resto del codice JavaScript di conseguenza.

  29. #29
    Guest

    Predefinito

    ok mzanella ho provato a fare come hai detto te e il problema è che quando clicco sul 2 pulsante il valore del 2 compare sul 1 bottone:(
    ecco il codice:
    Codice HTML:
    <script>
    	
    // Mostra il valore indicato
    	function show_value(data) {
    		if (data.error == false) {
    			var container = $('#value'); // decido dove visalizzare
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    	
    
    
    
    		// Mostra il valore al caricamento dall pagina
    		$('#value').ready(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value').click(function () {
    			$.get("controller.php", show_value);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value').click(function () {
    			$.post("controller.php", { incrementa: "true" }, show_value);
    		});
    		
    		// Mostra il valore al caricamento dall pagina
    		$('#value').ready(function () {
    			$.get("controller.php", show_value);
    		});
    		</script>
    		<script>
    
    // Mostra il valore indicato
    	function show_value2(data) {
    		if (data.error == false) {
    			var container = $('#value2'); // decido dove visalizzare
    			container.html(JSON.parse(data.value));
    		}
    		else {
    			alert(data.error);
    		}
    	}
    	
    		/**********************************************
    						NON MI PIACE
    		**********************************************/
    		
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value2').click(function () {
    			$.get("controller2.php", show_value);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value2').click(function () {
    			$.post("controller2.php", { incrementa: "true" }, show_value);
    		});
    		// Mostra il valore al caricamento dall pagina
    		$('#value2').ready(function () {
    			$.get("controller2.php", show_value);
    		});
    	</script>

  30. #30
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Hai modificato il nome della funzione, ma non "il resto del codice JavaScript di conseguenza":
    Codice HTML:
    		/**********************************************
    						NON MI PIACE
    		**********************************************/
    		
    		// Associa il click alla lettura e stampa della variabile
    		$('#read_value2').click(function () {
    			$.get("controller2.php", show_value2);
    		});
    
    
    		// Associa il click all'incremento e stampa della variabile
    		$('#update_value2').click(function () {
    			$.post("controller2.php", { incrementa: "true" }, show_value2);
    		});
    		// Mostra il valore al caricamento dall pagina
    		$('#value2').ready(function () {
    			$.get("controller2.php", show_value2);
    		});

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •