Foros del Web » Programando para Internet » PHP »

Cargar archivo CSV e insertarlo en tabla.

Estas en el tema de Cargar archivo CSV e insertarlo en tabla. en el foro de PHP en Foros del Web. Hola, estoy con un desarrollo y he llegado al siguiente problema. Tengo un formulario en el que el usuario sube un archivo CSV con una ...
  #1 (permalink)  
Antiguo 20/08/2014, 04:44
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Pregunta Cargar archivo CSV e insertarlo en tabla.

Hola, estoy con un desarrollo y he llegado al siguiente problema.

Tengo un formulario en el que el usuario sube un archivo CSV con una serie de campos predefinidos.

El problema llega a la hora de guardar esos campos en una tabla MySQL, no consigo hacerlo. Tengo el siguiente codigo:

Código PHP:
//Si el archivo NO esta vacio, y NO da error -->
if(!empty($archivo) && !$archivo['error']){
    
$ext = (string)end(explode('.'$archivo['name']));
    (
$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'){


        
//Abre el archivo en modo de solo lectura con el cursos al principio, y lo setea a --rpoint--
        
$rpoint fopen($archivo['tmp_name'],'r');
        
        
//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";");
        /
        
//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']);
        
        
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...\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,";"); 
        
                
//Aqui voy controlando los errores posibles en cada posicion del CSV
        
        
$row 2;
            while ((
$data fgetcsv($rpoint1000";")) !== FALSE) {
                
$num count($data);
                echo 
"cuenta --> " $num "<br/>";
                
$skipl true;
                for(
$i 0$i $num$i++){
                    
$skipl $skipl && ($data[$i] == '');
                }
                if(!
$skipl){
                    
//idTipoSuelo
                    
if ($data[0] == '' || $data[0] > '16' || $data[0] == '1') {
                        
$sMensaje 'Existen erores en el archivo de carga de activos. <a href="#ListadoErrores">Consúltelos al final de la página.</a>';
                        
$errores['idTipoSuelo'][] = $row;
                        }
                    
//C_Latitud    
                    
if ($data[1] != '') {
                        for (
$i=0$i<strlen($data[1]); $i++){ 
                              if (
strpos($permitidosLatLongsubstr($data[1],$i,1))===false){ 
                                    
$errores['C_Latitud'][] = $row;
                                    
$sMensaje 'Existen erores en el archivo de carga de activos. <a href="#ListadoErrores">Consúltelos al final de la página.</a>';
                              } 
                           } 
                    }...
//Asi hasta 51 que es el numero de posiciones
fputcsv($wpoint,$data,";"); 
Y por ultimo una vez comprobado que no hay errores realizo la consulta pasandole la ruta.
Código PHP:
$sSQL " LOAD DATA INFILE '" $ruta "'" .
                    
" 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)){ 
No consigo que se suba el archivo al servidor, ni que se inserte ningun dato en la tabla correspondiente
He mirado otros topic muy parecidos y bastante antiguos, pero no doy con ello.

Un SALUDO
  #2 (permalink)  
Antiguo 20/08/2014, 06:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 3 meses
Puntos: 2658
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Movido de MySQL a PHP para evitar tener que eliminar codigo no admitido en el foro.

Por lo pronto, no entiendo para qué haces un LOAD DATA, si ya tienes todo el contenido del CSV en PHP, y depurado.
¿No sería mas sencillo que lo insertases directamente en la base, a partir del prime script?

Por otro lado, ese "SET idCliente" no corresponde a la sintaxis de LOAD DATA, y también debes tener en cuenta que para usar LOAD DATA necesitas un usuario de MySQL con permisos de FILE (que no se otorgan siempre), y que esa sintaxis sólo aplicaría si el archivo se encontrasu subido al servidor.
¿Eso lo tomaste en cuenta ya?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/08/2014, 05:08
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
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
  #4 (permalink)  
Antiguo 21/08/2014, 07:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 3 meses
Puntos: 2658
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Cita:
El tema de los permisos he aplicado 777 al usuario que hace la co
Esos no son permisos e MySQL, son permisos de lectura/escritura de archivos en servidor.
no confundas las cosas. El usuario de MySQL no depende del usuario en el host. Son sistemas de usuarios separados.

Respecto al LOAD DATA, si el archivo está en tu PC o en otra que no sea el host (servidor donde está instalado MySQL), debes usar la sintaxis
Código MySQL:
Ver original 
Respecto al SET, lo siento, es una sintaxis que nunca vi usar, pero es válida (nunca la vi usar en ningún caso de la vida real).

http://dev.mysql.com/doc/refman/5.0/es/load-data.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/08/2014, 08:28
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Gracias de nuevo por la respuesta.

El tema de los permisos en MySQL la verdad lo desconozco, nunca he realizado nada que me obligue a modificar dichos permisos. Uso plesk gestionado con Navicat en un servidor windows.
¿Como tendría que asignar esos permisos en un php o desde phpMyadmin?

Respecto a la consulta el servidor y la BBDD están en la misma IP por lo que entiendo que tendría que usar LOAD DATA LOCAL INFILE ¿Sin el LOCAL ?

Con lo del SET probablemente no sea una buena praxis, pero como te digo estoy modificando un codigo que no es mio, y me esta dificultando las cosas bastante el hecho de que no este documentado.
  #6 (permalink)  
Antiguo 21/08/2014, 09:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 3 meses
Puntos: 2658
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Cita:
Respecto a la consulta el servidor y la BBDD están en la misma IP por lo que entiendo que tendría que usar LOAD DATA LOCAL INFILE ¿Sin el LOCAL ?
Creo que no me entendiste...

La cláusula LOCAL se usa cuando el archivo de datos que se lee está en una carpeta diferente a la de la base de datos, o en una computadora que no sea la del host.
Vale decir:
- Si has subido el archivo de datos a la carpeta mysql/bin, o mysql/data, no usas el LOCAL.
- Si has subido el archivo de datos a otra carpeta, o bien lo estás leyendo desde un navegador, a una unidad de la pC cliente, debes usar LOCAL.

En el caso de pruebas en una PC local, por ejemplo, podrías perfectamente tener el archivo en el directorio raiz del disco, pero en ese caso sin el LOCAL, no leerá los datos.

¿Se entiende?

En referencia al punto:
Cita:
el servidor y la BBDD están en la misma IP
Es totalmente irrelevante.
El host funciona en una computadora determinada, accedida por IP. Pero sus parametrios de configuracion le son propios al WebServer, no a la base de datos.
MySQL, por su lado, podría estar tranquilamente instalado en ese host, y de todos modos la base de datos estár en otra computadora de la red, en otro edificio, de otro país, y el servidor de MySQL lo interpretaría como local, porque eso depende de las variables de configuraciones internas de MySQL, que son inaccesibles por el host.

Entiende que un DBMS es un sistema cerrado que funciona dentro de otro sistema. No comparte los componentes kernel con el host... Sólo comparte comunicaciones, permisos de lecto escritura local y memoria física (que reserva para si y la que pide).

Otras cosas para que peudas tener la imagen mental es que podrías tener permisos en el host para llegar a eliminar el MySQL, pero no podrías desde allí borrar los usuarios internos de MySQL... porque sin un user de MySQL no puedes acceder a los datos.

En resumen, ¿dónde está el archivo cuando lo lees? ¿En el host, dentro de la carpeta de MySQL, o está en otra carpeta o PC?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 21/08/2014, 10:39
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Creo que si que voy entendiendo.

Desconocía el uso de las carpetas mysql/bin, data...

Lo que normalmente hago es abrir el cpanel o el plesk, creo una nueva cuenta del tipo mydominio.es la configuro en el cliente FTP.
Después creo una base de datos asociada a ese host y listo.

Por lo que entiendo si que tendría que usar el LOCAL.
Ya que lo que necesito es lo siguiente.

El cliente sube un CSV con un form, este CSV se guarda en una carpeta creada para tal efecto dentro de la tipica carpeta www, o httpdocs de modo que quedaría alojado en: www.mydominio.es/uploads/temp, siendo la ruta completa www.mydominio.es/uploads/temp/myexcel.csv

Ese CSV es el que se insertaría en la BBDD después de insertarlo no lo necesito para nada podría desaparecer.

Un saludo
  #8 (permalink)  
Antiguo 26/08/2014, 04:02
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Una subidita al tema

Usando el LOCAL y guardado los archivos en las carpetas del FTP tampoco me inserta los datos.

Algo se esta quedando por el camino.
  #9 (permalink)  
Antiguo 26/08/2014, 07:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 3 meses
Puntos: 2658
Respuesta: Cargar archivo CSV e insertarlo en tabla.

OK, bueno, verificaste que entre los permisos del user de MySQL en el host, tengas efectivamente el grant de FILE?
Ese es un permiso imprescindible para hacer LOAD DATA, y no tiene nada que ver que tengas permisos para escribir en servidor. Es un GRANT exclusivo de uso interno de MySQL, que si no lo tienes no podrás usar LOAD DATA...
Usualmente en los hosting compartidos no suelen dar ese permiso, ya que es riesgoso para la seguridad. Como se trata de un permiso administrativo global del servidor, y no local de una base, los administrdores de los hosting son reacios a darlo.

Verifica eso, porque es la única causa por la que el LOAD DATA no genere errores, pero tampoco cargue los datos.

Posdata: Recuerda que la ruta no es simplemente de "las carpetas de FTP", sino que la ruta debe ser accesible para el servidor de MySQL, no es lo mismo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 26/08/2014, 08:59
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Efectivamente estaban todos los permisos marcados menos el GRANT

Ya esta activado, pero sigo con los mismos problemas.

Tras ejecutar mi PHP y hacer un echo de la consulta obtengo esto:
Código PHP:
LOAD LOCAL DATA INFILE 'http://desarrollo.midominio.es/carpeta/temp/f5657226e2fa54ceaccb41d7b6b0f44e' 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,ActivoIMG1,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_Desc2ENSET idCliente 23 
Me genera un numero aleatorio, de un archivo que supuestamente tendria que estar subiendose a la carpeta TEMP.

Como no se sube nadie, y para poder probar he subido el archivo CSV a mano a ../temp/datos.csv y he ejecutado las siguientes consultas:
(Subo foto)
[url=http://subefotos.com/ver/?e6019abbd3115fdfc19a1f6900746a25o.png] [img]http://thumbs.subefotos.com/e6019abbd3115fdfc19a1f6900746a25o.jpg[/img][/url]

No consigo ejecutar la consulta

Gracias
  #11 (permalink)  
Antiguo 26/08/2014, 09:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 3 meses
Puntos: 2658
Respuesta: Cargar archivo CSV e insertarlo en tabla.



El primer error es porque el archivo indicado no existe.
El segundo porque la ruta debería estar entre apóstrofos.
El segundo es un inconveniente por la ruta. Sería mejor que usaras una ruta relativa al site, y no una ruta absoluta.

Veamos si este ejemplo inspirador te sirve (hurtado de otro site):

Código PHP:
Ver original
  1. $uploaddir ='csv/'; //upload directory
  2. $uploadfile= $uploaddir.$_FILES['csv']['name']; //full path adn file name
  3.  
  4. if(move_uploaded_file($_FILES['csv']['tmp_name'], $uploadfile))
  5. {
  6.     $result=mysql_query("LOAD DATA LOCAL INFILE '$uploadfile' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' OPTIONALLY  ENCLOSED BY ''  LINES TERMINATED BY '\n'");
  7. else
  8. {
  9. }
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 26/08/2014 a las 09:53
  #12 (permalink)  
Antiguo 26/08/2014, 09:53
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Hola,
Gracias por la respuesta.

¿Entendemos por ruta relativa poner la consulta del siguiente modo:?

Código PHP:
LOAD LOCAL DATA INFILE '../temp/datos.csv' 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,ActivoIMG1,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_Desc2ENSET idCliente 23 
  #13 (permalink)  
Antiguo 26/08/2014, 10:46
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Cita:
Iniciado por gnzsoloyo Ver Mensaje

No habia visto esta parte, la pruebo y te comento. GRACIAS

Veamos si este ejemplo inspirador te sirve (hurtado de otro site):

Código PHP:
Ver original
  1. $uploaddir ='csv/'; //upload directory
  2. $uploadfile= $uploaddir.$_FILES['csv']['name']; //full path adn file name
  3.  
  4. if(move_uploaded_file($_FILES['csv']['tmp_name'], $uploadfile))
  5. {
  6.     $result=mysql_query("LOAD DATA LOCAL INFILE '$uploadfile' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' OPTIONALLY  ENCLOSED BY ''  LINES TERMINATED BY '\n'");
  7. else
  8. {
  9. }
  #14 (permalink)  
Antiguo 28/08/2014, 03:25
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Hola gnzsoloyo,
he probado tu codigo, pero no entra en la primera condicion, se me sale al else.
Código PHP:
            $uploaddir ='csv/'//upload directory
            
$uploadfile$uploaddir.$_FILES['csv']['name']; //full path adn file name
     
            
if(move_uploaded_file($_FILES['csv']['tmp_name'], $uploadfile)){
                
$result=mysql_query("LOAD DATA LOCAL INFILE '$uploadfile' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' OPTIONALLY  ENCLOSED BY ''  LINES TERMINATED BY '\n'");
            }else{
                echo 
"Aqui hay error";
            } 
¿Alguna idea?, esto me esta desesperando

Saludos
  #15 (permalink)  
Antiguo 04/09/2014, 03:53
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Le pego una subidita al tema, ahora que se han acabo las vacaciones, haber si puedo salir de mi atasco.

Realmente no me importa conservar el código que tengo, solo necesito mediante un formulario, subir CSV, e insertar cada linea del CSV en una tabla MySQL.

(No necesito conservar el CSV en el servidor una vez insertados los datos)
  #16 (permalink)  
Antiguo 09/10/2014, 14:12
 
Fecha de Ingreso: septiembre-2014
Mensajes: 2
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Cargar archivo CSV e insertarlo en tabla.

Buen Dia, Tengo un problema quiero subir a mysql un archivo que el usuario seleccione con load data infile es para no dejarle la ruta especifica, si no que el usuario escoja que ira a subir me podrian ayudar

Etiquetas: mysql, mysql+consulta, php+archivos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:38.