Non inserisce dati nel db

  • Creatore Discussione Creatore Discussione Kirsolo
  • Data di inizio Data di inizio

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
Prendendo spunto dal web, ho provato questo codice per il multiupload delle foto.
Unica cosa, i dati non riesco ad inserirli nel db e non so come mai.

tabella db:
id(autoincrement) | nome | prezzo | immagine | img2 | img3 | img4

lo script è:
PHP:
<?php
if(isset($_FILES['files'])){
    $errors= array();
	foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
		$file_name = $key.$_FILES['files']['name'][$key];
		$file_size =$_FILES['files']['size'][$key];
		$file_tmp =$_FILES['files']['tmp_name'][$key];
		$file_type=$_FILES['files']['type'][$key];	
        if($file_size > 2097152){
			$errors[]='File size must be less than 2 MB';
        }	
		$sql = new mysqli("localhost", "root", "", "my_luca");
        $query = "INSERT into prova ('nome','prezzo','immagine','img2','img3','img4') VALUES('a','0','$file_name','a','a','a')";
        $desired_dir="user_data";
        if(empty($errors)==true){
            if(is_dir($desired_dir)==false){
                mkdir("$desired_dir", 0700);		// Create directory if it does not exist
            }
            if(is_dir("$desired_dir/".$file_name)==false){
                move_uploaded_file($file_tmp,"user_data/".$file_name);
            }else{									//rename the file if another one exist
                $new_dir="user_data/".$file_name.time();
                 rename($file_tmp,$new_dir) ;				
            }
            mysql_query($query);			
        }else{
                print_r($errors);
        }
    }
	if(empty($error)){
		echo "Success";
	}
}
?>


<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST" enctype="multipart/form-data">
	<input type="file" name="files[]" multiple/>
	<input type="submit"/>
</form>
 
Prova cosi:

INSERT into prova (nome,prezzo,immagine,img2,img3,img4) VALUES('a','0','$file_name','a','a','a')

Inoltre se non ti torna qualcosa puoi provare la query in phpmyadmin cosi capisci dove sbagli
 
Prova cosi:

INSERT into prova (nome,prezzo,immagine,img2,img3,img4) VALUES('a','0','$file_name','a','a','a')

Inoltre se non ti torna qualcosa puoi provare la query in phpmyadmin cosi capisci dove sbagli

Provato, niente la tabella sul db resta vuota.
Forse ce qualche altro errore? non capisco..
 
$sql = new mysqli("localhost", "root", "", "my_luca");
questo è fatto con mysqli
invece l'operazione per inviare i dati al server è fatto con mysql... credo che sia questo che da problemi.
Pero con la classe mysqli non ti so aiutare, io conosco la classe mysql e pdo
 
$sql = new mysqli("localhost", "root", "", "my_luca");
questo è fatto con mysqli
invece l'operazione per inviare i dati al server è fatto con mysql... credo che sia questo che da problemi.
Pero con la classe mysqli non ti so aiutare, io conosco la classe mysql e pdo

eh infatti se metto mysql al posto di mysqli mi dà errore:

Fatal error: Class 'mysql' not found in C:\Program Files (x86)\EasyPHP-12.1\www\form\demo.php on line 12
proprio quella riga
 
PHP:
// connessione al DBMS
$link = @mysqli_connect("localhost", "username", "password", "data");

// controllo sullo stato della connessione
if (mysqli_connect_errno())
{
  echo "Connessione fallita: " . die (mysqli_connect_error());
}

// query per la creazione di una tabella
if ($result =  @mysqli_query($link, "CREATE TABLE prova (id  INT(2), nome VARCHAR(50))"))
{
  echo "Tabella creata con successo.";
}

// liberazione della memoria dal risultato della query
@mysqli_free_result($result);
l'inserimento nel database prova questo cambiando i tuoi dati
 
PHP:
// connessione al DBMS
$link = @mysqli_connect("localhost", "username", "password", "data");

