Rettifico, inoltre non capisco perchè non mi fa i controlli dell'estensione, ho provato a caricare un file pdf, non mi compare nessun messaggio d'errore, sulla cartella nn me lo carica, ma in db si!
:$
ciao
a parte che non so da dove provengano $nome e $prezzo (devi aggiungerle) e che non ho fatto il db quindi non provato a mysql_query, per il resto funzia tutto, il var_dump della query risulta corretto.
una piccola cosa devo verificare che non ti carichi più di 4 immagini nella cartella comunque si puo fare uno script a parte che elimini quelle in eccesso che non sono in tabella (forse si fa prima)
PHP:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title></title>
</head>
<body>
<?php
if(isset($_POST['invia'])){
$ammessi=array('jpg','gif');
$size=2097152;
$dir="pinco_pallo/";
//metto questi due per vedere meglio la query
$nome="Sempronio";
$prezzo="5000";
if($_FILES['files']['name'][0]==""){
echo "non hai selezionato alcun file<br />";
}else{//inizio i controlli
foreach($_FILES['files']['name'] as $ch => $nome_file){
$est=strtolower(pathinfo($nome_file, PATHINFO_EXTENSION));
if (!in_array($est, $ammessi)) {//verifica estenzione
//se non ammessi elimino
unset($_FILES['files']['name'][$ch],$_FILES['files']['type'][$ch], $_FILES['files']['tmp_name'][$ch],$_FILES['files']['error'][$ch],$_FILES['files']['size'][$ch]);
}else{
//verifico che sia rimasto qualcosa
if(count($_FILES['files']['name'])>0){
if($_FILES['files']['size'][$ch] >$size){
//verifico la grandezza se maggiore elimino
unset($_FILES['files']['name'][$ch],$_FILES['files']['type'][$ch], $_FILES['files']['tmp_name'][$ch],$_FILES['files']['error'][$ch],$_FILES['files']['size'][$ch]);
}else{
//riverifico che sia rimasto ancora qualcosa
if(count($_FILES['files']['name'])>0){
//sposto nella cartella
if(move_uploaded_file($_FILES['files']['tmp_name'][$ch],$dir.$_FILES['files']['name'][$ch])){
//file caricato quindi prendo il nome del file per il db
$per_db[]=$_FILES['files']['name'][$ch];
}//fine if spostamento
}//fine controllo grandezza
}//fine secndo if rimasri
}//fine primo if rimasri
}//fine if ammessi
}//fine del foreach controlli
//a questo punto dovrebbero essere rimasti solo i nomi di files validi se ne sono rimasti
//riverifico se ci sono file OK
if(count($per_db) > 0){
//devo considerare che in tabella ho 4 posti riservati al nome delle immagini
//quindi se ne ho caricati meno devo comunque preparari per il db
for($k=0; $k < 4; $k++){
//verifico che l'elemento $k esista o no
if(!isset($per_db[$k])){
//non esiste quindi lo prdispongo
$per_db[$k]="";
}
}
//e qui dovrei aver finito (finalmente)
//dati di connessione
$query="INSERT INTO prova(nome, prezzo,immagine, img2, img3,img4)
VALUES('$nome','$prezzo','".$per_db[0]."','".$per_db[1]."','".$per_db[2]."','".$per_db[3]."')";
var_dump($query);
//mysql_query($query);
}else{
echo "file non caricati o non inseriti";
}
}//fine files esistono
}//fine submit
?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST" enctype="multipart/form-data">
<input type="file" name="files[]" id="files" size="40" multiple/>
<input type="submit" name="invia"/>
</form>
</body>
</html>
ciao
a parte che non so da dove provengano $nome e $prezzo (devi aggiungerle) e che non ho fatto il db quindi non provato a mysql_query, per il resto funzia tutto, il var_dump della query risulta corretto.
una piccola cosa devo verificare che non ti carichi più di 4 immagini nella cartella comunque si puo fare uno script a parte che elimini quelle in eccesso che non sono in tabella (forse si fa prima)
PHP:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title></title>
</head>
<body>
<?php
if(isset($_POST['invia'])){
$ammessi=array('jpg','gif');
$size=2097152;
$dir="pinco_pallo/";
//metto questi due per vedere meglio la query
$nome="Sempronio";
$prezzo="5000";
if($_FILES['files']['name'][0]==""){
echo "non hai selezionato alcun file<br />";
}else{//inizio i controlli
foreach($_FILES['files']['name'] as $ch => $nome_file){
$est=strtolower(pathinfo($nome_file, PATHINFO_EXTENSION));
if (!in_array($est, $ammessi)) {//verifica estenzione
//se non ammessi elimino
unset($_FILES['files']['name'][$ch],$_FILES['files']['type'][$ch], $_FILES['files']['tmp_name'][$ch],$_FILES['files']['error'][$ch],$_FILES['files']['size'][$ch]);
}else{
//verifico che sia rimasto qualcosa
if(count($_FILES['files']['name'])>0){
if($_FILES['files']['size'][$ch] >$size){
//verifico la grandezza se maggiore elimino
unset($_FILES['files']['name'][$ch],$_FILES['files']['type'][$ch], $_FILES['files']['tmp_name'][$ch],$_FILES['files']['error'][$ch],$_FILES['files']['size'][$ch]);
}else{
//riverifico che sia rimasto ancora qualcosa
if(count($_FILES['files']['name'])>0){
//sposto nella cartella
if(move_uploaded_file($_FILES['files']['tmp_name'][$ch],$dir.$_FILES['files']['name'][$ch])){
//file caricato quindi prendo il nome del file per il db
$per_db[]=$_FILES['files']['name'][$ch];
}//fine if spostamento
}//fine controllo grandezza
}//fine secndo if rimasri
}//fine primo if rimasri
}//fine if ammessi
}//fine del foreach controlli
//a questo punto dovrebbero essere rimasti solo i nomi di files validi se ne sono rimasti
//riverifico se ci sono file OK
if(count($per_db) > 0){
//devo considerare che in tabella ho 4 posti riservati al nome delle immagini
//quindi se ne ho caricati meno devo comunque preparari per il db
for($k=0; $k < 4; $k++){
//verifico che l'elemento $k esista o no
if(!isset($per_db[$k])){
//non esiste quindi lo prdispongo
$per_db[$k]="";
}
}
//e qui dovrei aver finito (finalmente)
//dati di connessione
$query="INSERT INTO prova(nome, prezzo,immagine, img2, img3,img4)
VALUES('$nome','$prezzo','".$per_db[0]."','".$per_db[1]."','".$per_db[2]."','".$per_db[3]."')";
var_dump($query);
//mysql_query($query);
}else{
echo "file non caricati o non inseriti";
}
}//fine files esistono
}//fine submit
?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST" enctype="multipart/form-data">
<input type="file" name="files[]" id="files" size="40" multiple/>
<input type="submit" name="invia"/>
</form>
</body>
</html>
ora ho aggiunti i 2 campi di testo di prima. E devo aggiungere i 2 controlli soliti, dove li inserisco questi? Ho provato subito dopo ISSET ma non funzia
PHP:
//*******CNTR TESTO ********
$err="";//metti a vuoto una stringa
$nome=trim($_POST['nome']);
//reg_match('/^[a-z0-9]{5,15}/i'
if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20
$err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori
}
$prezzo=trim($_POST['prezzo'])+0.0;
if($prezzo==0 || !is_numeric($prezzo)){
$err.="prezzo non valido<br />";
}
//*******FINE CNTR TESTO **********
ciao
scusa avevo letto male
i controlli devi metterli subito dop l'if isset
PHP:
if(isset($_POST['invia'])){
$err="";//metti a vuoto una stringa
$nome=trim($_POST['nome']);
//reg_match('/^[a-z0-9]{5,15}/i'
if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20
$err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori
}
$prezzo=trim($_POST['prezzo'])+0.0;
if($prezzo==0 || !is_numeric($prezzo)){
$err.="prezzo non valido<br />";
}
//*******FINE CNTR TESTO **********
if($err==""{
//presegui con le immagini
}else{
//mostri l'errore e torni al form
}//....
ciao
scusa avevo letto male
i controlli devi metterli subito dop l'if isset
PHP:
if(isset($_POST['invia'])){
$err="";//metti a vuoto una stringa
$nome=trim($_POST['nome']);
//reg_match('/^[a-z0-9]{5,15}/i'
if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20
$err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori
}
$prezzo=trim($_POST['prezzo'])+0.0;
if($prezzo==0 || !is_numeric($prezzo)){
$err.="prezzo non valido<br />";
}
//*******FINE CNTR TESTO **********
if($err==""{
//presegui con le immagini
}else{
//mostri l'errore e torni al form
}//....
ciao
come hai visto in tabella ci possono andare al massimo 4 nomi di immagini, se es un utente carica 5 immagini
solo i nomi di 4 antrano in tabella, uno no.
quindi potresti fare: script che legge i file immagini nella directori e verifica se sono in tabella, se non lo trova elimina il file
PHP:
<?php
$dir="pinco_pallo/";
$file_excess=glob($dir."*.jpg");
$file_excess=array_merge($file_excess,glob($dir."*.JPG"));//il difetto di glob è che è casesensitive
//e se le hai gli altri tipi di immagini
$file_excess=array_merge($file_excess,glob($dir."*.png"));
$file_excess=array_merge($file_excess,glob($dir."*.gif"));
//ricavo i nomi dei file senza percorso
$file_excess=array_map("basename",$file_excess);
//qui i dati di connessione
foreach($file_excess as $ch => $excess){
//se c'è puo essere in uno dei 4 campi riservati alle immagini
$query="SELECT * FROM prova WHERE immagine='$excess' OR img2='$excess' OR img3='$excess' OR img4='$excess'";
$ris=mysql_query($query);
if(mysql_num_rows($ris)==0){//se 0 il nome non è in tabella
unlink($dir.$excess);//quindi lo cancello
}
}
?>
io personalmente non lo metterei assieme a quello con cui l'utente carica le immagini, ma mi farei un file a parte
chiamato es. pulisci.php e lo lancerei ogni tanto
oppure farei sempre un file a parte da inserire con un include
PHP:
<?php
if(isset($_POST['invia'])){
$err="";//metti a vuoto una stringa
$nome=trim($_POST['nome']);
//reg_match('/^[a-z0-9]{5,15}/i'
if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20
$err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori
}
$prezzo=trim($_POST['prezzo'])+0.0;
if($prezzo==0 || !is_numeric($prezzo)){
$err.="prezzo non valido<br />";
}
//*******FINE CNTR TESTO **********
if($err==""{
//presegui con le immagini
//alla fine se tutto ok
require_once "pulisci.php";//qui
}else{
//mostri l'errore e torni al form
}//....
?>
ciao
come hai visto in tabella ci possono andare al massimo 4 nomi di immagini, se es un utente carica 5 immagini
solo i nomi di 4 antrano in tabella, uno no.
quindi potresti fare: script che legge i file immagini nella directori e verifica se sono in tabella, se non lo trova elimina il file
PHP:
<?php
$dir="pinco_pallo/";
$file_excess=glob($dir."*.jpg");
$file_excess=array_merge($file_excess,glob($dir."*.JPG"));//il difetto di glob è che è casesensitive
//e se le hai gli altri tipi di immagini
$file_excess=array_merge($file_excess,glob($dir."*.png"));
$file_excess=array_merge($file_excess,glob($dir."*.gif"));
//ricavo i nomi dei file senza percorso
$file_excess=array_map("basename",$file_excess);
//qui i dati di connessione
foreach($file_excess as $ch => $excess){
//se c'è puo essere in uno dei 4 campi riservati alle immagini
$query="SELECT * FROM prova WHERE immagine='$excess' OR img2='$excess' OR img3='$excess' OR img4='$excess'";
$ris=mysql_query($query);
if(mysql_num_rows($ris)==0){//se 0 il nome non è in tabella
unlink($dir.$excess);//quindi lo cancello
}
}
?>
io personalmente non lo metterei assieme a quello con cui l'utente carica le immagini, ma mi farei un file a parte
chiamato es. pulisci.php e lo lancerei ogni tanto
oppure farei sempre un file a parte da inserire con un include
PHP:
<?php
if(isset($_POST['invia'])){
$err="";//metti a vuoto una stringa
$nome=trim($_POST['nome']);
//reg_match('/^[a-z0-9]{5,15}/i'
if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20
$err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori
}
$prezzo=trim($_POST['prezzo'])+0.0;
if($prezzo==0 || !is_numeric($prezzo)){
$err.="prezzo non valido<br />";
}
//*******FINE CNTR TESTO **********
if($err==""{
//presegui con le immagini
//alla fine se tutto ok
require_once "pulisci.php";//qui
}else{
//mostri l'errore e torni al form
}//....
?>
ciao
lo script funziona (dovrebbe) così, ti faccio un esempio
l'utente usando il ctrl_click ti carica:
uno.jpg, due.jpg, tre.jpg, quattro.jpg, cinque.jpg e anche altri
in tabella vengono scritti solo i nomi (solo 4)
uno.jpg, due.jpg, tre.jpg, quattro.jpg
glob crea un array, leggendo nella cartella, equivalente a
$file_excess=array('uno.jpg', 'due.jpg', 'tre.jpg', 'quattro.jpg', 'cinque.jpg') e altri se ci sono
$file_excess viene ciclato con il foreach e interrogato il db
se il nome è in tabella (caso di: uno.jpg, due.jpg, tre.jpg, quattro.jpg) non fa nulla
se non lo trova (caso di: cinque.jpg) lo elimina (unlink)
alla fine ti troverai in cartella solo i file che sono salvati nel db
ciao
lo script funziona (dovrebbe) così, ti faccio un esempio
l'utente usando il ctrl_click ti carica:
uno.jpg, due.jpg, tre.jpg, quattro.jpg, cinque.jpg e anche altri
in tabella vengono scritti solo i nomi (solo 4)
uno.jpg, due.jpg, tre.jpg, quattro.jpg
glob crea un array, leggendo nella cartella, equivalente a
$file_excess=array('uno.jpg', 'due.jpg', 'tre.jpg', 'quattro.jpg', 'cinque.jpg') e altri se ci sono
$file_excess viene ciclato con il foreach e interrogato il db
se il nome è in tabella (caso di: uno.jpg, due.jpg, tre.jpg, quattro.jpg) non fa nulla
se non lo trova (caso di: cinque.jpg) lo elimina (unlink)
alla fine ti troverai in cartella solo i file che sono salvati nel db