Buongiorno.
L'esigenza è quella di controllare se il file csv ha gli stessi campi della tabella mysql che riceverà i dati, dopo un caricamento massivo.
Ma, dato che per esperienza appena avuta, hanno cambiato il file csv che gli avevo dato, rinominando i campi e togliendone alcuni.
Quindi, prima di caricare i dati, faccio un controllo, se è tutto ok, carica altrimenti no.
Questo è quello che ho fatto e funziona:
codice:
protected function fieldsCompareCsvToTable(){
try
{
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $this->options['db_host'], $this->options['db_user'], $this->options['db_pass'], $this->options['db_name']);
$query = mysqli_query($link,"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tb_documenti_new'
AND TABLE_SCHEMA = 'db_doc_prod'");
if ($query === false) {
mysqli_rollback($link);
$this->mer = mysqli_error($link);
return false;
}
else{
$handle = fopen("../doctest/csv/test.csv","r");
$data = fgetcsv($handle, 1000,',',";");
$num = count($data);
$fieldName = "";
for ($c=0; $c < $num; $c++) {
$fieldName = $data[$c];
}
$arrfieldName = explode(';',$fieldName);
fclose($handle);
$arrDati = array();
while($row = mysqli_fetch_array($query)){
$arrDati[] = $row['COLUMN_NAME'];
}
if(array_equal($arrfieldName,$arrDati)==1){
return true;
}
else{
return 0;
}
}
mysqli_free_result($query);
}
catch (Exception $e)
{
$this->mer = $e;
}
}
Adesso viene il bello.
Utilizzo il pacchetto jQuery-File-Upload-master per caricare i file.
All'interno della funzione
codice:
protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, $index = null, $content_range = null,$_folder) {
$dir = $_SERVER['DOCUMENT_ROOT']."/".DOC_ROOT_CSV."/";
if($this->fieldsCompareCsvToTable($dir)==1){
$file = parent::handle_file_upload($uploaded_file, $name, $size, $type, $error, $index, $content_range,$this->get_folder_name());
$alert = "";
if(is_dir($dir)){
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $this->options['db_host'], $this->options['db_user'], $this->options['db_pass'], $this->options['db_name']);
$query = mysqli_query($link,"LOAD DATA LOCAL INFILE '".$dir.$name."' INTO TABLE ".$this->options['db_table']." FIELDS TERMINATED BY ';' IGNORE 1 LINES") or die("Error 2: ".mysqli_error());
if ($query === false) {
mysqli_rollback($link);
return false;
}
else{
return $file;
}
mysqli_free_result($query);
mysqli_close($link);
}
else{
$alert = "Non è stato possibile importare i dati, perché il file .csv non esiste nella directory";
}
}
else{
$alert = "Non è stato possibile importare i dati, perché il file .csv non è conforme.\nUtilizzare file .csv standard";
}
return $alert;
}
Purtroppo vorrei farmi restituire uno dei messaggi di errore, ma non ci riesco perché la funzione è protected.
Quindi ti chiedo, come posso farmi restituire il messaggio di errore nella pagina di caricamento?
Grazie.