Nueva pregunta

Pregunta:

Fecha: 27-03-2015 17:02:50 (En Español)

Update con archivo CSV[Resuelta]

Hola tengo un código para insertar a mysql con php desde un archivo csv, ahora lo que quiero hacer es que si existe el registro me lo actualice de lo contrario que haga el insert, eh probado varios codigos y no logro hacerlo funcionar.

$row = 1;
$handle = fopen("der.csv","r"); //Coloca el nombre de tu archivo .csv que contiene los datos
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { //Lee toda una linea completa, e ingresa los datos en el array 'data'
    $num = count($data); //Cuenta cuantos campos contiene la linea (el array 'data')
    $row++;
	
    $cadena = "INSERT INTO `lista`(Codigo, Descripcion, Marca, Precio) values("; //Cambia los valores 'CampoX' por el nombre de tus campos de tu tabla y colócales los necesarios
    
	
	
	for ($c=0; $c < $num; $c++) { //Aquí va colocando los campos en la cadena, si aun no es el último campo, le agrega la coma (,) para separar los datos
        if ($c==($num-1))
              $cadena = $cadena."'".$data[$c] . "'";
        else
              $cadena = $cadena."'".$data[$c] . "',";
    }

    $cadena = $cadena.");"; //Termina de armar la cadena para poder ser ejecutada
    echo $cadena."<br>";  //Muestra la cadena para ejecutarse

     $enlace=Conectarse();
     $result=mysql_query($cadena, $enlace); //Aquí está la clave, se ejecuta con MySQL la cadena del insert formada
     mysql_close($enlace);
}

fclose($handle);

Gracias por la ayuda
Etiquetas: CSV - MySQL - PHP - Pregunta Votos: 0 - Respuestas: 7 - Vistas: 23 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 27-03-2015 17:10:44 Hola Sebastian, para estos casos puedes utilizar la instrucción REPLACE de MySQL, se comporta como el INSERT INTO, pero cuando el registro existe realiza un UPDATE (justo lo que estás necesitando).

    Aquí te dejo el enlace a la documentación oficial: http://dev.mysql.com/doc/refman/5.6/en/replace.html

    Espero que mi respuesta te sea de ayuda, luego nos cuentas como te fue.

    Saludos,
    Fernando
      Votos: 2 - Link respuesta
     
  • Fecha: 29-03-2015 14:16:58 Sumando a la respuesta anterior, podes tambien ver la sentencia INSERT ... ON DUPLICATE KEY UPDATE que esta disponible en las versiones >= 5.x de MySQL

    https://mariadb.com/kb/en/mariadb/insert-on-duplicate-key-update/
      Votos: 2 - Link respuesta
     
  • Fecha: 30-03-2015 04:32:19 Una recomendación extra que hago para enriquecer lo dicho por Fernando y Diego es que ejecutes la función Conectarse(); fuera del while. Esto es porque cada vez que ejecutas el ciclo, tu script hace una conexión a la base de datos, inserta/actualiza el registro que se leyó y luego cierra la conexión. Si hace eso con miles de registros en tu archivo CSV, estarías obligando al servidor a abrir y cerrar conexiones innecesariamente. Abre entonces la conexión antes del ciclo y ciérrala cuando éste concluya (justo antes de fclose();, por ejemplo).

    Otra cosa, en la estructura if...else no usas llaves. Aunque el código no genera errores, es un mal hábito, deberías agregar las llaves luego de cada condición de esta manera:
        if(condición){
            // tus instrucciones
        } else {
            // Las otras instrucciones
        }
    
      Votos: 1 - Link respuesta
     
  • Fecha: 30-03-2015 07:34:08 solo agrega un index autoincrement a tu tabla y olvidate si hay duplicados..   Votos: 0 - Link respuesta
     
  • Fecha: 30-03-2015 14:06:10 Excelente luego del fin de semana empezando a probar codigo, sobre el REPLACE toma algun campo que tengo que indicarle o solo el primero en el caso de mi codigo.
    sobre lo de la conexión es verdad entra en el ciclo voy a corregirlo.
    Sobre lo de faustino del Id no debe usar ya que son listas de varios clientes que vienen con su codigo, ahi fue donde se me complico, desde ya muchas gracias a todos y voy a empezar a probar, cualquier duda que me surge si no es molestia les consulto. Muchasss Graciasss a todos
      Votos: 0 - Link respuesta
     
  • Fecha: 30-03-2015 14:42:56 Ahi probando y cambiando el codigo según los ejemplos funciona perfecto.
    Consulta al terminar obtengo los resultados que se insertaron como puedo discriminar los que se insertaron y los que se actualizaron. Sobre la actualización coloque valor único al código, ahora entendiendo el codigo se va a modificar solo cuando cambie el codigo o cualquier otro campo no logro entender, si es solo codigo esta bien pero si alguien me puede explicar para lograr entender. gracias a la explicación de todos eh adquirido varios conocimiento. Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 30-03-2015 15:09:49 Sebastian, sólo se me ocurre que agregues un campo que sirva de bandera en la BD que se llame "nuevo" (por ejemplo), debe ser de tipo boolean. Cuando creas un registro nuevo, asignas un valor verdadero al campo y cuando modificas un registro, lo cambias a falso.

    Hay una función de MySQL que retorna el último registro insertado en una tabla: last_insert_id(). Sin embargo, no te aconsejo que uses funciones propias de MySQL puesto que tu código dejaría de ser compatible con ANSI SQL y eso es algo que no es deseado en entornos de producción muy dinámicos.
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com