Foros del Web » Programando para Internet » PHP »

Comparación entre registros de un BD

Estas en el tema de Comparación entre registros de un BD en el foro de PHP en Foros del Web. Buenas. Tengo dos BD mysql identicas, en la que se supone que una esta en LOCAL y la otra en otro lugar... Una opción que ...
  #1 (permalink)  
Antiguo 26/04/2011, 02:54
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
Pregunta Comparación entre registros de un BD

Buenas.
Tengo dos BD mysql identicas, en la que se supone que una esta en LOCAL y la otra en otro lugar...

Una opción que barajé fue la de exportar los datos e importarlos a la otra BD o borrar e insertar de nuevo todos los datos, pero esas opciones estan bien si tenemos pocos DATOS, si hablamos de mucha inormación, ese proceso puede ser lento...

Mi intención es un sincronizado entre las dos BD sobre una tabla, para ello comparo los "id" y la fecha de actualización intentando que me muestre las tuplas a actualizar,borrar y nuevos.

A ver si alguien me puede ayudar en el planteamiento pues no salgo del mio y es incorrecto...

Código PHP:
<?php
/* 
 * Script para sincronizar los Datos en LOCAL con una conexion guardada de una BD en internet o en LOCAL
 * MYSQL
 */

//conexion a la BD local
include("../../nucleo/config/BD/conexionBD.php");

//Datos de otra BD para sincronizar.
$urls $_POST["url"];
$BDs $_POST["BD"];
$usuarios $_POST["usuario"];
$claves $_POST["clave"];
$error 0;


if(
$linkSincro mysql_connect($urls,$usuarios,$claves)){
    if(
mysql_select_db($BDs$linkSincro)){
        
$sql "SELECT * FROM tDocumentos";
        
$resultSincro mysql_query($sql,$linkSincro);
        
$numResult mysql_num_rows($resultSincro);
        
$link abrirBD();

        
//copiar todos los datos de la BD local al nuevo servidor o actualiza.

        //Copio los Documentos
        
if($numResult == 0){
            
//selecciono los documentos en local para guardar todos en otro servidor.
            
if($result mysql_query($sql,$link)){
                while (
$row mysql_fetch_array($result)) {
                    
//funcion mysql_real_escape_string(): Escapa caracteres especiales en una cadena para ser usado en una sentencia SQL
                    
$textarea mysql_real_escape_string($row["contenido"],$link);
                    
$sqlInsert "INSERT INTO tDocumentos VALUES('".$row["id"]."','".$row["titulo"]."','".$textarea."','".$row["privacidad"]."','".$row["fecha"]."','".$row["actualizacion"]."')";
                    if(!(
mysql_query($sqlInsert,$linkSincro))){
                        
errorBD($linkSincro);
                        
$error++;
                    }
                }

                
$sql "SELECT * FROM tEtiquetas";
                if(
$result mysql_query($sql,$link)){
                    while (
$row mysql_fetch_array($result)) {
                        
$sqlInsert "INSERT INTO tEtiquetas VALUES('".$row["id"]."','".$row["nombre"]."')";
                        if(!(
mysql_query($sqlInsert,$linkSincro))){
                            
errorBD($linkSincro);
                            
$error++;
                        }
                    }
                }else{
                    
errorBD($link);
                    
$error++;
                }

                
$sql "SELECT * FROM DocuEti";
                if(
$result mysql_query($sql,$link)){
                    while (
$row mysql_fetch_array($result)) {
                        
$sqlInsert "INSERT INTO DocuEti VALUES('".$row["idDocu"]."','".$row["idEti"]."')";
                        if(!(
mysql_query($sqlInsert,$linkSincro))){
                            
errorBD($linkSincro);
                            
$error++;
                        }
                    }
                }
            }else{
                
errorBD($link);
                
$error++;
            }
        }else if(
$numResult 0){
            
//actualizar los registro adecuados...


            
if($result mysql_query($sql,$link)){
                
//datos local
                
while($row mysql_fetch_array($result)){
                   
$arrLocalId[] .= $row["id"];
                   
$arrLocalAct[] .= $row["actualizacion"];
                }
                
//datos otro DB
                
while ($row mysql_fetch_array($resultSincro)) {
                   
$arrSincrId[] .= $row["id"];
                   
$arrSincrAct[] .= $row["actualizacion"];
                }
            }else{
                
errorBD($link);
                
$error++;
            }
            
$numSincro count($arrSincrId);
            
$numLocal count($arrLocalId);

            for(
$i=0;$i<$numLocal;$i++){
                
$cn=0;
                
$cl=0;
                for(
$j=0;$j<$numSincro;$j++){
                    if(
$arrLocalId[$i] == $arrSincrId[$j] && $arrLocalAct[$i] > $arrSincrAct[$j]){
                        
$actualizar[] .= $arrLocalId[$i];
                    }else if(
$arrLocalId[$i] != $arrSincrId[$j] && $cn <= $numSincro){
                        if(
$cn == $numSincro){
                            
$nuevo[] .= $arrLocalId[$i];
                        }
                        
$cn++;
                    }else if(
$arrLocalId[$i] != $arrSincrId[$j] && $cl <= $numLocal){
                        if(
$cl == $numLocal){
                            
$borrar[] .= $arrLocalId[$i];
                        }
                        
$cl++;
                    }
                }
            }
            echo 
"act: <br>";
            
print_r($actualizar);
            echo 
"<hr>nuev: <br>";
            
print_r($nuevo);
            echo 
"<hr>borr: <br>";
            
print_r($borrar);
            
        }

        
cerrarBD($link);
        
cerrarBD($linkSincro);

        if(
$error == 0){
            echo 
"<img title='Sincronización correcta' src='css/iconos/ok.png'/>";
        }else{
            echo 
"<img title='num errores: ".$error."' src='css/iconos/error.png'/>";
        }

    }else{
        echo 
"<img title='Imposible conectar' src='css/iconos/error.png'/>";
    }
}else{
    echo 
"<img title='Imposible conectar' src='css/iconos/error.png'/>";
}


