Non inserisce dati nel db

  • Creatore Discussione Creatore Discussione Kirsolo
  • Data di inizio Data di inizio
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>
penso di aver messo commenti in abbondanza
 
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>
penso di aver messo commenti in abbondanza

Ho provato con i miei dati, mettendo anche la connessoine al db, però proprio quella nn va, non mi carica i dati.
PHP:
....
//e qui dovrei aver finito (finalmente) 
            //dati di connessione 
			$sql = new mysqli("localhost", "root", "", "luca_db");
            $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
....

non è che ho sbagliato qualcosa?
 
ciao
si mescoli mysqli con mysql

ok funzia, ho sostituito con:
PHP:
$sql = mysql_connect("localhost","root","");
			mysql_selectdb("my_luca",$sql);

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
  }//....

Grazie mille, finalmente funziona tutto ! :) :)

Cosa dicevi riguardo ad un'altro script per verificare se selezionano piu di 4 img?
 
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, l'ho provato e testato poco fa, nel db come prima ne carica solo 4, invece nella cartella ne carica comunque 5...
 
ciao
si ne vengona caricati anche 5 o 6 o 7....., ma lo script che ti ho postato dovrebbe eliminarli, elimina i file che non sono presenti in tabella
 
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

Ho provato sia con 5 img che con 6 img.....nella cartella le carica tutte, non le elimina quelle oltre alla 4a...
 

Discussioni simili