Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Comparare campi file csv con campi tabella database

    Buongiorno a tutti.
    Nonostante abbia un file csv con i nomi dei campi identici alla tabella mysql che riceverà i dati, dopo l'import, c'è sempre il collega anarchico.
    Ora, per ovviare al fallimento del caricamento, vorrei fare un confronto del nome dei campi presenti nel csv e nella tabella mysql.
    Potete aiutarmi per favore?
    Grazie.

  2. #2
    puoi spiegare meglio l'esigenza, magari con un esempio? grassssie

  3. #3
    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.

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,365
    Comunque, se le strutture sono differenti perché non evidenziare le differenze. Dire, manca quel campo in quella posizione, dire che c’è un campo di troppo, etc… Magari, controllare il tipo dei campi. Cioè, tutto quello che occore per poter reagire in un baleno anziché passare un’ora a cercare le differenze.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,365
    Una funzionne che torna 3 tipi di dati !!!
    Vade retro Satana !
    Ultima modifica di badaze; 11-07-2024 a 07:55
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,365
    codice:
    mysqli_free_result($query);
    mysqli_close($link);
    
    Non sono mai eseguiti visto che si esce dalla funzione prima.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,365
    Fossi in te, farei il controllo prima di eseguire il download.E vedrai che i tuo problema verrà risolto.
    Ti dó la dritta ma non la soluzione.


    Codice PHP:
            $result fieldsCompareCsvToTable…
            
    if($result ==1){
                
    handle_file_upload…
            
    } else {
               
    A seconda del valore di $result (23quello che vuoi
            } 
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.