[PHP] Aggiornare DB tramite UPLOAD file .csv

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
Ciao a tutti,
Forse ci siamo...
Vorrei aggiornare il mio DB tramite l'UPLOAD di un file CSV contenente 52 colonne e circa 6000 righe.
Ecco lo script:

PHP:
<?php

//connect to the database
$connect = mysql_connect("localhost","user","");
mysql_select_db("my_db",$connect); //select the table
//

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");
 
    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
             mysql_query ("INSERT INTO completo (DATO1    ,DATO2    ,DATO3     ,DATO4,    DATO5    ,DATO6    ,DATO7,    DATO8,    DATO9,    DATO10,     DATO11    ,DATO12    ,DATO13,    DATO14,    DATO15,    DATO16     ,DATO17    ,DATO18,    DATO19    ,DATO20,    DATO21,    DATO22,     DATO23,    DATO24,    DATO25,    DATO26,    DATO27,    DATO28,     DATO29,    DATO30,    DATO31    ,DATO32,    DATO33    ,DATO34     ,DATO35    ,DATO36,    DATO37,    DATO38,    DATO39,    DATO40,
DATO41,     DATO42,    DATO43,    DATO44,    DATO45,    DATO46,    DATO47,     DATO48    ,DATO49,    DATO50,    DATO51,    DATO52)
       
VALUES
                (
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."',
                    '".addslashes($data[3])."',
                    '".addslashes($data[4])."',
                    '".addslashes($data[5])."',
                    '".addslashes($data[6])."',
                    '".addslashes($data[7])."',
                    '".addslashes($data[8])."',
                    '".addslashes($data[9])."',
                    '".addslashes($data[10])."',
                    '".addslashes($data[11])."',
                    '".addslashes($data[12])."',
                    '".addslashes($data[13])."',
                    '".addslashes($data[14])."',
                    '".addslashes($data[15])."',
                    '".addslashes($data[16])."',
                    '".addslashes($data[17])."',
                    '".addslashes($data[18])."',
                    '".addslashes($data[19])."',
                    '".addslashes($data[20])."',
                    '".addslashes($data[21])."',
                    '".addslashes($data[22])."',
                    '".addslashes($data[23])."',
                    '".addslashes($data[24])."',
                    '".addslashes($data[25])."',
                    '".addslashes($data[26])."',
                    '".addslashes($data[27])."',
                    '".addslashes($data[28])."',
                    '".addslashes($data[29])."',
                    '".addslashes($data[30])."',
                    '".addslashes($data[31])."',
                    '".addslashes($data[32])."',
                    '".addslashes($data[33])."',
                    '".addslashes($data[34])."',
                    '".addslashes($data[35])."',
                    '".addslashes($data[36])."',
                    '".addslashes($data[37])."',
                    '".addslashes($data[38])."',
                    '".addslashes($data[39])."',
                    '".addslashes($data[40])."',
                    '".addslashes($data[41])."',
                    '".addslashes($data[42])."',
                    '".addslashes($data[43])."',
                    '".addslashes($data[44])."',
                    '".addslashes($data[45])."',
                    '".addslashes($data[46])."',
                    '".addslashes($data[47])."',
                    '".addslashes($data[48])."',
                    '".addslashes($data[49])."',
                    '".addslashes($data[50])."',
                    '".addslashes($data[51])."',
                    '".addslashes($data[52])."'
                )
            ");
        }
    } while ($data = fgetcsv($handle,1000,",","'"));
    //

    //redirect
    header('Location: import.php?success=1'); die;

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Import a CSV File with PHP & MySQL</title>
</head>

<body>

<?php  if (!empty($_GET[success])) { echo "<b>FILE CARICATO CON  SUCCESSO!</b><br><br>"; } //generic success notice  ?>

<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  Scegli il tuo file: <br />
  <input name="csv" type="file" id="csv" />
  <input type="submit" name="Submit" value="Invia File" />
</form>

</body>
</html>

L'UPLOAD va a buon fine ma nella MIA_TABELLA DB non viene inserito nessun dato...non capisco dove sbaglio..potete darmi una mano a risolvere?
Grazie a tutti in anticipo
 
Ultima modifica di un moderatore:
ciao
secondo me prima di tutto ti da sempre "successo" in quanto
ti schematizzo
1) if file aperto SI //cosa che fa se il file esiste
2) cerchi di fare l'insert (do-while), ma non sai se lo fa
3) fai il redirect con ?success=1 indipendentemente dal fatto ce l'insert sia andato a buon fine oppure no
4) leggi il get che seil file esiste è settato a 1
5) ti da successo anche se l'insert non è stato eseguito

