Newsgroup: it.comp.www.php
Titolo: URL con accenti

Ciao a tutti ho un db contenente i titoli di alcuni libri.
Questa la struttura
[CODE]
lib_id = numerico auto_increment
lib_titolo = testo (200)
[/CODE]
Ora vorrei mostrare l'elenco dei libri con la rispettiva copertina.
Ho quindi creato una cartella (libri) con le immagini delle copertine.
Il nome del file è titolo_libro.jpg e viene poi richiamato nella pagina 
catalogo.php in questo modo:
[CODE]
$strCopertina = row[1];
<img src="libri/<?php echo strCopertina ?>.jpg" />
[/CODE]
Tutto funziona alla perfezione, ma le copertine con il titolo accentato, 
non vengono mostrate. Come risolvo?

 non vengono mostrate. Come risolvo?
La cosa piu` semplice da fare e` normalizzare tutte le accentate in non 
accentate. In pratica è,é diventano e, à diventa a, ecc. ecc.
Sia nel DB che nel filesystem.
Gia` che ci sei, elimina tutto tranne i caratteri alfanumerici e 
l'underscore, quindi un titolo come "L'impiccato è morto, viva 
l'impiccato" diventera` qualcosa tipo 
l_impiccato_e_morto_viva_l_impiccato.jpg
Diversamente dovrai far coincidere tutti i charset piu` uno. :)
In pratica devi avere lo stesso charset sul DB, sugli header del 
webserver, sull'HTML (tramite <meta>) e sul filesystem del server (questo 
dipende dal fs).
Bye.

 accentato, non vengono mostrate. Come risolvo?
[quote 
http://www.php.net/url_encode
]
This function is convenient when encoding a string to be used in a
query part of a URL
[/quote]
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 non vengono mostrate. Come risolvo?
La cosa piu` semplice da fare e` normalizzare tutte le accentate in non 


Ho quindi creato una cartella (libri) con le immagini delle copertine.
Personalmente preferirei usare lib_id come titolo della copertina (quindi
per es. 1.jpg, 2.jpg, o magari "0005.jpg" con sprintf("%05d", $lib_id).
Oppure usa, al posto di $strCopertina, md5($strCopertina).
In alternativa ELIMINA dal nome "uso file system" tutto quello che non e'
a-z_0-9, e appendigli comunque lib_id per evitare collisioni (improbabili
fin che si vuole, ma con certi clienti ho visto succedere l'impossibile -
piu' volte):
	// suppongo che row[0] sia l'id
	$strCopertina = preg_replace('/[^a-z_0-9]/i', '', $row[1])
		. ".$row[0].jpg";
	$txtCopertina = HTMLEntities($row[1]); // Non sono sicuro!
	if (!file_exists("libri/$strCopertina"))
	{
		if (SEI_VERAMENTE_PIGRO)
		{
			copy("CopertinaMancante.jpg", $strCopertina);
			// Cosi' basta tu apra la cartella delle copertine
			// e guardi i nomi dei file in Anteprima. Ma e' un
			// sistema sudicio.
			// Si', ovviamente io uso spesso qualcosa di molto
			// simile :-)
			// E devi poter scrivere nella cartella "libri".
		}
		else
		{
			// Qualcosa bisognera' pur visualizzare.
			$strCopertina = "CopertinaMancante.jpg";
		}
	}
	<img src="libri/<?php echo strCopertina ?>" alt="copertina"
		title="$txtCopertina" />
Leonardo
-- 
While ordinarily valid that being widespread does not make a statement
true, I feel that the diffusion of anti-evolutionary beliefs does pose
a strong argument for Darwin having been, indeed, sorely mistaken.


hai provato con la funzione php urlencode?

 hai provato con la funzione php urlencode?
Sě, ma non mostra piů nemmeno quelle corrette. Evidentemente l'immagine 
con i + al posto degli spazi non gli piace

Scream ha scritto:

La funzione seguente è in javascript. Sostituisci testo con $testo, la 
riga testo=testo.replace("à","&agrave;");  con 
$testo=str_replace("à","&agrave;",testo);, e così via per le righe 
successive, e dovresti essere a posto.
function toglieAccentate(testo)
  {
    testo=testo.replace("à","&agrave;");
    testo=testo.replace("á","&aacute;");
    testo=testo.replace("è","&egrave;");
    testo=testo.replace("é","&eacute;");
    testo=testo.replace("ì","&igrave;");
    testo=testo.replace("í","&iacute;");
    testo=testo.replace("ò","&ograve;");
    testo=testo.replace("ó","&oacute;");
    testo=testo.replace("ù","&ugrave;");
    testo=testo.replace("ú","&uacute;");
    testo=testo.replace("À","&Agrave;");
    testo=testo.replace("Á","&Aacute;");
    testo=testo.replace("È","&Egrave;");
    testo=testo.replace("É","&Eacute;");
    testo=testo.replace("Ì","&Igrave;");
    testo=testo.replace("Í","&Iacute;");
    testo=testo.replace("Ò","&Ograve;");
    testo=testo.replace("Ó","&Oacute;");
    testo=testo.replace("Ù","&Ugrave;");
    testo=testo.replace("Ú","&Uacute;");
    testo=testo.replace("ñ","&ntilde;");
    testo=testo.replace("Ñ","&Ntilde;");
    return testo;
  }

 successive, e dovresti essere a posto.
Non posso togliere le accentate. In pratica funziona così. Ho una pagina 
di riempimento del DB. Io (o altri) inserisco il titolo del libro ed 
altri dati. Carico la copertina che può chiamarsi anche pippo.jpg. La 
copertina viene poi automaticamente rinominata in fase di upload con il 
titolo del libro. Ovviamente incluse le accentate. Avevo anche il 
problema dell'apostrofo risolto con stripslashes, ma quella degli 
accenti resta. Non posso fare riferimento nemmeno all'ID del libro in 
quanto l'id viene dato automaticamente in fase di insert nel db

 nel db
Non vedo il problema.
Effettua l'inserimento, ottieni l'ID del record, salva il file come
$ID.jpg (o $ID.gif etc).


 
Come recupero l'id di un record appena inserito?

 Come recupero l'id di un record appena inserito?
Se usi MySQL: 
http://www.php.net/mysql_insert_id
Altrimenti, a seconda del database o della layer di astrazione, e'
sufficiente che controlli il manuale ufficiale, e' molto probabile che
esista una funzione equivalente.


 Se usi MySQL: 
http://www.php.net/mysql_insert_id
Sì intendevo dire che l'upload viene effettuato prima dell'insert nel dm
Praticamente se non ci sono errori nell'upload, inserisce il nuovo record.

quanto l'id viene dato automaticamente in fase di insert nel db
Ti propongo la soluzione usata da WordPress per i titoli degli
articoli che sono usati poi come nice url.
Il ttolo, viene convertito in una versione senza accenti ed altro
simile a quella che altri ti hanno proposto, WP la chiama nicename, e
questa viene memorizzata nel record dell'articolo, quindi si avrà l'ID
il titolo effettivo il nicenam, il contenuto dell'articolo etc.
Nel tuo caso avrai l'ID il titolo libro, il nicename del libro... le
altre info che ti servono. quando devi mostrare la copertina non
prenderai il titolo del libro per aggiungerci l'estensione jpg e
ottenere l'immagine ma il nicename. Mentre se devi stampare il titolo
del libro userai l'effettivo titolo con acenti e tutto...
In WP si verifica anche che il nicename sia univoco perchè potresti
avere più articoli con titolo identico (cosa che nel tuo caso non si
verificherà) ed il nicename viene generato aggiungendo un numero
prograssivo alla fine per garantirsi l'unicità in  caso di nicename
già esistente.
-- 
Stefano Aglietti - StallonIt on IRCnet - ICQ#: 2078431
Email: 
st...@40annibuttati.it
 
ste...@people.it
Sites: 
http://www.40annibuttati.it
 (personal blog)
 
http://www.wordpress-it.it
 (WordPress Italia)

Scream ha scritto:

Che cosa intendi per "se non ci sono errori nell'upload"?
Che tipo di controlli effettui per capire se e' avvenuto un errore?
La stessa form che effettua l'upload, invia anche i dati da inserire
nel database (intendo con la stessa richiesta HTTP)?


 titolo del libro. Ovviamente incluse le accentate.
Guarda, forse non mi sono spiegato bene, il risultato finale non è di 
sostituire le lettere accentate. Prova a scrivere un file prova.htm come 
segue
<html><head>
</head><body>
prova<a href="&egrave;.htm">&egrave;.htm</a>
<a href="&agrave;.htm">&agrave;.htm</a>
</body></html>
...e guarda il risultato aprendolo in un browser. Il problema, 
effettivamente, potrebbe essere il file system, visto che (almeno sulla 
mia Fedora), in locale (file://[PERCORSO]/prova.htm) non sono riuscito a 
fargli trovare il file "è.htm", anche se lo avevo creato. Tuttavia 
utilizzando Apache (
http://localhost/[PERCORSO]/prova.htm
) non ho avuto 
nessuna difficoltà. Io una prova la farei.

fargli trovare il file "è.htm", anche se lo avevo creato.
A seconda di come hai impostato $LC_ALL, $LC_MESSAGES, $LC_TYPE, $LANG,
$TERM e di quale programma di terminale usi... il fatto che tu PENSI di
aver creato un file "è.htm" non ti dice NIENTE su quello che davvero e'
presente sul disco (sigh), ne' tantomeno su cosa vede Apache quando tu,
nel browser, scrivi "è.htm".
L'unica e' se hai preso il coraggio a quattro mani e passato TUTTO, per
esempio, in UTF-8: terminale, LANG, LC_ALL, filesystem e browser.
Si ha un bel dire, ma il fatto e' che se uno usa solo il subset ASCII-7
_NON_ESISTE_MODO_ di fare casino; in tutti gli altri casi, magari sara'
difficile, improbabile, incredibile, ma IL MODO C'E' - e come insegnano
i seguaci di Murphy, se c'e' un modo in cui le cose possono andare male
puoi star sicuro che qualcuno lo trova senza nemmeno accorgersene.
Leonardo cinico & disincantato


 
Alla fine ho risolto usando l'id come nome dell'immagine.