Codice script - per salvare i file dal pc utente con php:
questo articolo si sviluppa in tre pagine:
In questa pagina analizzeremo il codice dello script e le tabelle mysql correlate.
Tabella database:
Per prima cosa create una tabella nel vostro database utilizzando la seguente query:
CREATE TABLE `foto` (
`id` int(11) NOT NULL auto_increment,
`nomefoto` varchar(100) NOT NULL default '',
`ipfoto` varchar(100) NOT NULL default '',
`commento` varchar(100) NOT NULL default '',
`alt` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
)
(copiate ed incollate il codice nella sezione SQL di PhpMyAdmin)
In pratica abbiamo creato una tabella con i seguenti campi:
- ID campo numerico primario con auto_increment.
- NOMEFOTO il nome della foto(nel nostro caso il timestamp).
- IPFOTO ip del navigatore che ha inserito la foto.
- COMMENTO commento del navigatore che ha inserito la foto.
- ALT il nome originale della foto mostrato con ALT="..." nel tag IMG.
Codice script:
Dopo aver creato la tabella potrete inserire il codice php e html come nell'esempio qua sotto.
Nelle note riportate potrete leggere la spiegazione dello script. Se durante il copia incolla le
note risulteranno su più righe potrete visualizzare un errore a video (accertatevi che ogni riga che
inizia con // termini sulla stessa riga!!).
<?
//INIZIO SCRIPT DI SALVATAGGIO DATI (se l'utente ha attivato il form)
//recupero le variabili del form
$hfoto=$_GET['hfoto'];
$termini=$_POST['termini'];
$newfoto=$_POST['newfoto'];
$attivaform=$_POST['attivaform'];
$commento=strip_tags($_POST['commentofoto']);
//variabili del database (le conoscete SOLO VOI!!)
$database="..nome_del_vostro_database..";
$hos="localhost";
$user="..Vostro_user_database..";
$pass="..Vostra_password_database..";
$link = mysql_connect($hos,$user,$pass);//variabile di connessione database
//FINE variabili database
if($attivaform==2){//se il form è stato attivato proseguo
if($termini==2){//se il box 'termini e condizioni' è stato attivato proseguo
$grand=filesize($_FILES['newfoto']['tmp_name']);//Controllo la grandezza della foto
if($grand<=1000){//Se la foto è minore di 1000 byte proseguo. Dato da variare in funzione alle tue esigenze
if ($_FILES['newfoto']['type'] == "image/gif" or $_FILES['newfoto']['type'] == "image/jpg" or $_FILES['newfoto']['type'] == "image/jpeg"){//se la foto è uno di queti tre formati proseguo
copy ($_FILES['newfoto']['tmp_name'], "/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$_FILES['newfoto']['name']);//copio la foto nella directory che ho creato (deve avere tutti i permessi di scrittura attivi)
$foto3=$_FILES['newfoto']['name'];
//CONTROLLO SE ESISTE UN NOME UGUALE NELLA DIRECTORY (Praticamente impossibile perchè il nome foto è il timestamp di salvataggio, comunque...):
$ra=time();//variabile con il timestamp
$veriffoto="/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$ra.".jpg";
while(is_file($veriffoto)){//Proseguo con il ciclo while fino a quando non trovo un nome libero
$ra=time();
$veriffoto="/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$ra.".jpg";
}
$foto4=$ra;
//MEMORIZZO I DATI NEL DATABASE
$ipfoto=$_SERVER['REMOTE_ADDR'];//ricavo l'ip del navigatore
mysql_db_query($database,"insert into foto (nomefoto, ipfoto, commento, alt) values('".$foto4."', '".$ipfoto."', '".$commento."', '".$foto3."')",$link);
//adesso cambio il nome della foto
rename("/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$foto3, "/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$foto4.".jpg");//Rinomino la foto che in precedenza avevo salvato con il suo vero nome
$errornewfoto=2;//nessun errore
}
else{
$errornewfoto=3;//formato NON supportato
}
}
else{
$errornewfoto=4;//foto troppo grande
}
}
else{
$errornewfoto=5;//termini e condizioni NON letti
}
}
//MESSAGGI DI ERRORE O CONFERMA
if($errornewfoto==2){echo"<br><br><center>FOTO INSERITA CON SUCCESSO</center><br><br>";}
if($errornewfoto==3){echo"<br><br><center>FORMATO FOTO NON SUPPORTATO<BR>La foto NON è stata salvata</center><br><br>";}
if($errornewfoto==4){echo"<br><br><center>FOTO TROPPO GRANDE<BR>La foto NON è stata salvata</center><br><br>";}
if($errornewfoto==5){echo"<br><br><center>TERMINI NON LETTI<BR>La foto NON è stata salvata</center><br><br>";}
//DA ADESSO CHIUDO CON php E PROSEGUO CON IL FORM HTML
?>
<center>
<table width="500" cellpadding="15">
<tr><td align="center">
<fieldset style="margin:10px 0px 0px 0px">
<legend>Inserisci una foto:</legend>
<div style="padding:3px">
<form action="nome_vostra_pagina_utilizzo_form" method="post" enctype="multipart/form-data">
<input type="hidden" name="attivaform" value="2">
<textarea rows="8" cols="80" wrap="virtual" style="background:#FFFFE6 ; font-size: 9px; COLOR: #C0C0C0; FONT-FAMILY: Verdana, arial;">
Termini, condizioni e privacy
ASSOLUTAMENTE VIETATO:
- Inserire foto che possono risultare: offensive, pornografiche, a sfondo razziale, illegali secondo leggi vigenti italiane ed internazionali.
- Inserire immagini coperte da copyright (anche se ne siete i proprietari).
- Inserire immagini che possano violare la privacy di terze parti.
ALTRE CONDIZIONI:
- TUTTE le immagini inserite potranno essere cancellate SOLO dal webmaster del sito allwebfree.it
- Il navigatore è il solo responsabile del materiale da lui stesso salvato.
- Tutto ciò che è legato direttamente ed anche indirettamente all'utilizzo del seguente script può variare o cessare senza preavviso o comunicazione alcuna.
- Il codice IP di chi inserisce l'immagine, la data e l'ora dell'inserimento sono visibili da ogni utente.
</textarea><br>
Ho letto ed accetto le condizioni
<font color="red"><b>*</b></font><input type="checkbox" name="termini" value="2">
<br>
<br>
<font color="blue" size="2"><b>Carica foto:</b></font><br>
Puoi inserire immagini di formato .jpg .jpeg .gif<br>
e con grandezza NON superiore a 100 byte (piccole).<br>
Per motivi di spazio nello script di esempio le immagini saranno visibili con formato 60x60px.<br>
<input type="file" name="newfoto" size="18"><br>
<br>
<input type="text" name="commentofoto" value="commenta..." size=30 maxlength=100><br>
<br>
<input type="submit" style="font-size : 10px; color : blue; background:#CECEFF ; font-family :verdana, arial; font-weight : bold;" value="Invia"><br>
<b>N.B.</b> Devi attendere che la foto sia caricata sul nostro sito
</form>
</div>
</fieldset>
</td></tr></table>
</center>
<br>
<br>
<br>
<center><h3>FOTO INSERITE:</h3></center>
<center>Le foto sono ordinate per data di inserimento<br>
Per motivi di spazio saranno visibili con formato 60x60px.</center><br>
<br>
<br>
<?
//RIAPRO php E MOSTRO LE FOTO FINORA SALVATE
$queryfoto=mysql_db_query($database,"select * from foto order by nomefoto DESC ",$link);
$risultati=mysql_num_rows($queryfoto);
//TROVO IL NUMERO DI PAGINE
$rispag=15;//15 sono i risultati per pagina (5 file da 3) modificatelo in funzione delle vs. esigenze
$numpag=ceil($risultati/$rispag);//numero di pagine
//agisco sulle variabili del ciclo while (vedi sotto) per estrarre SOLO i risultati che mi interessano (in base al numero di pagina)
if(!isset($hfoto) or $hfoto==0){$aa=0; $risultati2=$rispag;}//se sono alla pagina iniziale mostro i primi 15 risultati
else{$aa=$hfoto*$rispag; $risultati2=$aa+$rispag;}//altrimenti mostro i risultati in base al numero della pagina
if($risultati2>$risultati){$risultati2=$risultati;}//se sono nell'ultima pagina evito di mostrare risultati inesistenti
//TABELLA CON IL NUMERO DI PAGINE E LORO LINK
echo"<fieldset style=\"margin:10px 0px 0px 0px\">
<legend>".$numpag." pagine:</legend>
<div style=\"padding:3px\">";
for($aa3=0;$aa3<$numpag;$aa3++){
$aa3b=$aa3+1;//$aa3b deve essere una unità superiore al reale numero della pagina, altrimenti partiamo dalla pagina zero, la usiamo solo per mostrare il numero di pagina al navigatore, nel link utiliziamo $aa3
echo" <a href=\"articolo_php_salvare_dati_da_pc_utente_2.php?hfoto=".$aa3."\">".$aa3b."</a> ";
}
echo"</div>
</fieldset>";
$aa2=0;//veriabile per andare 'a capo' nella tabella delle foto
echo"<table width=\"100%\"><tr>";
while($aa<$risultati2){//Queste due variabili sono risultate dalle pagine trovate
//ESTRAGGO I DATI DAL DATABASE
$nomefoto=@mysql_result($queryfoto,$aa,"nomefoto");
$timefoto=date('d-m-y H:i:s',$nomefoto);
$ipfoto=@mysql_result($queryfoto,$aa,"ipfoto");
$commento=@mysql_result($queryfoto,$aa,"commento");
$alt=@mysql_result($queryfoto,$aa,"alt");
if($aa2==3){echo"</tr><tr>"; $aa2=0;}//se modifico questo dato (adesso 3) ottengo + o - risultati per riga
echo"<td align=\"center\"><img width=\"60\" height=\"60\" src=\"nome_vostra_directory_foto/".$nomefoto.".jpg\" alt=\"".$alt."\"><br>
<font size=\"1\">
Inserito il ".$timefoto."<br>
Da:".$ipfoto."<br>
</font>
COMMENTO:<br>
".$commento."
</td>";
$aa++;
$aa2++;
}
echo"</tr></table>";
?>
Spiegazione:
Lo script in oggetto è formato da due script che agiscono in contemporanea. Il primo
memorizza le immagini, i commenti ed i dati, mentre il secondo estrae tutte le informazioni
dal database mostrando le immagini a video:
- ricavo e memorizzo foto e dati
Questo passaggio è inserito all'inizio pagina
perchè altrimenti nella fase (successiva) di lettura dati non troveremo i dati appena salvati
(che sarebbero ancora da salvare).
- Form
Codice html con form per l'inserimento dei dati.
- script lettura dati:
- Leggo i dati dal database.
- Trovo il numero di pagine ottenute (in base al numero dei dati) e li scrivo con il
link relativo in una tabella.
- Scrivo i dati ottenuti dal database mostrando l'immagine
Da notare che per ragioni pratiche in questo script le immagini sono salvate TUTTE con formato .jpg ,
a prescindere dal loro formato iniziale.
Sussiste inoltre un limite alla sicurezza molto grosso. In pratica per velocizzare la stesura dello
script e per escludere dati dal database abbiamo associato il nome della foto al timestamp
del salvataggio.
Un malintenzionato potrebbe creare una foto con lo stesso nome di una foto già contenuta nel database
e potrebbe cancellarla nel momento del salvataggio (questo è possibile perchè salviamo la foto
prima ancora di rinominarla).
Per ovviare a questo problema basta inserire un ciclo IF e controllare se nella directory esiste
già una foto con quel nome prima del salvataggio (il codice è molto simile al primo ciclo while).
Errori e modifiche:
Per utilizzare lo script dovete necessariamente modificare alcuni dati:
1) Le variabili di collegamento database (Sono variabili che conoscete solo voi).
2) Al posto delle righe
/home/httpd/vhosts/nome_vostro_sito/httpdocs/nome_vostra_directory_foto/
dovrete inserire l'indirizzo per la connessione alla directory dove avete salvato le immagini (chiedete al supporto del vostro spazio, oppure verificate sul vostro programma FTP).
3) Nella riga iniziale del form dovrete inserire l'indirizzo della pagina che utilizza lo script.
Il codice sopra descritto è lo stesso codice che gira nella pagina di esempio. Tutti
i possibili errori che potrebbero nascere dal suo utilizzo sono errori dovuti all'errata
battitura del testo.
Come già detto nella prima pagina ricordate che TUTTI I COMMENTI DEVONO STARE SULLA STESSA RIGA!!
Se avete dubbi sulla loro inclusione cancellateli.