// controllo sullo stato della connessione
if (mysqli_connect_errno())
{
  echo "Connessione fallita: " . die (mysqli_connect_error());
}

// query per la creazione di una tabella
if ($result =  @mysqli_query($link, "CREATE TABLE prova (id  INT(2), nome VARCHAR(50))"))
{
  echo "Tabella creata con successo.";
}

// liberazione della memoria dal risultato della query
@mysqli_free_result($result);
l'inserimento nel database prova questo cambiando i tuoi dati

sn riuscito in un altro modo a farlo andare.
Ora ho un altro problema:
PHP:
<?php

// limite peso in byte 
$peso_file = 1024 * 1024;
// inizializziamo il messaggio
$messaggio = "Carica una o piu immagini, fino ad un massimo di 4 consentite:";
// estensioni ammesse
$estensioni = array("jpg", "png", "bmp", "gif");
// percosrso destinazione immagini la cartella deve esistere e il percorso deve essere corretto
$dir = "images_immobili";
// verifichiamo che sia stato premuto il submit
if (isset($_POST['submit'])) { // && $_POST['upload'] == "Carica immagini") {
    // azzeriamo il messaggio
    $messaggio = "";
    // recuperiamo e uniamo le informazionei sulle immagini
    $infoimages = array_combine($_FILES["image"]['name'], $_FILES["image"]['tmp_name']);
    // cicliamo le immagini
	$cnt=0;
    foreach ($infoimages as $k => $v) {
	if ($cnt < 4) {
		++$cnt;
        // nome del file
        $nomefile = strtolower($k);
		
        // controlliamo il peso immagine
        if (filesize($v) < $peso_file) {
            // recuperiamo l'estensione
            $estensionefile = pathinfo($nomefile, PATHINFO_EXTENSION);
            // controlliamo il tipo immagine
            if (in_array(strtolower($estensionefile), $estensioni)) {
                // controllo caricamento
                if (is_uploaded_file($v)) {
                    // spostiamo il file nella cartella immagini
                    if (!move_uploaded_file($v, "$dir/$nomefile")) {
                        $messaggio .= "<br/>Impossibile spostare il file $k";
                    } else {
                        $messaggio .= "<br/>Immagine $k caricata con successo";
						
						
                    }
                } else {
                    $messaggio .= "<br/>Errore nell'upload del file $k.";
					}
            } else {
                $messaggio .= "<br/>Tipo immagine non consentito : $k";
				}
        } else {
            $messaggio .= "<br/>Immagine $k non caricata : limite peso superato";
			}
	} else { $messaggio .= "<br/>Hai inserito più di 4 immagini";
		}
    }

}

avendo questo, e la mia query
PHP:
$query="INSERT INTO immobile(nome, ....., immagine, img2, img3,img4 ) 
						VALUES('$nome',.......,'images_immobili/$nomefile','X','Y','Z')";  
						var_dump($query);
						if(!$sql->query($query)) { 
							echo $sql->error; }

non riesco a inserire nel database diversi file, cioè soltanto l'ultimo che seleziono. Cosa dovrei mettere al posto di X Y Z ?
 
io di solito ci inserisco l'url del percorso di dove ho spostato le immagini cn la relativa estenzione, sennnò ci puoi inserire il file
 
io di solito ci inserisco l'url del percorso di dove ho spostato le immagini cn la relativa estenzione, sennnò ci puoi inserire il file

si come hai visto, per la prima immagine è l'url e nome immagine....il problema x le altre immagini non posso mettere $nome_file, xkè risulta la stessa immagine. Cosa devo mettere?
 
secondo me il tuo script è sbagliato (spero di sbagliarmi) poichè non vedo nessun ciclo foreach per esaminare le immagini una ad una.
Ti consiglio di guardarti i caricatori multipli gia pronti
vediti questo: http://www.jqueryitalia.org/caricamento-files-dinamico/
Ecco forse è quello il problema...cè da mettere un foreach per ognuna immagine forse e togliere il contatore $cnt , può essere una soluzione ??

