[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.046
150
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.046
150
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.046
150
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.046
150
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.046
150
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.046
150
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5

Discussioni simili