[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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
?>
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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_
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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);
//....
?>
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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
 

giancadeejay

Utente Attivo
26 Ott 2010
224
0
16
torino
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
giancadeejay [PHP] Aggiornare un valore del database tramite form PHP 26
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
Leshabituelles Non riesco ad aggiornare PHP PHP 0
S aggiornare valore di un elemento xml con php PHP 8
P [PHP] Intercettare ed aggiornare campi di un database PHP 5
C [PHP] scrivere o aggiornare record in tabella PHP 7
T Aggiornare una tabella db richiamando da file php PHP 3
M [Javascript] [PHP] aggiornare pagina ogni ora Javascript 2
S Aggiornare una tabella db richiamando da file php PHP 3
S [PHP]Aggiornare pagina in maniera trasparente... PHP 3
M [PHP] Aggiornare i dati dei record selezionati PHP 3
X come aggiornare codice php? PHP 5
ste80 [PHP] cancellare/aggiornare record DB PHP 24
Metazoo Recuperare variabile php da javascript senza aggiornare pagina PHP 5
giancadeejay Aggiornare tabella db con php PHP 10
L [PHP] Sommare campi e aggiornare tabella PHP 14
N eseguire pagina php senza aggiornare la pagina Ajax 3
M Aggiornare Plesk e PHP su VPS Linux OVH Server Dedicati e VPS 3
M Aggiornare dato sul db con php Ajax 8
M AIUTO--> Devo aggiornare il PHP Linux e Software 0
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0

Discussioni simili