Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/08/2014, 05:08
charliedj7
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 12 años
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Hola gnzsoloyo,
Disculpa por no postear en el foro correcto, tenia la duda de en cual incluirlo.

Explico el flujo para ver si me podéis aconsejar el mejor modo de hacerlo.

1- Recojo el archivo CSV con un input
2- Lo almaceno en una variable
Código PHP:
if(isset($_FILES['datafile'])){$archivo $_FILES['datafile'];} 
3- Compruebo que es CSV
Código PHP:
($archivo['name'] != $ext) ? strtolower($ext) : '';
    
// La ruta debe cambiar los slash. Si esto corriese en Linux habría que revisarlo
    // Se verifica que el archivo enviado es un CSV
    
if($ext == 'csv'){ 
Si es CSV continuo
Código PHP:
//Abre el archivo en modo de solo lectura con el cursos al principio, y lo setea a --rpoint--
        
$rpoint fopen($archivo['tmp_name'],'r');
        
//echo "rpoint -->" . $rpoint . "<br>";
        //Obtiene una linea desde el handle --rpoint-- con parametro a 5000 longitud de la linea mas larga. y lo setea a --data--
        
$data fgetcsv($rpoint5000";");
        
//echo "data -->" . $data . "<br>";
        //Coge la ruta de TEMP y le concatena el nombre de archivo hasseado en md5 . y lo setea a --tfile--
        
$tfile TEMP md5($archivo['name']);
        
//echo "tfile -->" . $tfile . "<br>";
        
chmod($tfile0755);
        
chmod($archivo['tmp_name'], 0755);    
        
//Realiza una copia de archivo en destino (tfile)
        
if (!copy($archivo['tmp_name'],$tfile)) {
            echo 
"Error al copiar $archivo... (LINEA 83)\n";
        }
        
//Abre el fichero en la ruta destino (tfile) y lo setea a wpoint
        
$wpoint fopen($tfile,'w','r');
        
//remplaza \\ en tfile y lo setea a  --ruta--
        
$ruta str_replace('\\','/',$tfile);
        
//coloca el csv (devuelve FALSE si error)
        
fputcsv($wpoint,$data,";"); 
El codigo anterior me falla en el copy, si lo entiendo bien eso tendria que colocar mi archivo en el servidor??

Pero no sube nada.

4- Hago la revision de errores.
5- Lo paso a una tabla temporal y luego a la tabla definitiva.
Código PHP:
if ($archivok=='1'){
            echo 
"----------------------------------------------> BP2.1";
        
            
$sSQL " LOAD DATA INFILE '" $fichero "'" .
                    
" INTO TABLE ga_tmpActivosDocumentos " .
                    
" FIELDS TERMINATED BY ';'" .
                    
" LINES TERMINATED BY '\\n' " .
                    
" IGNORE 1 LINES (idTipoSuelo,C_Latitud,C_Longitud,Referencia,Zona,idProvincia,Poblacion,TituloActivo,Descripcion,Superficie,Gastos,Equipamiento,EquipamientoEN,GestionDocumental,PrecioVenta,CampoLibre1_Texto,CampoLibre1_Titulo,CampoLibre1_TextoEN,CampoLibre1_TituloEN,Activo," .
                    
" IMG1,IMG_Desc1,IMG_Desc1EN,IMG2,IMG_Desc2,IMG_Desc2EN,IMG3,IMG_Desc3,IMG_Desc3EN,IMG4,IMG_Desc4,IMG_Desc4EN,DOC1,DOC_Desc1,DOC_Desc1EN,DOC2,DOC_Desc2,DOC_Desc2EN,DOC3,DOC_Desc3,DOC_Desc3EN,DOC4,DOC_Desc4,DOC_Desc4EN,URL1,URL_Desc1,URL_Desc1EN,URL2,URL_Desc2,URL_Desc2EN)" .
                    
" SET idCliente = " $sActivoCliente "" ;
            echo 
$sSQL;        
            if(
$oBD->fnModifica($sSQL)){
                    echo 
"----------------------------------------------> BP3";
                
$sSQLTemp " SELECT * FROM ga_tmpactivosdocumentos";
                if(
$oBD->fnConsulta($sSQLTemp)){
                    
$aidActivos $oBD->fnObtenMatriz();
                        echo 
"----------------------------------------------> BP4";
                        foreach (
$aidActivos as $aidActivo) {
                                
$sSQLInsActivo "INSERT INTO ga_activos (idCliente, idTipoSuelo, C_Latitud, C_Longitud, Referencia, Zona, idProvincia, Poblacion, TituloActivo, Descripcion, DescripcionEN, Superficie, Gastos, Equipamiento, EquipamientoEN, GestionDocumental, PrecioVenta, CampoLibre1_Titulo, CampoLibre1_Texto, CampoLibre1_TituloEN, CampoLibre1_TextoEN, Activo, FechaActivo) VALUES (";
                                
//INSETA VALORES    
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['idActivo'], 'txt') . ", ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['idCliente'], 'txt') . ", ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['idTipoSuelo'], 'txt') . " , ";
                                
$sSQLInsActivo .= $aidActivo['C_Latitud'] . ", ";
                                
$sSQLInsActivo .= $aidActivo['C_Longitud'] . ", ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['Referencia'], 'txt') . " , ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['Zona'], 'txt') . " , ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['idProvincia'], 'txt') . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['Poblacion'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['TituloActivo'], 'txt')) . " , ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['Descripcion'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['DescripcionEN'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['Superficie'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['Gastos'], 'txt')) . " , ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['Equipamiento'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['EquipamientoEN'], 'txt')) . ", ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['GestionDocumental'], 'txt') . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['PrecioVenta'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['CampoLibre1_Titulo'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['CampoLibre1_Texto'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['CampoLibre1_TituloEN'], 'txt')) . ", ";
                                
$sSQLInsActivo .= str_replace('\"',"",fnObtenValorSQL($aidActivo['CampoLibre1_TextoEN'], 'txt')) . ", ";
                                
$sSQLInsActivo .= fnObtenValorSQL($aidActivo['Activo'], 'txt') . ", " 'NOW()'  ");";
                                
$oBD->fnModifica($sSQLInsActivo); 
Realmente estoy modificando un código existente y veo cosas sin sentido. Pero tengo que intentar variar el código lo menos posible.

No se si no estoy siendo lo suficientemente claro con mi explicación.
Básicamente lo que me gustaría es poder subir el archivo excel con varias lineas para que se puedan hacer inserciones masivas en la BD (No necesito que el archivo se gurade, solo sus valores.)

El tema de los permisos he aplicado 777 al usuario que hace la conexión.

Gracias