ciclo con file

ciao

sto cercando di creare un semplice GuestBook che si basa su un file di testo con questa struttura:

(sto scopiazzando un pò da un gb che ho trovato in giro)

###@###ora::nome::messaggio###@###ora::nome::messaggio###@###ora::nome::messaggio ecc...

dove il ###@###divide i messaggi e il :: i campi del messaggio

fin qui ok... poi devo per recuperare il numero di messaggi:

step=10; 
$fp = fopen($filegb, 'r'); 
$content=fread($fp, filesize($filegb)); // contenuto del file 
$rd=explode("###@###", $content ); // rd è il vettore che contiene i messaggi 
fclose($fp); 

$num=count($rd)-1; // numero totale di messaggi (non so perchè devo fare -1) 
$pages=ceil ($num/$step); // restituisce la il risultato arrotondato per eccesso OK

recupero il numero dei mex e ho creato un vettore RD che contiene i messaggi in forma:

ora::nome::messaggio

per visualizzare i messaggi ho fatto il seguente ciclo:

for($c=$s;$c<=$s+$step-1;$c++){ 
if($c<=$num-1){ 
$com=explode("::",$rd[$c]); 
$ora=($com[0]); 
$nomex=stripslashes($com[1]); 
echo"<font color='green'><br>$ora - Nome:</b><font color='black'> ".$nomex; 
$mex=stripslashes($com[2]); 
echo"<font color='green'><br>Messaggio: </b><font color='black'> ".$mex; 
echo"<br>"; 
} 
}

il problema è: che non vedo mai l' ultimo messaggio e cosa piu strana prima del primo messaggio tenta di estrarre qualche cosa dal vettore RD e quindi mi da errore:

Notice: Undefined offset: 1 in f:\programmi\easyphp1-8\www\fm\gb\gb.php on line 100

Notice: Undefined offset: 2 in f:\programmi\easyphp1-8\www\fm\gb\gb.php on line 102

qualcuno di voi può aiutarmi ??

grazie...

inviato 10 anni fa
urbanus
X 0 X

Controlla i valori dei cicli, probabilmente tu pensi al primo messaggio come messaggio 1, mentre per lui il primo messaggio è il messaggio 0 (zero).

Altra cosa, ma perché ti complichi tanto la vita?

Se metti alla fine di ogni messaggio un carattere di fine riga, nel tuo file ogni messaggio va a capo, poi recuperi il file con un $riga = file("tuofile");

così, $riga è già un vettore e per sapere quanti messaggi hai, ti basta fare un count su $riga.

Così in un ciclo, puoi benissimo leggere il messaggio:

for ($index = 0; $index <= count($riga) - 1; $index++) {
list($ora,$data,$autore,$messaggio) = explode("§", $riga[$index]);
echo "$ora, $data, $autore, $messaggio";
}

Ovviamente ogni riga del file deve essere formattata con un carattere particolare o una serie di caratteri, ma tutta la struttura alla fine risulta più semplice da gestire.

risposto 10 anni fa
Marco Grazia
X 0 X

lo già fatto nella precedente versione con quel sistema... ma ci nono altre complicazioni che non sono prorpio riuscito a risolvere (ho chiesto info anche qui):

andare a capo nella textarea ad esempio nel file cosi strutturato diventerebbe un nuovo messaggio quando invece fa sempre parte del precedente... ed è inutile utilizzare la funzione nl2br perchè nel momento della scrittura su file la riga va comunque a capo andando a creare un nuovo messaggio errato....

per questo ho utilizzato questa nuova struttura (che funziona perfettamente sul codice che ho copiato  ) ma che da me da qlc errore.... 

nel caso mi toccherà fare tutto da zero...

però se intanto potete dare una occhiata al codice che ho postato....

grazie

risposto 10 anni fa
urbanus
X 0 X

Ti avevo già risposto, probabilmente non controlli l'inizio di ogni ciclo, vedi se parte da zero o da uno.

Per andare a capo nella text area, puoi benissimo sostituire gli a capo con caratteri tuoi, così tra l'altro oltre che a risolvere il problema degli a capo nel file, controlli meglio anche la formattazione.

Magari con una funzione tipo questa: (presa dalla documentazione online di nl2br)

function nl2brStrict($text, $replacement = '[br /]')
{
   return preg_replace("((\r\n)+)", trim($replacement), $text);
}

Che rimpiazza tutte le occorrenze di a capo e nuova linea con una pseudo funzione di break. Ma è solo un'idea ovvio.

risposto 10 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda