Newsgroup: it.comp.www.php
Titolo: Newbie... problemi in scrittura file

Ho un file di testo con un record per ogni riga di questo tipo:
user||pass||nome||numeroaccessi
Ho già uno script che verifica l'esistenza di username e password.
In questo caso lo script apre una pagina altrimenti ne apre un'altra.
Mi servirebbe di incrementare di 1 il numero degli accessi, ma
non riesco a scrivere sul file, tantomeno a scrivere nel posto giusto.
Il file viene aperto con una fopen() e per la lettura viene incrementato
l'handler e viene letta una riga. Per come è implementato dopo che viene
trovata la riga dove devo scrivere viene incrementato l'handler nuovamente.
A questo punto mi servirebbe una mano per tornare nella riga giusta e
scrivere
il nuovo numero degli accessi che ho già memorizzato e incrementato.
Sembrava semplice da farsi con una fseek() ed una fwrite() ma non mi
funziona.
Chiedo aiuto!!!!
Grazie

 Il file viene aperto con una fopen() e per la lettura viene incrementato
Io normalmente faccio così:
uso file() per leggere il file di testo, in questo modo creo un array dove
ogni elemento di quest'ultimo contiene una riga del file di testo.
es:
if($righe_db = @file("/tuo_percorso/tuo_file")) die ("impossibile leggere il
db dei dati");
a questo punto creo un array per ciascun campo del db di testo splittando in
corrispondenza del tuo simbolo divisore ||
es:
foreach($righe_db as $val) {
  list ($user[], $pass[], $nome[], $numeroaccessi[]) = split ('||', $val);
}
a questo punto è facile, perchè ti basta con dei for o foreach scorrerti
l'array $user, quando trovi la giusta corrispondenza incrementi il
corrispondente indice dell'array $numeroaccessi, infine con un altro ciclo
su l'array $user riscrivi il file unendo i valori degli vari array con il
tuo divisore ||
es:
foreach($user as $chiave=>$val) {
    if ($val==$_POST['user']) $numeroaccessi[$chiave]++;
}
$fp=fopen("/tuo_percorso/tuo_file", "w");
foreach($user as $chiave=>$val) {
    fwrite($fp,
$val."||".$pass[$chiave]."||".$nome[$chiave]."||".$numeroaccessi[$chiave]."\
n");
}
fclose ($fp);
il procedimento logico è questo, cmq verifica la correttezza visto che l'ho
scritto al volo.
ciao,
ste

 db dei dati");
scusa erratissima corridge,
if(!$righe_db = @file("/tuo_percorso/tuo_file")) die ("impossibile leggere
il db dei dati");
ste

 ha scritto nel messaggio
news:Qavac.17071$jY1....@tornado.fastwebnet.it...


  $puntatore = fopen("pass.txt", "r+");
"$puntatore--" non significa assolutamente niente. Quello che vuoi fare
e' "riavvolgere" il file, e quello caso mai lo fai con fseek e ftell.
Una volta che lo avrai fatto, scoprirai che col decimo accesso perdi la
linea sottostante. Infatti, tu leggi diciamo 30 bytes, ma incrementando
il 9 (un byte) ti diventa 10 (due byte), e riscrivendo la riga, ammazzi
l'ultimo carattere della riga stessa (il "\n"), e/o il primo della riga
subito dopo.
L'unica soluzione pratica, a parte usare i DB, e' riscrivere *TUTTO* il
file ogni volta (be', c'e' la soluzione stron^WMicrosoft... consistente
nello scrivere il numero di accessi come 000009, 000010, 000011..., ma,
personalmente, la trovo poco dignitosa).
E a quel punto, devi affrontare il problema del locking, se hai mai due
accessi contemporanei:
	A legge
	B legge
	A aumenta gli accessi da 15 a 16
	B aumenta gli accessi da 30 a 31
	A scrive il valore aggiornato, 16
	B scrive il valore aggiornato, 31, e cancella la modifica
	  fatta da A
	A chiude il file (e corrompe alcuni file system)
	B chiude il file
...per quello, ti serve la funzione flock() e forse la gestione di file
di semaforo, rinominare file, stale lock e un po' di altra robba che se
ricordo bene e' nella pagina delle note di flock() sul manuale.
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.