quindi:
devi mettere la possibilità che il valore di successo dipenda dall'insert
mettere dei var_dump per verificare passo passo quello che succede es per fare una prova mettere un var_dump e commentare la parte di insert
poi se hai pazienza ci do un occhio meglio
 
Ciao Borgo
Si sto impazzendo da più di una settimana... sai bene che
Non sono una cima... se puoi darmi una mano sul codice te ne sarei grato
Attendo..
Grazie
 
ciao
mi è venuto un piccolo dubbio, fatti questo miniscript, lo esegui e posti il risultato del var_dump
PHP:
<?php
$file = "tuo_file.csv";//metti il nome di un tuo file esistente
$handle = fopen($file,"r");//lo apri
//e per non avere tutta una pappardella leggi solo la prima riga
$data = fgetcsv($handle,1000,",","'");
//metti un var_dump
echo "<pre>";
var_dump($data);
echo "</pre>";
fclose($handle);//ricordati sempre di chidere appena usato
?>
 
Ciao Borgo,
Ecco il risultato:
Codice:
array(1) {
  [0]=>
  string(282) "dato1;dato2;dato3;dato4;etc;etc;"
}
In questo modo legge la prima riga del mio file perfettamente.

Ma il mio obbiettivo e far finire non una, ma ben 6000 righe all'interno del mio db
 
ciao
scusa una cosa che mi ero dimenticato di chiederti prima, quindi è il tuo csv è fatto così
dato1;dato2;dato3;dato4;...dato52
101;102;103;144;...152
201;202;203;204;...225
ecc..
per cui ti ritrovi in
$data[0] => "dato1;dato2;dato3;dato4;...dato52" //cioè i nomi delle colonne
$data[1] => "101;102;103;144;...152" // cioe i relativi valori di ogni colonna della 1° riga
$data[2] => "201;202;203;204;...225" //cioe i relativi valori di ogni colonna della 2° riga
ecc...
$data[6000] => "201;202;203;204;...225" //cioe i relativi valori di ogni colonna della 6millesima riga
giusto?
 
ciao
prova questo, ma a parte perchè l'ho buttato giù di getto e non l'ho provato e quindi possono esserci degli errori o non ho capito bene quello che devi fare
PHP:
<?php
//....
//$file = $_FILES['csv']['tmp_name'];
$file ="file_esempio.csv";//fatti un file csv con poche righe
$handle = fopen($file,"r");
$verifica_insert=1;
//ciclo le righe del csv
while($data = fgetcsv($handle,1000,",","'")){
    $num = count($data);//numero delle righe
    for ($k=0; $k < $num; $k++){//ciclo le righe
        if($k==0){//sto leggendo il rigo con i nomi delle colonne
            $nome_campi=strtr( $data[0], ";" , ",");//cambio il ; in ,
            $q="INSERT INTO completo (".$nome_campi.") VALUE(";
            //$q diventa INSERT INTO completo (DATO1    ,DATO2,...ecc... DATO52 ) VALUE(
        }else{//sto leggendo un rigo di dati
            $dato=explode(";",$data[$k]);//suddivido la riga in un array
            $dato=array_map("addslashes", $dato);//metto gli eventuali slash
            $valori="'".implode("','",$dato)."'";//ricompingo i valori del rigo
            $query=$q.$valori.")";
            //query diventa INSERT INTO completo (DATO1    ,DATO2,...ecc... DATO52 ) VALUE('uno','due',...ecc...'cinquantadue')
        }
        if(mysql_query($query)){
            echo "la riga n° $verifica_insert è stata inserita<br>";
        }else{
            echo "ERRORE: la riga n° $verifica_insert NON è stata inserita<br>";
        }
    }  
    $verifica_insert++;
}
fclose($handle);
//....
?>
leggendo i vari commenti si dovrebbe capire quello che ho fatto

p.s.
abbandona le vecchie istruzioni php mysql_ obsolete e passa alle mysqli_
 
mi restituisce questo?

