Foros del Web » Programando para Internet » PHP »

No se actualizar mi base de datos con un XML

Estas en el tema de No se actualizar mi base de datos con un XML en el foro de PHP en Foros del Web. Hola buenas a todos y gracias de antemano por vuestra ayuda, teng un problemila. Tengo un fichero que me procesa un XML y me lo ...
  #1 (permalink)  
Antiguo 02/09/2009, 10:06
 
Fecha de Ingreso: abril-2009
Mensajes: 64
Antigüedad: 15 años
Puntos: 0
No se actualizar mi base de datos con un XML

Hola buenas a todos y gracias de antemano por vuestra ayuda, teng un problemila.
Tengo un fichero que me procesa un XML y me lo inserta en mi base de datos.
El problema es que una vez al mes, me van a enviar el XML actualizado.
Entonces no se como hacer para que me haga un update de solo los prouctos que me vengan nuevos o de los que tengan datos modificados.
¿Es muy complicado? porque la verdad me ha costado la vida hacer este fichero ahora mismo estoy un poco atrancado,encima mis jefes sabiendo que no se hacerlo me estan presionando muchisimo.
Aqui os dejo el codigo de procesamiento del XML (si alguien lo necesita puede copiarlo sin problema, o si tiene alguna duda sin problema se contesta).


Código PHP:
Ver original
  1. <?php
  2. include ('../config.php');
  3.  
  4.  
  5. function convierte_municipio($municipio_cam) {
  6.     $query="select id_whp from municipios_cam_whp where id_cam='$municipio_cam'";
  7.     $result=mysql_query($query);
  8.     $id_whp = "0";
  9.     while($row = mysql_fetch_array($result)) {
  10.         $id_whp = $row["id_whp"];
  11.     }
  12.     if ($id_whp!=0) {
  13.         return $id_whp;
  14.     } else {
  15.         return 0;
  16.     }
  17. }
  18.  
  19. function convierte_tipo($tipo_cam) {
  20.     $convierte = array(
  21.         1 => 1,
  22.         2 => 2,
  23.         3 => 3,
  24.         4 => 4,
  25.        
  26.     );
  27.     return $convierte[$tipo_cam];
  28. }
  29.  
  30.  
  31. function convierte_categoria($categoria_cam) {
  32.     $convert = array(
  33.         118 => 1,
  34.         119 => 2,
  35.         120 => 4,
  36.         121 => 5,
  37.         124 => 5,
  38.         128 => 6,
  39.         129 => 6,
  40.         130 => 6,
  41.         132 => 6,
  42.         133 => 6,
  43.         134 => 6,
  44.         135 => 6,
  45.         136 => 6,
  46.         137 => 6,
  47.         138 => 6,
  48.         139 => 1,
  49.         140 => 3,
  50.         142 => 1,
  51.         143 => 1,
  52.         144 => 1,
  53.         145 => 2,
  54.         146 => 6,
  55.         147 => 6,
  56.         148 => 1,
  57.         149 => 6,
  58.         150 => 6,
  59.         151 => 6,
  60.         152 => 6,
  61.         153 => 6,
  62.         154 => 6,
  63.         155 => 6,
  64.         158 => 6,
  65.         159 => 6,
  66.        
  67.     );
  68.     return $convert[$categoria_cam];
  69. }
  70.  
  71.  
  72.  
  73. $xml = simplexml_load_file("move.xml");
  74.  
  75. $products = $xml->product;
  76.  
  77. $array_campos = array("titulo_oferta" => "titulo_oferta", "desc_largaIngles" => "desc_corta", "precio" => "precio", "precio_lib" => "price_lib","id_municipio" => "id_municipio", "id_categoria" => "id_categoria", "id_tipo" => "id_tipo", "image1" => "ruta_foto", "image2" => "ruta_foto2", "image3" => "ruta_foto3", "image4" => "ruta_foto4", "image5" => "ruta_foto5", "image6" => "ruta_foto6", "habs" => "habs", "bath" => "bath", "orient" => "orient", "direc" => "direc", "size" => "size", "ref" => "ref", "price_m2" => "price_m2", "built_size" => "built_size", "plot_size" => "plot_size", "floor" => "floor", "garage" => "garage", "Lumberroom" => "lumberroom", "padel" => "padel", "school" => "school", "swimming_pool" => "swimming_pool", "golf" => "golf", "beach" => "beach", "medicalCenter" => "medicalCenter", "desc_largaIngles" => "desc_largaIngles", "desc_larga" => "desc_larga"  );
  78.  
  79. $num_elemento_municipio_en_array = 4;
  80. $num_elemento_tipo_en_array = 6;
  81. $num_elemento_categoria_en_array = 5;
  82.  
  83.  
  84. foreach ($products as $product) {
  85.  
  86.     $array_municipios_no_aceptados = array(30026, 3047);
  87.  
  88.     if (in_array($product->id_municipio , $array_municipios_no_aceptados)) {
  89.         continue;
  90.     }
  91.    
  92.     $arraydecampos = array();
  93.     $arraydevalores = array();
  94.     foreach ($array_campos as $campo => $campo_db) {
  95.         if (property_exists($product, $campo)) {
  96.             $arraydecampos[] = $campo_db;
  97.             $arraydevalores[] = addslashes(utf8_decode($product->$campo));
  98.         }
  99.     }
  100.    
  101.     $arraydevalores[$num_elemento_municipio_en_array] = convierte_municipio($arraydevalores[$num_elemento_municipio_en_array]);
  102.     $arraydevalores[$num_elemento_tipo_en_array] = convierte_tipo($arraydevalores[$num_elemento_tipo_en_array]);
  103.     $arraydevalores[$num_elemento_categoria_en_array] = convierte_categoria($arraydevalores[$num_elemento_categoria_en_array]);
  104.  
  105.    
  106.     $cadenadecampos = implode(",", $arraydecampos);
  107.     $cadenadevalores = "'" . implode("','", $arraydevalores) . "'";
  108.  
  109.    
  110.     $query = " insert into productos ($cadenadecampos ) VALUES ($cadenadevalores)";
  111.     $result = mysql_query($query) ;
  112.    
  113.     if ($result === false) {
  114.         echo "Error: no se ha podido insertar la propiedad <br />";
  115.         echo mysql_error() . "<br />";
  116.         echo $query;
  117.         exit;
  118.     } else {
  119.         echo "propiedades actualizadas  " .$arraydevalores[0]. " -- -->".  $arraydevalores[18] ."<br />" ;
  120.        
  121.     }
  122. }
  123.  
  124. ?>