ps: vorrei farlo tutto in php, anche perchè non conosco jquery...
 
Allora secondo me devi fare cosi

1 ricevi dati file ['tmp_name'] e ['name']

dopodiche dai vita a un ciclo foreach
a cui assegni il nome di ogni singolo file ad un array in questo modo
$n = "0";
foreach ( .... as ....) {
estrai nome file

$nome['$n'] = $time(). "nome del file";
$n++

} cosi che ad ogni file incrementi la n dando una array differente
dopodiche richiami i file tmp_name sempre nello stesso modo li sposti nella cartella e li salvi nel db.
Hai capito cosa intendo?
 
Allora secondo me devi fare cosi

1 ricevi dati file ['tmp_name'] e ['name']

dopodiche dai vita a un ciclo foreach
a cui assegni il nome di ogni singolo file ad un array in questo modo
$n = "0";
foreach ( .... as ....) {
estrai nome file

$nome['$n'] = $time(). "nome del file";
$n++

} cosi che ad ogni file incrementi la n dando una array differente
dopodiche richiami i file tmp_name sempre nello stesso modo li sposti nella cartella e li salvi nel db.
Hai capito cosa intendo?

Mi riusciresti a fare un esempio con 2 immagini? In modo da capir meglio, scusa ma sto imparando pian piano il linguaggio :$
 
PHP:
//CREAZIONE FILE ZIP
	
	$estrazione =  mysql_query('SELECT  max(id) FROM ordini');

$aumento =  mysql_result($estrazione,0);
$nomefile = $aumento + 1 ;

$nome_utente=htmlspecialchars ($_POST['nomefatt']);
	
	$lista = $_FILES['files']['tmp_name'];
	$bomba = $_FILES['files']['name']; 
//nuovo archivio
	 $archivia = new ZipArchive(); 
//do il nome al file
	$nome_file = $nomefile.".".$nome_utente .".zip"; 
//creo il file
	$archivia->open("../uploads/".$nome_file, ZIPARCHIVE::CREATE);  

//PRIMO PASSAGGIO
$n=0; 
foreach ($bomba as $estenzione) { 
    $info = pathinfo($estenzione);  
         $nome_del_file[$n] = $info['basename'];
    $n++; 
} 

 $n=0;
 $nn =0;
foreach ($lista as $nome) {

   $file = ($nome);

   
   /* $primonumeronome = rand(1,9999);
	$secondonumeronome = rand(1,9999);
	$terzonumeronome = rand(1, 9999);
	$quartonumeronome = rand (1, 99999);*/
	$nomefile = $nome_del_file[$n];
   
   
   
   $name[$nn]= $nomefile;
   move_uploaded_file($file, $nomefile); 
    $archivia->addFile($nomefile); 
	
	
$nn++;
	  $n++; 
 } 
$archivia->close(); 

 $n=0;
 $nn=0;
foreach ($bomba as $estenzione) { 

    $info = pathinfo($estenzione);  
    $estenzion[$n] = $info['extension'];
rename($name[$nn], "upload/".$nome_utente. $name[$nn] .rand(0,9)); 
  $n++;
  $nn++;
  
}


   

$url="http://mariostampa.it/uploads/".$nome_file;
Questo è uno script che creai un po di tempo fa guarda se ti riesce modificare questo
 
PHP:
//CREAZIONE FILE ZIP
	
	$estrazione =  mysql_query('SELECT  max(id) FROM ordini');

$aumento =  mysql_result($estrazione,0);
$nomefile = $aumento + 1 ;

$nome_utente=htmlspecialchars ($_POST['nomefatt']);
	
	$lista = $_FILES['files']['tmp_name'];
	$bomba = $_FILES['files']['name']; 
//nuovo archivio
	 $archivia = new ZipArchive(); 
//do il nome al file
	$nome_file = $nomefile.".".$nome_utente .".zip"; 
//creo il file
	$archivia->open("../uploads/".$nome_file, ZIPARCHIVE::CREATE);  

