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

Discussione: Incremento valore php su file con cookie

  1. #1
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 Utente attivo
    Data registrazione
    24-04-2011
    Messaggi
    417

    Predefinito

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

  9. #9
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 17.46.08

  12. #12
    mzanella non  connesso AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

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

  14. #14
    Data registrazione
    16-07-2015
    Messaggi
    143

  15. #15
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

    Come posso fare?

  16. #16
    darbula non  connesso Utente attivo
    Data registrazione
    24-04-2011
    Messaggi
    417

    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 17.49.17

  17. #17
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

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

  18. #18
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

    qualcuno mi potrebbe aiutare?

  19. #19
    mzanella non  connesso AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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 10.24.40

  20. #20
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

    Non cambia niente... :(

  21. #21
    darbula non  connesso Utente attivo
    Data registrazione
    24-04-2011
    Messaggi
    417

    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 14.44.31

  22. #22
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

    Mzanella mi potresti dire cosa non va sul mio codice?

  23. #23
    mzanella non  connesso AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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 Utente attivo
    Data registrazione
    24-04-2011
    Messaggi
    417

    Predefinito

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

  25. #25
    Data registrazione
    16-07-2015
    Messaggi
    143

    Predefinito

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

  26. #26
    darbula non  connesso Utente attivo
    Data registrazione
    24-04-2011
    Messaggi
    417

    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 16.35.51

  27. #27
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 16.51.43

  28. #28
    mzanella non  connesso AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
    Data registrazione
    16-07-2015
    Messaggi
    143

    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 AlterVistiano
    Data registrazione
    29-12-2015
    Messaggi
    830

    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
  •