Ciao Eugenio
dopo un pò di studio su PHP...ho trovato la soluzione ovviamente adattata alla mia esigenza.
Per poter caricare ed aggiornare una tabella contenente più di 2000 record ho separato la cosa in due passaggi. Questo mi consente di utilizzare la prima funzione di importazione dei dati anche per altre necessità simili.
Procedo quindi a caricare il file CSV su una cartella server del mio dominio tramite una custom page di upload della quale poi incollo il codice. Il file CSV è opportunamente formattato per renderlo compatibile con il mio db mysql.
In un'altra custom page, creo un custom button per l'analisi ed il caricamento dei dati nella tabella, già esistente, del mio database, tabella che viene svuotata prima del caricamento. Questa tabella è di servizio ed è gestita solo dall'utente admin per evitare come dicevi problemi di "locking".
Nel secondo file PHP viene letto il file, caricata ogni riga in un array e poi ripulita da eventuali caratteri inattesi e scompattata per creare l'istruzione di INSERT nella tabella.
Ciao a tutti.....
Alessandro.
pagina PHP per caricare i files:
<HTML>
<head>
<title> PHP upload page </title>
</head>
<body>
<?php
error_reporting(2047);
if (isset($_POST["invio"])) {
$percorso = ".....il tuo percorso completo qui/uploads/";
if (is_uploaded_file($_FILES['file1']['tmp_name'])) {
if (move_uploaded_file($_FILES['file1']['tmp_name'], $percorso.$_FILES['file1']['name'])) {
echo 'Nome file: <b>'.$_FILES['file1']['name'].'</b><br>';
echo 'Dimensione: <b>'.$_FILES['file1']['size'].'</b> byte<br>';
echo '======================<br>';
echo 'File caricato correttamente<br><br>';
echo '
carica un altro file';
} else {
echo "si è verificato un errore durante l'upload: ".$_FILES["file1"]["error"];
}
} else {
echo "si è verificato un errore durante l'upload: ".$_FILES["file1"]["error"];
}
} else {
// HTML ?>
<form enctype="multipart/form-data" method="post" action="" name="uploadform">
<p><b>UPLOAD FILES</b></p>
<p>seleziona i files creati dal gestionale di MS ACESS da caricare sul server:</p> //io utilizzo Access come interfaccia intermedia per gestire i dati offline prima di renderli disponibili sul web
<input type="file" name="file1" size="50">
<br>
<input type="submit" value="carica" name="invio">
<br>
</form>
<?php
}
?>
</body>
</html>
pagina PHP per importare il file nella tabella del mio database:
<HTML>
<head>
<title> PHP upload page </title>
</head>
<body>
<?php
global $conn;
error_reporting(2047);
if (isset($_POST["iscritti"])) {
$percorso = ".....il tuo percorso completo qui/uploads/";
$fieldseparator = ";";
$lineseparator = "\n";
$nomefile="esportaIscritti.csv";
$csvfile = $percorso.$nomefile;
//cancella i dati precedentemente contenuti nella tabella iscritti
$sql = "TRUNCATE iscritti";
$_cp_elimina_dati = $conn->exec($sql);
//verifica se il file esiste
if (!file_exists($csvfile)) {
echo "File non trovato.\n";
exit;
}
$file = fopen($csvfile,"r");
if (!$file) {
echo "Errore nell'apertura dei dati del file.\n";
exit;
}
$size = filesize($csvfile);
if (!$size) {
echo "Il file è vuoto.\n";
exit;
}
$csvcontent = fread($file,$size);
fclose($file);
$lines = 0;
$linearray = array();
$conta_record = 1;
$totale_record = count(file($csvfile));
echo 'righe da importare nel file '.$nomefile.': '.$totale_record.'<br>';
foreach(explode($lineseparator,$csvcontent) as $line) {
$lines++;
$line = trim($line," \t");
$line = str_replace("\r","",$line);
$line = str_replace('"','',$line);
//$line = str_replace("'","".$line);
$linearray = explode($fieldseparator,$line);
$linemysql = implode("','",$linearray);
$query = "insert into iscritti values('$linemysql');";
//echo $query."<br>";
if ($conta_record != $totale_record +1){
$_cp_aggiorna_dati = $conn->exec($query);
$conta_record=$conta_record+1;
}
}
$conta_record=$conta_record -1;
echo "<br>Sono stati correttamente caricati $conta_record records contenuti nel file csv.\n";
} else {
// HTML ?>
<form enctype="multipart/form-data" method="post" action="" name="uploaddata">
<p><b>CARICAMENTO TABELLE</b></p>
<p>seleziona il tipo di elaborazione da effettuare</p>
<input type="submit" value="iscritti" name="iscritti">
<br>
</form>
<?php
}
?>
</body>
</html>