Newsgroup: it.comp.www.php
Titolo: Come rinominare le immagini

  Ciao a tutti,
  e' la prima volta che scrivo in questo NG, non sono esperto e spero 
che mi perdonerete qualche domanda stupida... :°)
  Ho un problema piu' concettuale che specifico del PHP: devo
associare una foto ad un record e non so come farlo per bene. Ho
pensato questo: ad ogni inserimento, la foto viene rinominata in base
ad un numero progressivo, memorizzato in un file, il cui contenuto
viene incrementato ogni volta.
  La cosa funziona ma mi viene il dubbio che sia poco affidabile, per 
questo chiedo a voi: e' una procedura corretta o siamo fuori dal 
mondo?
  Un saluto a tutti e grazie per la pazienza, :°)
-- 
Gianfranco Bertozzi
Linux User #183585

 viene incrementato ogni volta.
Io gestisco un portale di annunci, dove ad ogni annuncio sono associate n 
foto. Io salvo le immagini nominandole così: numeroannuncio_numerofoto.jpg 
in tal modo posso richiamare quando voglio la n-esima foto dal k-esimo 
annuncio. 

 foto. Io salvo le immagini nominandole così: numeroannuncio_numerofoto.jpg 
  Grazie infinite, anche per la celerita'. :-)
  Il numeroannuncio come lo ottieni? Io avevo pensato di usare il
campo "id" del mio record (autoincrement) ma non mi riesce facile.
Usando "last_insert_id" (che ho trovato in rete) non ottengo quel che
voglio (ma forse sbaglio la sintassi), cosi' ho ripiegato su un file
esterno al database che contiene il numero progressivo.  L'alternativa
e' memorizzare la foto, caricare il record, estrarre l'id e rinominare
la foto. Pero' mi sembra una complicazione inutile. :-o
  Saluti e ancora grazie,




Io di recente mi sto buttando su un sistema leggermente diverso, per gestire
piu` immagini per ogni "entry", con thumb e simili associati.
Uso sempre l'id del DB, ma ho una sintassi tipo
orig_2_123456.jpg
thumb_2_123456.jpg
La prima parte e` il tipo di immagine (originale come uploadata, thumbnail,
mini, bordered, watermarked, ecc. ecc.)
La seconda parte e` l'id del DB.
La terza e` il timestamp in cui e` stata uploadata.
La quarta e` l'estensione :)
In questo modo ho le immagini nell'ordine in cui sono state caricate, posso
scambiarle di posto semplicemente rinominandole e scambiando il timestamp
(che in realta` non mi serve ad altro che a tenerle ordinate), non devo
impazzire per vedere se un numero e` in sequenza per assegnarlo (per
esempio, cosa succede se carichi 3 immagini, cancelli la seconda e ne
inserisci un'altra?), ho sempre la versione originale del file, posso
associare altri tipi di informazioni (description_2_123456.txt per esempio)
alla stessa immagine, ma soprattutto bastano un paio di explode ("_" e ".")
sul nome del file per ricavare tutte le informazioni e gestirle come
preferisco.
Mi sto costruendo una classe, un po' alla volta, che fa tutte queste
operazioni in automatico, e che crea anche i thumbnail e simili in
automatico quando non ci sono, ricreandoli quando il timestamp
dell'originale e` successivo a quello dei thumb, ecc. ecc.
Bye.

 la foto. Pero' mi sembra una complicazione inutile. :-o
Uso esattamente il campo id del record dell'annuncio, che è appunto un 
autoincrement. Lo ottengo con la funzione mysql_insert_id() appena inserito, 
oppure richiamandolo direttamente dal db. 


Io invece memorizzo le immagini con un numero progressivo. Se ne viene 
cancellata una, le successive vengono rinominate decrementando il numero, in 
modo che la prossima immagine inserita sarà sempre ultima nella sequenza 
numerica. 

mondo?
Puo' anche andare bene, se gestisci correttamente il locking del file
(che succede se due processi PHP leggono il file, estraggono "N", poi
lo incrementano, salvano il nuovo file con "N+1"? Hai un file intatto
e con un numero valido; la sequenza di file e' valida... ma invece di
due immagini, ne hai una sola).
Meglio utilizzare tempnam() in questi casi.
Per quantita' elevate di files, ti puo' convenire usare un albero con
piu' sottodirectory (che so, da 10 a 99). Generi il path con random()
opportunamente seed()ato, in modo da tenerlo bilanciato... il massimo
numero di file in una directory per un accesso efficiente dipende dal
file system e dal sistema operativo.
In alcuni sistemi ti puo' convenire una directory con diecimila file,
in altri dieci directory 01/, 02/... con mille file e in altri ancora
cento directory con cento file ciascuna.
Su sistemi Windows puo' essere conveniente generare nomi 8.3 (la cosa
e' controversa e dipende da com'e' configurato il file system: mi par
d'aver capito che, di serie, conviene; al massimo, non ci guadagni un
tubo. Di sicuro mi pare che tu non ci rimetta niente a farlo).
Leonardo
-- 
Next in importance to freedom and justice is popular education, without which neither can be permanently maintained.
James A. Garfield (1831 - 1881)

 autoincrement. Lo ottengo con la funzione mysql_insert_id() appena inserito, 
  Ok, ti ringrazio molto: ho fatto come hai detto tu e tutto funziona. 
Avevo avuto dei problemi solo perche' chiamavo quella funzione _prima_
di eseguire la query di inserimento... :°)
  Grazie ancora,


 piu' sottodirectory (che so, da 10 a 99). Generi il path con random()
  Non credo che sia il mio caso, penso che il mio DB sara' popolato al
massimo da un centinaio di record (sempre che qualcuno lo popoli). :-)
  Ciao e grazie,
-- 
Gianfranco Bertozzi
http://www.locandamilu.it
Linux User #183585

uguali
No. Se fai INSERT e chiami LastInsertId da due processi PHP separati, i
due ID che ricevi saranno *sempre* diversi (cosi' il manuale MySQL).