?>

Saludos y gracias.
__________________
Picando código...!!!
  #2 (permalink)  
Antiguo 26/04/2011, 07:02
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Comparación entre registros de un BD

yo acabo de hacerlo (con cada tabla)
te doy la logica.
-abro DB1
-hago un select de todos los registros de la tabla DB1.A
-los cargo en un array
-cierro la db1
-abro BD2
-hago un select de todos los registros de la tabla DB2.A
-los cargo en un array
-cierro la db2
-COMPARO LOS 2 ARRAYS Y RECUOPERO LOS QUE NO SE REPITEN
$result = array_diff($arr_BD1,$arr_DB2);
-SINCRONIZO solo aquellos que no se repiten entre las dos bases
$result = array_unique ($result);
foreach ($result as $key => $VALUE) {
//INSERT INTO ...
}
  #3 (permalink)  
Antiguo 26/04/2011, 07:08
Avatar de ESNOLA  
Fecha de Ingreso: octubre-2006
Mensajes: 188
Antigüedad: 17 años, 6 meses
Puntos: 20
Respuesta: Comparación entre registros de un BD

No me he parado a ver tu script, pero te planteo dos cosas.
1-¿que pasa si en las bases de datos existen datos diferentes para un mismo ID o identificador?
2- Para hacer procesos de restauración, aunque sea con michísimos datos tienes esto http://www.mysqldumper.net/
  #4 (permalink)  
Antiguo 26/04/2011, 07:24
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Comparación entre registros de un BD

para eso yo le deje que compare (por algo que no sea el id)
por ejemplo los clasico usuarios, el campo nombre_usuario
seguramente no se va a repetir, (supongo!!!!!!!)
y las bases se van sincronizando, sin importar el id
sino otro campo que por ningun motivo debe repetirse.

y eso si (YO) no puedo leer tanto codigo de otro, siempre sugiero
lo minimo indispensable
  #5 (permalink)  
Antiguo 26/04/2011, 13:35
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
Respuesta: Comparación entre registros de un BD

la tabla que quiero sincronizar a otra BD, es de documentacion por lo que lo unico que no se repite en una misma tabla son los IDs. Por eso comparo entre IDs y en el caso de que sean iguales, comparo por fecha_modificación...

En el codigo que he puesto antes, he hecho un select de todos los registros de la primera tabla y guardados en un array, lo mismo con la misma tabla de la otra BD y con bucles he ido recorriendo dichos arrays e ir comparando ids y fecha_modificacion.... pero será que en mi planteamiento no es correcto, pues no logro conseguirlo...
__________________
Picando código...!!!
  #6 (permalink)  
Antiguo 26/04/2011, 14:46
Avatar de ESNOLA  
Fecha de Ingreso: octubre-2006
Mensajes: 188
Antigüedad: 17 años, 6 meses
Puntos: 20
Respuesta: Comparación entre registros de un BD

Una cosa, has tenido en cuenta que si son muchos los registros puedes sobrepasar el tiempo de ejecución.
Saludos
  #7 (permalink)  
Antiguo 26/04/2011, 16:00
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
Respuesta: Comparación entre registros de un BD

En eso no me habia dado cuenta, aunque como estoy en fase experimental, trabajo de momento con 10 registros nada mas, aunque también pienso en GRANDE....
__________________
Picando código...!!!

Etiquetas: mysql, sincronizar
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 07:58.