ERRORE: la riga n° 1 NON è stata inserita
ERRORE: la riga n° 2 NON è stata inserita
ERRORE: la riga n° 3 NON è stata inserita
ERRORE: la riga n° 4 NON è stata inserita
ERRORE: la riga n° 5 NON è stata inserita
ERRORE: la riga n° 6 NON è stata inserita
ERRORE: la riga n° 7 NON è stata inserita
ERRORE: la riga n° 8 NON è stata inserita
ERRORE: la riga n° 9 NON è stata inserita
ERRORE: la riga n° 10 NON è stata inserita
ERRORE: la riga n° 11 NON è stata inserita
ERRORE: la riga n° 12 NON è stata inserita
ERRORE: la riga n° 13 NON è stata inserita
ERRORE: la riga n° 14 NON è stata inserita
ERRORE: la riga n° 15 NON è stata inserita
ERRORE: la riga n° 16 NON è stata inserita
ERRORE: la riga n° 17 NON è stata inserita
ERRORE: la riga n° 18 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
etc etc
 
ciao
commenta tutta la parte dell'insert e metti un var_dump posta cosa ti da che cerchiamo di capire
PHP:
//....
}
        echo "<pre>";
        var_dump($query);
        echo "</pre>";
       /* if(mysql_query($query)){
            echo "la riga n° $verifica_insert è stata inserita<br>";
        }else{
            echo "ERRORE: la riga n° $verifica_insert NON è stata inserita<br>";
        }
        */
//...
ora esco domani ci do ancora un occhio
 
Dunque dimmi dove sbaglio:
Codice:
<?php

$host = "localhost";

$user = "PINKOPALLO";

$password = "";

$db = "my_DB";


# stringa di connessione al DBMS
// istanza dell'oggetto della classe MySQLi
$connessione = new mysqli($host, $user, $password, $db);

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}
//$file = $_FILES['csv']['tmp_name'];
$file ="ok.csv";//fatti un file csv con poche righe
$handle = fopen($file,"r");
$verifica_insert=1;

 

//ciclo le righe del csv
while($data = fgetcsv($handle,1000,",","'")){
    $num = count($data);//numero delle righe
    for ($k=0; $k < $num; $k++){//ciclo le righe
        if($k==0){//sto leggendo il rigo con i nomi delle colonne
            $nome_campi=strtr( $data[0], ";" , ",");//cambio il ; in ,
            $q="INSERT INTO completo (DATO1    ,DATO2    ,DATO3     ,DATO4,    DATO5    ,DATO6    ,DATO7,    DATO8,    DATO9,    DATO10,     DATO11    ,DATO12    ,DATO13,    DATO14,    DATO15,    DATO16     ,DATO17    ,DATO18,    DATO19    ,DATO20,    DATO21,    DATO22,     DATO23,    DATO24,    DATO25,    DATO26,    DATO27,    DATO28,     DATO29,    DATO30,    DATO31    ,DATO32,    DATO33    ,DATO34     ,DATO35    ,DATO36,    DATO37,    DATO38,    DATO39,    DATO40,
DATO41,     DATO42,    DATO43,    DATO44,    DATO45,    DATO46,    DATO47,     DATO48    ,DATO49,    DATO50,    DATO51,    DATO52)
         
           
           
            VALUE(
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."',
                    '".addslashes($data[3])."',
                    '".addslashes($data[4])."',
                    '".addslashes($data[5])."',
                    '".addslashes($data[6])."',
                    '".addslashes($data[7])."',
                    '".addslashes($data[8])."',
                    '".addslashes($data[9])."',
                    '".addslashes($data[10])."',
                    '".addslashes($data[11])."',
                    '".addslashes($data[12])."',
                    '".addslashes($data[13])."',
                    '".addslashes($data[14])."',
                    '".addslashes($data[15])."',
                    '".addslashes($data[16])."',
                    '".addslashes($data[17])."',
                    '".addslashes($data[18])."',
                    '".addslashes($data[19])."',
                    '".addslashes($data[20])."',
                    '".addslashes($data[21])."',
                    '".addslashes($data[22])."',
                    '".addslashes($data[23])."',
                    '".addslashes($data[24])."',
                    '".addslashes($data[25])."',
                    '".addslashes($data[26])."',
                    '".addslashes($data[27])."',
                    '".addslashes($data[28])."',
                    '".addslashes($data[29])."',
                    '".addslashes($data[30])."',
                    '".addslashes($data[31])."',
                    '".addslashes($data[32])."',
                    '".addslashes($data[33])."',
                    '".addslashes($data[34])."',
                    '".addslashes($data[35])."',
                    '".addslashes($data[36])."',
                    '".addslashes($data[37])."',
                    '".addslashes($data[38])."',
                    '".addslashes($data[39])."',
                    '".addslashes($data[40])."',
                    '".addslashes($data[41])."',
                    '".addslashes($data[42])."',
                    '".addslashes($data[43])."',
                    '".addslashes($data[44])."',
                    '".addslashes($data[45])."',
                    '".addslashes($data[46])."',
                    '".addslashes($data[47])."',
                    '".addslashes($data[48])."',
                    '".addslashes($data[49])."',
                    '".addslashes($data[50])."',
                    '".addslashes($data[51])."',
                    '".addslashes($data[52])."'
                 )
            ";
           
            //$q diventa INSERT INTO completo (DATO1    ,DATO2,...ecc... DATO52 ) VALUE(
        }else{//sto leggendo un rigo di dati
            $dato=explode(";",$data[$k]);//suddivido la riga in un array
            $dato=array_map("addslashes", $dato);//metto gli eventuali slash
            $valori="'".implode("','",$dato)."'";//ricompingo i valori del rigo
            $query=$q.$valori.")";
            //query diventa INSERT INTO completo (DATO1    ,DATO2,...ecc... DATO52 ) VALUE('uno','due',...ecc...'cinquantadue')
        }
       
        if(mysql_query($query)){
            echo "la riga n° $verifica_insert è stata inserita<br>";
         
        }else{
            echo "ERRORE: la riga n° $verifica_insert NON è stata inserita<br>";
        }
    }  
    $verifica_insert++;
}

 echo "<pre>";
        var_dump($query);
        echo "</pre>";         



