Visualizzazione risultati 1 fino 8 di 8

Discussione: incrementare file txt in php

  1. #1
    Guest

    Predefinito incrementare file txt in php

    ciao a tutti vorrei creare un codice che aumenti di uno il file di testo al click.

    il codice che ho scritto è il seguente:

    Codice PHP:
    <?
    function conta(){
    $fp = fopen('conta.txt','w');
    $scritto1 = fread('conta.txt');
    $scritto1 = $scritto1+1;
    fwrite($fp,$scritto1);
    fclose($fp); }?>
    <a ONCLICK="conta()"><i class="fa fa-heart"></i></a>
    ma non capisco perchè non funziona...
    Ultima modifica di karl94 : 27-01-2016 alle ore 05.12.27 Motivo: Formattazione

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Cosa non funziona? Non viene incrementato? Cosa contiene conta.txt?
    Ad ogni modo quel codice può avere problemi nel caso in cui due istanze dello script PHP vengano eseguite in contemporanea: potrebbe venire saltato un conteggio oppure addirittura perso del tutto il contenuto del file.

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

    Predefinito

    Oltre alle giuste questioni sollevate da karl94, ci sono alcuni "errori ovvi":
    1. Non stai controllando di avere i permessi di lettura e scrittura sul file, meglio dare un'occhiata a file_exists, is_readable, is_writable
    2. Stai aprendo il file in sola scrittura, ma poi cerchi di leggerne il contenuto: se vuoi sia scrittura che lettura usa "w+" anziché "w"
    3. Stai usando fread in maniera fantasiosa: devi passargli, come primo parametro, la risorsa ottenuta con fopen e, come secondo parametro, il numero di byte da leggere
    4. Stai usando un file di testo come contatore globale, il che ha dei rischi: non hai forti garanzie sull'integrità del file conta.txt (in parole povere, può succedere che per errore il contenuto del file venga sovrascritto da un altro script)
    5. La variabile $scritto1 (il cui nome è discutibile) è di tipo stringa e potrebbe contenere qualsiasi cosa (per l'osservazione al punto precedente): $scritto1 + 1 potrebbe fornire risultati imprevisti
    6. Nell'ultima riga (quella in HTML) stai cercando di chiamare una funzione PHP nell'attributo onclick di un tag anchor: non si può fare (probabilmente hai fatto confusione con JavaScript)
    7. Non stai controllando i valori di ritorno delle funzioni che invochi

  4. #4
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Oltre alle giuste questioni sollevate da karl94, ci sono alcuni "errori ovvi":
    1. Non stai controllando di avere i permessi di lettura e scrittura sul file, meglio dare un'occhiata a file_exists, is_readable, is_writable
    2. Stai aprendo il file in sola scrittura, ma poi cerchi di leggerne il contenuto: se vuoi sia scrittura che lettura usa "w+" anziché "w"
    3. Stai usando fread in maniera fantasiosa: devi passargli, come primo parametro, la risorsa ottenuta con fopen e, come secondo parametro, il numero di byte da leggere
    4. Stai usando un file di testo come contatore globale, il che ha dei rischi: non hai forti garanzie sull'integrità del file conta.txt (in parole povere, può succedere che per errore il contenuto del file venga sovrascritto da un altro script)
    5. La variabile $scritto1 (il cui nome è discutibile) è di tipo stringa e potrebbe contenere qualsiasi cosa (per l'osservazione al punto precedente): $scritto1 + 1 potrebbe fornire risultati imprevisti
    6. Nell'ultima riga (quella in HTML) stai cercando di chiamare una funzione PHP nell'attributo onclick di un tag anchor: non si può fare (probabilmente hai fatto confusione con JavaScript)
    7. Non stai controllando i valori di ritorno delle funzioni che invochi
    allora adesso ti spiego bene...

    devo creare un contatore di like per ogni foto... il problema è che non posso usare il db, ma non ho idea di come risolvere il problema!

    qualche idea?

  5. #5
    Guest

    Predefinito

    Scusa, scusa, scusa.

    Ma nello script che è stato postato si sta tentando di richiamare una funzione PHP (lato server) da Javascript (lato client).
    E' normale che non funzioni.

    Una volta resa disponibile la pagina HTML come risultante dalla elaborazione dell'iterprete PHP, la funzione conta() risulta inesistente per Javascript.

  6. #6
    Guest

    Predefinito

    Citazione Originalmente inviato da vplaza Visualizza messaggio
    Scusa, scusa, scusa.

    Ma nello script che è stato postato si sta tentando di richiamare una funzione PHP (lato server) da Javascript (lato client).
    E' normale che non funzioni.

    Una volta resa disponibile la pagina HTML come risultante dalla elaborazione dell'iterprete PHP, la funzione conta() risulta inesistente per Javascript.
    non ho idea di realizzare ciò quindi sto impastando cose un po a caso... anche perchè ci stavo lavorando alle 4 di notte

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

    Predefinito

    Citazione Originalmente inviato da WebPanini Visualizza messaggio
    allora adesso ti spiego bene...

    devo creare un contatore di like per ogni foto... il problema è che non posso usare il db, ma non ho idea di come risolvere il problema!

    qualche idea?
    O rivedi il vincolo di non utilizzare il database, o... te ne crei a mano uno da solo.

    Premesso che le motivazioni ed i vincoli li sai solo tu, è d'obbligo l'osservazione: vuoi ottenere la permanenza di alcuni dati (per la precisione, un numero di like), dove ciascun dato è associato ad una entità (foto) con una relazione 1 ad 1. Un esempio perfetto di database relazionale. Se il vincolo di non usare il database l'hai deciso tu, rivalutalo; se te l'ha imposto qualcuno, fagli notare che è un vincolo (inutilmente) restrittivo e discutetene.

    Se proprio il database non può essere utilizzato, dovrai creartene uno rudimentale sporcandoti le mani con la gestione dei file, con la consapevolezza che difficilmente sarà efficiente o sicuro (e che crearlo non sarà né rapido né indolore...).
    Un'idea di partenza è creare un file in cui, per ogni foto, memorizzi il numero di like ricevuti (supponiamo una entry per riga). La creazione di una nuova foto produce l'aggiunta di una riga, con valore iniziale 0; la cancellazione di una foto produce la cancellazione della relativa riga; l'aggiunta o rimozione di un like comporta la modifica del valore alla riga interessata.
    Senza dubbio utile: indicizzare il contenuto del file per renderne efficiente l'accesso, creare un meccanismo di lock per evitare race conditions in caso di accessi simultanei, spezzare il contenuto del file in più sottofile per evitare consumo eccessivo di memoria (o, in alternativa, prevedere letture e scritture solo su porzioni del file con fseek).

    Naturalmente alternative sporche e rapide non mancano, ad esempio creare una cartella in cui collocare un file per ogni foto, con all'interno il numero di like ricevuti da quel file, fregandosene del rischio di race conditions ed altri problemi...


    Riguardo all'uso della funzione conta() in HTML non si può fare così. L'ideale sarebbe usare AJAX o AJAJ: cliccando sul bottone viene inviata una richiesta ad una pagina PHP del server, la quale registra il nuovo like. L'aternativa più semplice, ma non per questo da disdegnare, consiste nel rendere il pulsante di like come un form, il cui invio aziona l'aggiunta del like.

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    O rivedi il vincolo di non utilizzare il database, o... te ne crei a mano uno da solo.

    Premesso che le motivazioni ed i vincoli li sai solo tu, è d'obbligo l'osservazione: vuoi ottenere la permanenza di alcuni dati (per la precisione, un numero di like), dove ciascun dato è associato ad una entità (foto) con una relazione 1 ad 1. Un esempio perfetto di database relazionale. Se il vincolo di non usare il database l'hai deciso tu, rivalutalo; se te l'ha imposto qualcuno, fagli notare che è un vincolo (inutilmente) restrittivo e discutetene.

    Se proprio il database non può essere utilizzato, dovrai creartene uno rudimentale sporcandoti le mani con la gestione dei file, con la consapevolezza che difficilmente sarà efficiente o sicuro (e che crearlo non sarà né rapido né indolore...).
    Un'idea di partenza è creare un file in cui, per ogni foto, memorizzi il numero di like ricevuti (supponiamo una entry per riga). La creazione di una nuova foto produce l'aggiunta di una riga, con valore iniziale 0; la cancellazione di una foto produce la cancellazione della relativa riga; l'aggiunta o rimozione di un like comporta la modifica del valore alla riga interessata.
    Senza dubbio utile: indicizzare il contenuto del file per renderne efficiente l'accesso, creare un meccanismo di lock per evitare race conditions in caso di accessi simultanei, spezzare il contenuto del file in più sottofile per evitare consumo eccessivo di memoria (o, in alternativa, prevedere letture e scritture solo su porzioni del file con fseek).

    Naturalmente alternative sporche e rapide non mancano, ad esempio creare una cartella in cui collocare un file per ogni foto, con all'interno il numero di like ricevuti da quel file, fregandosene del rischio di race conditions ed altri problemi...


    Riguardo all'uso della funzione conta() in HTML non si può fare così. L'ideale sarebbe usare AJAX o AJAJ: cliccando sul bottone viene inviata una richiesta ad una pagina PHP del server, la quale registra il nuovo like. L'aternativa più semplice, ma non per questo da disdegnare, consiste nel rendere il pulsante di like come un form, il cui invio aziona l'aggiunta del like.
    non avevo proprio pensato al form!! grazie mille ho trovato la soluzione!

    vi faccio sapere al più presto come risolverò
    Ultima modifica di WebPanini : 27-01-2016 alle ore 17.33.55

Regole di scrittura

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