//PRIMO PASSAGGIO
$n=0; 
foreach ($bomba as $estenzione) { 
    $info = pathinfo($estenzione);  
         $nome_del_file[$n] = $info['basename'];
    $n++; 
} 

 $n=0;
 $nn =0;
foreach ($lista as $nome) {

   $file = ($nome);

   
   /* $primonumeronome = rand(1,9999);
	$secondonumeronome = rand(1,9999);
	$terzonumeronome = rand(1, 9999);
	$quartonumeronome = rand (1, 99999);*/
	$nomefile = $nome_del_file[$n];
   
   
   
   $name[$nn]= $nomefile;
   move_uploaded_file($file, $nomefile); 
    $archivia->addFile($nomefile); 
	
	
$nn++;
	  $n++; 
 } 
$archivia->close(); 

 $n=0;
 $nn=0;
foreach ($bomba as $estenzione) { 

    $info = pathinfo($estenzione);  
    $estenzion[$n] = $info['extension'];
rename($name[$nn], "upload/".$nome_utente. $name[$nn] .rand(0,9)); 
  $n++;
  $nn++;
  
}


   

$url="http://mariostampa.it/uploads/".$nome_file;
Questo è uno script che creai un po di tempo fa guarda se ti riesce modificare questo

Ho provato a modificare in questa maniera:
PHP:
...
$infoimages = array_combine($_FILES["image"]['name'], $_FILES["image"]['tmp_name']);
    // cicliamo le immagini
	$n=0;
    foreach ($infoimages as $k => $v) {
	if ($n < 4) {
        // nome del file
        $nomefile[$n] = strtolower($k);
		$n++;
        // controlliamo il peso immagine
        if (filesize($v) < $peso_file) {
            // recuperiamo l'estensione
            $estensionefile = pathinfo($nomefile[$n], PATHINFO_EXTENSION);
            // controlliamo il tipo immagine
            if (in_array(strtolower($estensionefile), $estensioni)) {
                // controllo caricamento
                if (is_uploaded_file($v)) {
                    // spostiamo il file nella cartella immagini
                    if (!move_uploaded_file($v, "$dir/$nomefile[$n]")) {
                        $messaggio .= "<br/>Impossibile spostare il file $k";
                    } else {
                        $messaggio .= "<br/>Immagine $k caricata con successo";												
                    }
                } else {
                    $messaggio .= "<br/>Errore nell'upload del file $k.";
					}
            } else {
                $messaggio .= "<br/>Tipo immagine non consentito : $k";
				}
        } else {
            $messaggio .= "<br/>Immagine $k non caricata : limite peso superato";
			}
	} else { $messaggio .= "<br/>Hai inserito più di 4 immagini";
		}
    }
...

e
PHP:
$query="INSERT INTO prova(nome, prezzo,immagine, img2, img3,img4) 
						VALUES('$nome','$prezzo','Fotop/$nomefile[$n]','Fotop/$nomefile[$n]','b','c')";

gli errori che mi da sono:
Notice: Undefined offset: 1 in C:\Program Files (x86)\EasyPHP-12.1\www\provaForm.php on line 45

Notice: Undefined offset: 2 in C:\Program Files (x86)\EasyPHP-12.1\www\provaForm.php on line 45
tutto giusto

Notice: Undefined offset: 2 in C:\Program Files (x86)\EasyPHP-12.1\www\provaForm.php on line 93

Notice: Undefined offset: 2 in C:\Program Files (x86)\EasyPHP-12.1\www\provaForm.php on line 93

nb: ho fatto una prova con 2immagini
nb2: linea 45:$estensionefile = pathinfo($nomefile[$n], PATHINFO_EXTENSION);
lineai93: è quella della $query
 
Ho modificato la query mettendo.....VALUES('$nome','$prezzo','Fotop/$nomefile[0]','Fotop/$nomefile[1]','b','c')";

così nel db me li inserisce giustamente.

Unica cosa mi dà ancora errore sulla linea45 e le immagini non mi caricano nella cartella. come potrei fare?
 
