- Home
- Categorie
- Coding e Sistemistica
- PHP
- Ho un problema alla mia chat e cerco qualcuno che mi aiuti a risolverlo
-
il file di testo viene sovrascritto oppure i nuovi messaggi vengono "aggiunti"?
Ossia, usi fopen([file], "w") oppure fopen([file], "a")?
-
se è una chat vengono aggiunti
-
@Bruno61 said:
Ciao,
puoi provare con flock
Ciao
Brunociao 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]
-
@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
-
@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]
-
Ciao,
giusto una prova, correggi l'elseif inelseif ($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
-
@Bruno61 said:
Ciao,
giusto una prova, correggi l'elseif inelseif ($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
Brunociao 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...
-
@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]
-
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...
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
-
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....
-
@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?
-
utilizzando il flock ho notato che ad un utente capitava che il suo messaggio veniva scritto due volte, mentre ad altri continuava a accadere che a volte il loro messaggio non compariva più (quindi bisognava riscriverlo) e questa cosa accadeva pure a me, ma ripeto questa cosa non accadeva e continua ad accadere non sempre ma a volte,....porca l'oca cosa potrebbe essere vuoi che non ci sia una spiegazione? e lo spero...un modo per risolvere questo problema definitivamente? (premetto che avevo aggiunto qualche pezzo di codice flock pure sulla pagina chat.php).
-
aggiungo che se ci sono alri modi piuttosto che l'uso di flok ditemi perchè voglio risolvere una volta per tutte questo problema.:?
-
@giulio3x said:
utilizzando il flock ho notato che ad un utente capitava che il suo messaggio veniva scritto due volte, mentre ad altri continuava a accadere che a volte il loro messaggio non compariva più (quindi bisognava riscriverlo) e questa cosa accadeva pure a me, ma ripeto questa cosa non accadeva e continua ad accadere non sempre ma a volte,....porca l'oca cosa potrebbe essere vuoi che non ci sia una spiegazione? e lo spero...un modo per risolvere questo problema definitivamente? (premetto che avevo aggiunto qualche pezzo di codice flock pure sulla pagina chat.php).
Una curiosità. Magari non è inerente al problema, ma dopo il submit del messaggio disabiliti il reinvio? Se la risposta è no i doppioni possono presentarsi credo
-
@giulio3x said:
aggiungo che se ci sono alri modi piuttosto che l'uso di flok ditemi perchè voglio risolvere una volta per tutte questo problema.:?
Non credo esista altro metodo. Secondo me con l'uso di flock non è possibile perdere messaggi.
A questo punto mi viene il dubbio se il problema sia la registrazione su file del messaggio o un problema che si verifica prima.
Per curiosità, quanto pesa il file?
-
@ayrton2001 said:
Non credo esista altro metodo. Secondo me con l'uso di flock non è possibile perdere messaggi.
A questo punto mi viene il dubbio se il problema sia la registrazione su file del messaggio o un problema che si verifica prima.
Per curiosità, quanto pesa il file?ciao, mi potresti dire cosa intendi per "quanto pesa il file" non capisco, aspetto delucidazioni a riguardo, anzi posto il file ins_ut.php e chat.php che provi a dare un'occhiata magari trovi qualcosa:
chat.php
[PHP]<?
/*
session_start();
if(!isset($_SESSION['utente']))
{
echo "
<script>
alert("Se non sei registrato, non hai i permessi per accedere
a questa pagina");
</script>
";
header("Location:logout.php");
exit;
}
/
?>
<html>
<head>
<title>Happy Chat</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language = "JavaScript">
function textCounter(field, countfield, maxlimit) {
if(field.value.length > maxlimit){
field.value = field.value.substring(0, maxlimit);
}
else{
countfield.value = maxlimit - field.value.length;
}
}
</script>
<script language="javascript">
function aggiungi(y)
{
espressione=document.form_ins.messaggio.value;
new_espressione=espressione + y;
document.form_ins.messaggio.value=new_espressione;
}
</script>
<style>
.stile {
background:#FFFFFF;
font-family:verdana;
font-size:8pt;
SCROLLBAR-BASE-COLOR: #0099CC;
SCROLLBAR-ARROW-COLOR: #FFFFFF;
}
</style>
</head>
<body bgcolor="#FBBEAA">
<?
include("config.php");
$nick=$_GET['nick'];
$nick=strtolower($nick);
$nick=stripslashes($nick);
$password=$_GET['password'];
$password=strtolower($password);
$password_cr=crypt($password,$nick);
$password_cr=str_replace("|","",$password_cr);if (!(file_exists($file_reg)))
{fopen($file_reg,"w");}
$utente=$nick."|".$password;
$utente_ok=0;
$ut_regist=file($file_reg);
$dim_reg=count($ut_regist);
for ($i=0;$i<$dim_reg;$i++)
{
$dati_ut=explode("|",$ut_regist*);
$nick_ut=$dati_ut[0];
$pass_ut=$dati_ut[1];
if (($nick==$nick_ut) & ($password_cr==$pass_ut)) $utente_ok=1;
}
if ($utente_ok==1)
{
if (!(file_exists($file_online)))
{fopen($file_online,"w");}
$dim_file=filesize($file_online);
$dim_max=14000; // Dimensione in bytes massima per ricreare il file online
if ($dim_file>$dim_max)
fopen($file_online,"w");
$ar_orario=getdate();
$ora=$ar_orario['hours'];
$minuti=$ar_orario['minutes'];
$secondi=$ar_orario['seconds'];
if (strlen($minuti)==1) $minuti="0".$minuti;
if (strlen($secondi)==1) $secondi="0".$secondi;
$data=date("d/m/Y");
$orario=$ora.":".$minuti.":".$secondi;
$utente=$nick."|".$data."|".$orario."\n";
$ins_online=fopen($file_online,"a+");
fputs($ins_online,$utente);
fclose($ins_online);
}
else
{
echo "<center><b>E' STATO INSERITO<br>UN NICK O UNA PASSWORD<br>NON
CORRETTI,<br>OPPURE NON SEI<br>ANCORA REGISTRATO.</b><br><br>";
echo "<a href="javascript:history.back();">TORNA AL LOGIN</a></center>";
exit;
}
?>
<table width="177" align="center" bordercolor="#000000"
bgcolor="#E7E9FA" style="border:1px solid;">
<tr>
<td width="177" height="21" colspan="6" bgcolor="#BBC2F2"><div align="center">
<div align="center"><iframe src="messaggi.php" width="177" height="105" scrolling="yes"></iframe>
</td></tr></table><div align="center"> <br><table width="177" align="center" bordercolor="#000000" bgcolor="#E7E9FA" style="border:1px solid;"> <tr> <td width="177" height="21" bgcolor="#BBC2F2"><div align="center"><font color="#000000" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>PERSONE ON-LINE </strong></font></div></td> </tr> <tr> <td height="21"><iframe width="177" height="45" src="online.php" scrolling="no"></iframe></td> </tr> </table>
<br>
<form method="GET" action="insert.php" name="form_ins" >
<table width="185" align="center" bordercolor="#000000" bgcolor="#E7E9FA" style="border:1px solid;">
<tr>
<td width="185" height="21" colspan="6" bgcolor="#BBC2F2"><div align="center"><font color="#000000" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>SIMBOLI
METEO-SMILES</strong></font></div></td>
</tr>
<tr><td colspan="4"><div align="center">
<?
if ( empty($_['faccina']) ) $faccina = "" ;
else $faccina = $_GET['faccina'] ;
echo "
<select name="faccina" size="1">
<option value="[em1]" ";
if ( $faccina == "[em1]" ) echo " selected" ;
echo ">sereno</option>
<option value="[em2]" ";
if ( $faccina == "[em2]" ) echo " selected" ;
echo ">poco-nuvoloso</option>
<option value="[em3]" ";
if ( $faccina == "[em3]" ) echo " selected" ;
echo ">nuvoloso</option>
<option value="[em4]" ";
if ( $faccina == "[em4]" ) echo " selected" ;
echo ">luna</option>
<option value="[em5]" ";
if ( $faccina == "[em5]" ) echo " selected" ;
echo ">luna-nuvoloso</option><option value="[em6]" ";
if ( $faccina == "[em6]" ) echo " selected" ;
echo ">pioggia</option>
<option value="[em7]" ";
if ( $faccina == "[em7]" ) echo " selected" ;
echo ">pioggia-neve</option>
<option value="[em8]" ";
if ( $faccina == "[em8]" ) echo " selected" ;
echo ">temporale</option>
<option value="[em11]" ";
if ( $faccina == "[em11]" ) echo " selected" ;
echo ">temporale-pioggia</option><option value="[em9]" ";
if ( $faccina == "[em9]" ) echo " selected" ;
echo ">neve</option>
<option value="[em10]" ";
if ( $faccina == "[em10]" ) echo " selected" ;
echo ">nebbia</option>
<option value="[em12]" ";
if ( $faccina == "[em12]" ) echo " selected" ;
echo ">caldo</option>
<option value="[em13]" ";
if ( $faccina == "[em13]" ) echo " selected" ;
echo ">freddo</option>
<option value="[em14]" ";
if ( $faccina == "[em14]" ) echo " selected" ;
echo ">vento</option>
</select>
";
?> </td>
<td height="21"><div align="center"><img
src="emoticons/em15.gif" width="15" height="15" onClick="aggiungi('[em15]')"></div></td></tr>
<tr>
<td height="21"><div align="center"><img
src="emoticons/em16.gif" width="15" height="15" onClick="aggiungi('[em16]')"></div></td>
<td height="21"><div align="center"><img
src="emoticons/em17.gif" width="15" height="15" onClick="aggiungi('[em17]')"></div></td>
<td height="21"><div align="center"><img
src="emoticons/em18.gif" width="15" height="15" onClick="aggiungi('[em18]')"></div></td>
<td height="21"><div align="center"><img
src="emoticons/em19.gif" width="15" height="15" onClick="aggiungi('[em19]')"></div></td>
<td height="21"><div align="center"><img
src="emoticons/em20.gif" width="16" height="16" onClick="aggiungi('[em20]')"></div></td></tr>
</table>
<br> <table width="185" align="center" bordercolor="#000000"
bgcolor="#E7E9FA" style="border:1px solid;">
<tr>
<td height="21" bgcolor="#BBC2F2"><div align="center"><font
color="#000000" size="2" face="Verdana, Arial, Helvetica,
sans-serif"><strong>MESSAGGIO</strong></font></div></td>
</tr>
<tr>
<td ><form method="POST" action="insert.php" name="form_ins" >
<table width="170" border="0" align="center">
<tr>
<td colspan="2"><div align="center">
<textarea rows="5" onKeyDown="textCounter(this.form.messaggio,this.form.rem,300);" onKeyUp="textCounter(this.form.cjmsg,this.form.rem,300);" cols="18" type="text" name="messaggio"></textarea>
</div></td>
</tr>
<tr>
<td><div align="right"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Lettere
rimaste:</font></div></td>
<td><div align="center">
<input readonly class="stile" type=text name=rem size=3 maxlength=3 value="300">
</div></td>
</tr>
<tr>
<td height="26" colspan="2"> <div align="center">
<?
echo "<input type="hidden" name="nick" value="$nick">";
echo "<input type="hidden" name="password" value="$password">"
?>
<input type="submit" name="Submit" value="Invia messaggio"></div></td>
</tr></table>
</form></td>
</tr>
</table>
</body>
</html>
[/PHP]forse tu chiedevi del peso del file riferito al pezzo:
[PHP]if ($utente_ok==1)
{
if (!(file_exists($file_online)))
{fopen($file_online,"w");}
$dim_file=filesize($file_online);
$dim_max=14000; // Dimensione in bytes massima per ricreare il file online
if ($dim_file>$dim_max)
fopen($file_online,"w");[/PHP]e questo è ins_ut
[PHP]<?
if(!isset($_POST['Submit']))
{
echo "
<script language="javascript">
alert("Non hai i permessi per accedere a questa pagina");
</script>
";exit;
}
?>
<html>
<head>
<title>Registrazione alla chat</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FBBEAA">
<?
include("config.php");
$nick=$_POST['nick'];
$nick=strtolower($nick);/conversione della stringa del nick in minuscolo/
$nick=stripslashes($nick);/toglie gli slashes aggiunti ad una stringa
con addslòashes/
$password=$_POST['password'];
$password=strtolower($password);/conversione della stringa della
password in minuscolo/
$password_cr=crypt($password,$nick);/criptazione di tipo DES della
password usando come chiave la stringa del nick/
$password_cr=str_replace("|","*",$password_cr);/*questa la si definisce
una criptazione aggiuntiva: se nella password criptata sono presenti
| sono sostituiti con * /
$age=(int)$_POST['age'];/qquio si verifica che eta sia intera ,altro controllo
per la sicurezza/
if(!(int)$age)
{
echo "
<script>
alert("Inserimento di un dato non numerico");
history.back();
</script>
";
exit;
}
$sex=$_POST['sex'];
$nation=$_POST['nation'];
$hobbies=$_POST['hobbies'];
$nation=stripslashes($nation);
$hobbies=stripslashes($hobbies);
if (!(file_exists($file_reg)))
{fopen($file_reg,"w");}
$utente_ok=1;
$ut_regist=file($file_reg);/si memorizza il file in un vettore ;ogni
elemento del vettore corrisponde ad ogni riga del file/
$dim_reg=count($ut_regist);/conta le righe del vettore/
/ora che il file è un vettore era meglio utilizzare un foreach
piuttosto che un for/
for ($i=0;$i<$dim_reg;$i++)
{
$utente=chop($ut_regist);/chop è alias di rtrim ed elimina spazi ed
altro dalla fine del file in questo caso dalla riga in cui andremo a
scrivere/
$dati_ut=explode("|",$utente);/considerando ogni riga come un array si
separa ogni elemento dell'array con un |/
$nick_ut=$dati_ut[0];
$pass_ut=$dati_ut[1];
if ( ($nick==$nick_ut) | ($password_cr==$pass_ut) ) $utente_ok=0; /si
controlla che il nick o la passwords nopn esistano/
}
if ($utente_ok==1)
{
if (empty($nick) | empty($password) | empty($nation) | empty($sex) |
empty($hobbies))
{
echo "<center><font face="Verdana" size="2">NON HAI RIEMPITO UNO O
PIU' CAMPI</font></center><br><br>";
echo "<center><font face="Verdana" size="2"><a
href="javascript:history.back();">TORNA INDIETRO</a></font></center>";
}
else /in caso in cui tutti i campi siano stati tutti riempiti/
{
$utente=$nick."|".$password_cr."|".$age."|".$sex."|".$nation."|".$hobbies."\n";
$ins_utente=fopen($file_reg,"a+");/si scive i dati dell'utente nel
vettore-filre/
fputs($ins_utente,$utente);
fclose($ins_utente);
echo "<center><font face="Verdana" size="3">SEI REGISTRATO ALLA CHAT.<br> PER ENTRARE E SCRIVERE NELLA CHAT, CHIUDI QUESTA FINESTRA DI CONFERMA DELL'AVVENUTA REGISTRAZIONE, ED EFFETTUA IL LOGIN INSERENDO NEI DUE RISPETTIVI CAMPI IL NICKNAME E LA PASSWORD SCELTI.</font></center>";
}
}
else
echo "<center>Nick o password già utilizzata.<br><a
href="javascript:history.back();">Torna indietro</a><center>";
?>
</body>
</html>[/PHP]
-
certo è anche che a volte non invia frasi da pochissime parole quindi non sò se possa riguradare il peso del file, comunque sappimi dire io aspetto fiducioso per risolvere il problema.
-
@giulio3x said:
ciao, mi potresti dire cosa intendi per "quanto pesa il file" non capisco, aspetto delucidazioni a riguardo,
Ciao giulio3x,
Penso che ayrton2001 per peso del file intendesse lo spazio occupato (le dimensione del file).
-
mz non lo so ayrton cosa intendevi? comunque sopra ti ho postato il codice sappimi dire, che sono sempre più disperato:bho:
-
Scusatemi, sono stato poco chiaro (stanchezza).
Intendevo la dimenzione del file in cui salvi i messaggi.
Viene azzerato ogni giorno, settimanalmente, mensilmente, oppure mai ?
Me lo chiedo perche magari io faccio delle prove, ma con file piccoli. Se il tuo file ha raggiunto, non so, 10/200 Mb, magari il risultato potrebbe essere diverso.