Última edición por jam1138; 03/09/2009 a las 12:37 Razón: Coloreo código
  #2 (permalink)  
Antiguo 13/09/2009, 22:49
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: No se actualizar mi base de datos con un XML

Hola
Pues para ayudarte mejor vendría bien varias cosas
1. Que tienes en el config que incluyes
2. Estructura de la bd
3. Estructura del xml
Ahora, haciendo a un lado esto, por lo que veo en tu codigo
haces inserts, y si entiendo bien lo que quieres, es revisar los datos
del xml contra los de la bd para que dependiendo si viene un producto
que ya existe en la bd no lo inserte de nuevo sino que lo actualize correcto?

Bueno, pues no es complicado, y más con lo que tienes, pues como ya estas recorriendo
los valores del xml en el foreach e insertas, lo que te falta es hacer antes del insert un select que vaya a la tabla de productos y seleccione el producto con los filtros de los campos y sus valores que obtienes del xml
Una vez el haga el select, si ese mysql_query tiene mysql_num_rows mayor a 0, quiere decir que el producto existe, entonces harias un if en donde preguntes el mysql_num_rows y si es mayor a 0 haces un update, y si es 0 , es decir, el producto es nuevo, entonces haces el insert
Ej:
Código php:
Ver original
  1. //Arriba esta el foreach general que ya tienes
  2.     $query = "SELECT * from productos ";
  3.     $i = 0;
  4.       foreach ($array_campos as $campo => $campo_db) {
  5.         if (property_exists($product, $campo)) {
  6.             if( $i == 0 );
  7.                 $query.= " WHERE ". $campo_db ." = ". addslashes(utf8_decode($product->$campo)); //Si no quieres el = usas like o lo que creas mejor
  8.             }else{
  9.                 $query.= " AND ". $campo_db ." = ". addslashes(utf8_decode($product->$campo)); //Si no quieres el = usas like o lo que creas mejor
  10.             }
  11.         }
  12.         $i++;
  13.     }
  14.     $result = mysql_query($query) ;
  15.     $query = "";
  16.     if( mysql_num_rows($result) == 0 ){
  17.         $query = " insert into productos ($cadenadecampos ) VALUES ($cadenadevalores)";
  18.     }else{
  19.         $query = " update productos set campo = valor, campo2 = valor2 WHERE campoclave = valorclave";// tan largo como se necesite
  20.     }
  21.     $result = mysql_query($query) ;
  22. //Cierra el foreach general que ya tienes

Espero haber sido claro
Saludos
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 09:35.