• User Attivo

    Ho un problema alla mia chat e cerco qualcuno che mi aiuti a risolverlo

    Ciao io ho sul mio sito una chat che non si basa su database o che so io, ma su un semplice foglio di testo, il problema è che a volte il messaggio che invio io o altri utenti non compare e si è costretti a ridigitarlo di nuovo, da cosa può dipendere questa cosa?

    ad ora come ora potrei postare alcuni file ma non so da quali partire, se qualcuno mi dice da dove posso partire a postare i codici io sono qui felice di farlo, grazie!


  • Super User

    puo dipendere da tante cose:
    non viene salvato una volta inviato, il file di testo viene aperto e scritto contemporaneamente e dunque una delle due salta, etc...


  • User Attivo

    @ayrton2001 said:

    puo dipendere da tante cose:
    non viene salvato una volta inviato, il file di testo viene aperto e scritto contemporaneamente e dunque una delle due salta, etc...

    ciao ayrton2001 tu cosa mi consiglieresti di fare? ho assolutamente bisogno di lumi non posso continuare a tenermi questo problema gli utenti si stufano...😢


  • User Attivo

    come diceva ayrton2001, il problema che descrivi può dipendere da diverse cose, ma è molto probabile che quando un'utente posta, quindi cerca di scrivere sulla risorsa file, può accadere che in quel momento la risorsa sia occupata da un altro utente, quindi la scrittura su file non avviene.

    Si tratta di un problema che ritorna ogni volta che si usa un file che può essere aperto da più agenti.


  • Moderatore

    io ti consiglierei di passare all'utilizzo di un Database.
    Se non hai esperienze ci sono molte chat open-source (ajatizzate) che potrebbero fare al caso tuo!


  • Super User

    @massimux said:

    io ti consiglierei di passare all'utilizzo di un Database.
    Se non hai esperienze ci sono molte chat open-source (ajatizzate) che potrebbero fare al caso tuo!

    Quoto 🙂


  • User Attivo

    si ho capito raga...lo so che è facile dire così e cambiare ma io vorrei tenermi la mia che è molto bella e funzionale alle mie esigenze mi basta solo trovare il sistema di mettere a posto sto problema mi aiutate?:bho:


  • User

    Ciao,
    puoi provare con flock
    Ciao
    Bruno


  • Moderatore

    allora
    modifica lo script in modo da aprire il file e verificare la corretta apertura
    poi testi che il messaggio sia stato scritto e puoi farla funzionare

    mi dispiace ma per i fogli di testo devi perforza procedere con varie operazioni...

    Potrei chiederti su quale hosting sei?


  • Super User

    il file di testo viene sovrascritto oppure i nuovi messaggi vengono "aggiunti"?
    Ossia, usi fopen([file], "w") oppure fopen([file], "a")?


  • Moderatore

    se è una chat vengono aggiunti 😛


  • User Attivo

    @Bruno61 said:

    Ciao,
    puoi provare con flock
    Ciao
    Bruno

    ciao bruno ahimè quella funzione l'ho già provata ma non dà nessun risultato, io vi posso postare la pagina insert.php che inserisce i messaggi, magari ditemi cosa potrei fare...

    [PHP]<html>
    <head>
    <title>Inserimento del messaggio</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    <body>
    <?
    include("config.php");
    $nick=$_GET['nick'];
    $password=$_GET['password'];
    $messaggio=$_GET['messaggio'];
    $messaggio=stripslashes($messaggio);
    $messaggio=str_replace("\n"," ",$messaggio);
    $commento="[".date("H:i - d/m/Y")."] ".$nick."|".$messaggio."\n";
    if ( !empty($_GET['faccina']) ) $commento = $_GET['faccina']." ".$commento ;
    $url="chat.php"."?nick=".$nick."&password=".$password;
    if ( !empty($_GET['faccina']) ) $url .= "&faccina=".$_GET['faccina'] ;

    $cercamsg = strstr($messaggio,"<");
    $cercamsg2 = strstr($messaggio,">");

    if (empty($messaggio))
    {
    Header("Location: $url");
    }
    elseif ($cercamsg & $cercamsg2)
    {
    Header("Location: $url");
    }
    else
    {
    $apri_file=fopen($file_mess,"a+");
    fputs($apri_file,$commento);
    fclose($apri_file);
    Header("Location: $url");
    }
    ?>
    </body>
    </html>
    [/PHP]


  • Super User

    @massimux said:

    se è una chat vengono aggiunti 😛

    Beh, non è detto. Se l'ha scritta qualche pazzo magari apre il file, carica i dati in una variabile, concatena il nuovo messaggio e risalva sovrascrivendo.
    Ormai mi aspetto di tutto 😄


  • Super User

    @giulio3x said:

    ciao bruno ahimè quella funzione l'ho già provata ma non dà nessun risultato, io vi posso postare la pagina insert.php che inserisce i messaggi, magari ditemi cosa potrei fare...

    [PHP]<html>
    <head>
    <title>Inserimento del messaggio</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    <body>
    <?
    include("config.php");
    $nick=$_GET['nick'];
    $password=$_GET['password'];
    $messaggio=$_GET['messaggio'];
    $messaggio=stripslashes($messaggio);
    $messaggio=str_replace("\n"," ",$messaggio);
    $commento="[".date("H:i - d/m/Y")."] ".$nick."|".$messaggio."\n";
    if ( !empty($_GET['faccina']) ) $commento = $_GET['faccina']." ".$commento ;
    $url="chat.php"."?nick=".$nick."&password=".$password;
    if ( !empty($_GET['faccina']) ) $url .= "&faccina=".$_GET['faccina'] ;

    $cercamsg = strstr($messaggio,"<");
    $cercamsg2 = strstr($messaggio,">");

    if (empty($messaggio))
    {
    Header("Location: $url");
    }
    elseif ($cercamsg & $cercamsg2)
    {
    Header("Location: $url");
    }
    else
    {
    $apri_file=fopen($file_mess,"a+");
    fputs($apri_file,$commento);
    fclose($apri_file);
    Header("Location: $url");
    }
    ?>
    </body>
    </html>
    [/PHP]

    io seguirei il consiglio di bruno61.
    Prova a cambiare le il codice cosi:
    [php]$apri_file=fopen($file_mess,"a+");
    if (flock($apri_file, LOCK_EX)) {
    fwrite($apri_file,$commento);
    flock($apri_file, LOCK_UN);
    } else {
    echo "Errore lock";
    }
    fclose($apri_file);
    Header("Location: $url");[/php]


  • User

    Ciao,
    giusto una prova, correggi l'elseif in

    elseif ($cercamsg && $cercamsg2)
    

    L'AND binario e' sensibile al tipo di dato (dovrebbe lavorare correttamente solo su interi), non vorrei che la condizione venisse male interpretata e qualche messaggio capitasse per qualche ragione li' dentro.

    Ciao
    Bruno


  • User Attivo

    @Bruno61 said:

    Ciao,
    giusto una prova, correggi l'elseif in

    elseif ($cercamsg && $cercamsg2)

    L'AND binario e' sensibile al tipo di dato (dovrebbe lavorare correttamente solo su interi), non vorrei che la condizione venisse male interpretata e qualche messaggio capitasse per qualche ragione li' dentro.

    Ciao
    Bruno

    ciao bruno, mi piacerebbe capire bene cosa fa questa riga cioè quale funzione ha e perchè ora mi hai detto di aggiungere una & in più, grazie per le info che mi darai...:ciauz:


  • User Attivo

    @ayrton2001 said:

    io seguirei il consiglio di bruno61.
    Prova a cambiare le il codice cosi:
    [php]$apri_file=fopen($file_mess,"a+");
    if (flock($apri_file, LOCK_EX)) {
    fwrite($apri_file,$commento);
    flock($apri_file, LOCK_UN);
    } else {
    echo "Errore lock";
    }
    fclose($apri_file);
    Header("Location: $url");[/php]

    io avevo inserito questo codice che è leggeremente diverso voi che dite?
    [PHP]if (empty($messaggio))
    {
    Header("Location: $url");
    }
    else
    {
    $apri_file=fopen($file_mess,"a+");
    if (@flock($apri_file, LOCK_EX)) { //blocco, uso esclusivo in scrittura
    fputs($apri_file,$commento);
    @flock($apri_file, LOCK_UN); // rilascia il il blocco
    } else {
    fclose($apri_file);
    Header("Location: $url_mess");//torna alla chat portandosi dietro il messaggio
    }
    fclose($apri_file);
    Header("Location: $url");
    }
    ?>[/PHP]

    e avevo tolto queste per mettere il pezzo sopra:
    [PHP]$cercamsg = strstr($messaggio,"<");
    $cercamsg2 = strstr($messaggio,">");

    if (empty($messaggio))
    {
    Header("Location: $url");
    }
    elseif ($cercamsg & $cercamsg2)
    {
    Header("Location: $url");
    }
    else
    {
    $apri_file=fopen($file_mess,"a+");
    fputs($apri_file,$commento);
    fclose($apri_file);
    Header("Location: $url");
    }
    ?>[/PHP]


  • User

    Ciao,
    @giulio3x said:

    ciao bruno, mi piacerebbe capire bene cosa fa questa riga cioè quale funzione ha e perchè ora mi hai detto di aggiungere una & in più, grazie per le info che mi darai...:ciauz:

    a dire il vero volevo chiederti io che funzione avesse. Cosi' come e' messa elimina (non ricade nell'ultimo else, quindi non scrive nel file) i messaggi che contengono i caratteri < e > contemporaneamente.

    A meno tu abbia qualche ragione (non sembra, da quel che dici) ti consiglierei di levarla del tutto.

    Riguardo agli AND, il singolo & compara i bit di ogni operando e ritorna un valore non-zero se i due operandi hanno dei bit in comune. All'interno di un if questo e' generalmente un errore di battitura (non sempre ovviamenete, qualche volta serve cosi') ed ha un comportamento diverso dal doppio &&, che significa AND logico. Ad esempio, 4 & 8 e' uguale a 0 (100b e 1000b non hanno bit in comune) quindi l'if risultera' falsa, mentre 4 && 8 e' uguale a TRUE (i due operandi sono diversi da 0 o null) e quindi l'if viene eseguita.

    Ciao
    Bruno


  • User Attivo

    ok ma per ovviare al mio problema cosa mi consigliate? il pezzo di flock che mi avete postato è un pochino diverso da quello che usavo io...ehm mi potete quindi dire esattamente quale dei due è meglio che io usi? o magari avete altri suggerimenti? apsetto fiducioso....


  • Super User

    @giulio3x said:

    ok ma per ovviare al mio problema cosa mi consigliate? il pezzo di flock che mi avete postato è un pochino diverso da quello che usavo io...ehm mi potete quindi dire esattamente quale dei due è meglio che io usi? o magari avete altri suggerimenti? apsetto fiducioso....

    credo non cambi niente poiche fputs è un alias di fwrite, inoltre tu richiami la funzione flock in safe-mode.
    Con questo codice cosa accade? perdi sempre messaggi, la chat non funzione, non viene inserito nessun messaggio o cos'altro?