fclose($handle);
//....
?>
 
Cosi i dati NON finiscono nella mia tabella e mi restituisce sempre questo:
Codice:
ERRORE: la riga n° 1 NON è stata inserita
ERRORE: la riga n° 2 NON è stata inserita
ERRORE: la riga n° 3 NON è stata inserita
ERRORE: la riga n° 4 NON è stata inserita
ERRORE: la riga n° 5 NON è stata inserita
ERRORE: la riga n° 6 NON è stata inserita
ERRORE: la riga n° 7 NON è stata inserita
ERRORE: la riga n° 8 NON è stata inserita
ERRORE: la riga n° 9 NON è stata inserita
ERRORE: la riga n° 10 NON è stata inserita
ERRORE: la riga n° 11 NON è stata inserita
ERRORE: la riga n° 12 NON è stata inserita
ERRORE: la riga n° 13 NON è stata inserita
ERRORE: la riga n° 14 NON è stata inserita
ERRORE: la riga n° 15 NON è stata inserita
ERRORE: la riga n° 16 NON è stata inserita
ERRORE: la riga n° 17 NON è stata inserita
ERRORE: la riga n° 18 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
ERRORE: la riga n° 19 NON è stata inserita
etc etc
 
potri anche risolvere se ci fosse un modo per mettere una virgola tra un valore e l'altro..ma in rete non trovo nulla che faccia questo
 
Ciao ..ho trovato uno script che funziona :
Codice:
<?php
// richiamo il file di configurazione
require 'config.php';

// richiamo lo script responsabile della connessione a MySQL
require 'connect.php';

// preparo la query
$query = "INSERT INTO completo (DATO1   ,DATO2   ,DATO3   ,DATO4,   DATO5   ,DATO6   ,DATO7,   DATO8,   DATO9,   DATO10,   DATO11   ,DATO12   ,DATO13,   DATO14,   DATO15,   DATO16   ,DATO17   ,DATO18,   DATO19   ,DATO20,   DATO21,   DATO22,   DATO23,   DATO24,   DATO25,   DATO26,   DATO27,   DATO28,   DATO29,   DATO30,   DATO31   ,DATO32,   DATO33   ,DATO34   ,DATO35   ,DATO36,   DATO37,   DATO38,   DATO39,   DATO40,
DATO41,   DATO42,   DATO43,   DATO44,   DATO45,   DATO46,   DATO47,   DATO48   ,DATO49,   DATO50,   DATO51,   DATO52)

       VALUES ('record1','record2','record3'.etc etc fino a record 52...
)";

// lancio la query
$result = mysql_query($query);

// controllo l'esito
if (!$result) {
   die("Errore nella query $query: " . mysql_error());
}

// chiudo la connessione a MySQL
mysql_close();

echo 'Query eseguita correttamente';
?>

Questo funziona,inserisce i dati perfettamente ma come metto i2 apici piu' la virgola tra un record e l'altro ,a tutti i record di 6000 righe??
 
Ultima modifica:
ciao
scusa, ma forse non ho capito bene.
posta le prime righe di un tuo csv (puoi usare blocco note -> tutti i files per aprirlo) basta che tu ne posti tre o quattro e come è strutturata la tabella "completo"
 

Discussioni simili