ciao
prova a correggere la riga
PHP:
<?php 
//.....
if (!move_uploaded_file($v, "$dir/".basename($nomefile[$n])) {
//....
?>
Ciao,
ho risolto a modo mio smanettando un pò. Con .basename($nomefile[$n]), cosa fa?

Unica cosa che non so come risolvere è:
al massimo posso inviare 4 foto, altrimenti non le carica. Però se carico soltanto 2 o 3 o comunque meno di 4, mi da errore di offset per le immagini non caricate:

nel caso che inserisca solo 2 immagini :
PHP:
Notice: Undefined offset: 2 in C:\Program Files (x86)\EasyPHP-12.1\www\Forme.php on line 78
Notice: Undefined offset: 3 in C:\Program Files (x86)\EasyPHP-12.1\www\Forme.php on line 78
la linea 78 corrisponde alla linea della query.

PHP:
<?php
// limite peso in byte 
$peso_file = 1024 * 1024;
// inizializziamo il messaggio
$messaggio = "Carica una o piu immagini, fino ad un massimo di 4 consentite:";
// estensioni ammesse
$estensioni = array("jpg", "png", "bmp", "gif");
// percorso destinazione immagini la cartella deve esistere e il percorso deve essere corretto
$dir = "Fotop";
// verifichiamo che sia stato premuto il submit
if (isset($_POST['submit'])) { 
//************** CONTROLLO TESTO**********
$err="";//metti a vuoto una stringa  
    $nome=trim($_POST['nome']); //metto solo nome il titolo è simile 
    //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 CONTROL TESTO**********************************
//################ CONTROLLO IMG #########################
if($err==""){ 
    // azzeriamo il messaggio
    $messaggio = "";
    // recuperiamo e uniamo le informazionei sulle immagini
    $infoimages = array_combine($_FILES["image"]['name'], $_FILES["image"]['tmp_name']);
    // cicliamo le immagini
	$n=0;
 foreach ($infoimages as $k => $v) {
	if ($n < 4) {
        // nome del file
        $nomefile[$n] = strtolower($k);
        // controlliamo il peso immagine
        if (filesize($v) < $peso_file) {
            // recuperiamo l'estensione
            $estensionefile = pathinfo($nomefile[$n], PATHINFO_EXTENSION);
            // controlliamo il tipo immagine
            if (in_array(strtolower($estensionefile), $estensioni)) {
                // controllo caricamento
                if (is_uploaded_file($v)) {
                    // spostiamo il file nella cartella immagini
                    if (!move_uploaded_file($v, "$dir/".basename($nomefile[$n]))) {
                        $messaggio .= "<br/>Impossibile spostare il file $k";} 
					else {
                        $messaggio .= "<br/>Immagine $k caricata con successo";}
                } else {
                    $messaggio .= "<br/>Errore nell'upload del file $k.";}
            } else {
                $messaggio .= "<br/>Tipo immagine non consentito : $k";}
        } else {
            $messaggio .= "<br/>Immagine $k non caricata : limite peso superato";}
	  $n++;} 
		else { $messaggio .= "<br/>Hai inserito più di 4 immagini";}
 }	     
        echo "tutto giusto<br>"; 
        //inserimento in db e avviso su $err 
        $err="i tuoi dati sono stati inseriti<br />";
		$sql = new mysqli("localhost", "root", "", "my_luca");
		
						$query="INSERT INTO prova(nome, prezzo,immagine, img2, img3,img4) 
						VALUES('$nome','$prezzo','Fotop/$nomefile[0]','Fotop/$nomefile[1]','Fotop/$nomefile[2]','Fotop/$nomefile[3]')";  
						var_dump($query);//verifico come verrebbe la stringa
						if(!$sql->query($query)) { 
							echo $sql->error; }	
} 
    //mostri il messaggio 
   echo $err; 
    //e torni al form pulito dopo 3 secondi (content ='3;...) 
    echo "<meta http-equiv='Refresh' content='155; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>"; 
}
?>
 

Discussioni simili