ID:               42809
 Updated by:       [EMAIL PROTECTED]
 Reported By:      apolinux at hotmail dot com
-Status:           Open
+Status:           Feedback
 Bug Type:         WDDX related
 Operating System: Windows XP
 PHP Version:      5.2.4
 New Comment:

We can't really help with this as long as you can't provide a short
script that we can actually run. The one you have posted here is a) too
long b) is not self-contained (it includes several other files..)

So, if you want this bug to get fixed you need to do some hard work and
cut down the code to whatever makes the bug appear. Hint: start by
cutting all irrelevant parts out, like comments, classes,
include/require lines, error checks, etc.


Previous Comments:
------------------------------------------------------------------------

[2007-10-01 16:22:43] apolinux at hotmail dot com

sorry, but I can't cut part of this code, because It doesn't works
properly. May be the problem is when I try to make the call with WDDX
locally, remotely instead.

------------------------------------------------------------------------

[2007-10-01 15:42:12] [EMAIL PROTECTED]

Can you please try and cut it down a few dozen lines? Short script is
around 10-20 lines long..

------------------------------------------------------------------------

[2007-10-01 12:31:12] apolinux at hotmail dot com

<? 
if (file_exists("../config/config.php") ){
        include "../config/config.php";
        }
else {
        include "./config/config.php";
        }
ini_set('include_path',
ini_get('include_path').";".$CONFIG_BASE['ruta_paginas']."/PEAR/");
require_once "PEAR.php";
require_once "DB.php";
require_once "operativolib.php";
require_once "granlavasecolib.php";
require_once "agenciaslib.php";

/*
CREACION DE LA CLASE SINCRONIZACION
contiene los metodos necesarios para comunicarse remotamente cliente a
servidor
usa el protocolo de conexion WDDX

*/


class Sincronizacion extends Operativo {
        var $urlServidor = ''; 
        var $datos;
        var $peticion ;
        var $tabla;
        var $arrObj;
        function __construct($conex=NULL,$idAgenciaDest=NULL,$datos=NULL)
                {
                parent::__construct($conex);
                $agencia = new Agencias($conex);
                if ($this->idAgencia == $idAgenciaDest) {//no me conecto a la 
misma
agencia
                        die('No se puede conectar a la misma agencia.');
                        }
                if (empty($idAgenciaDest) && $datos['equipo'] != 
EQUIPO_SERVIDOR) {
                        $this->lanzarErr('El URL de la Agencia esta vacio.<br 
/>');
                        return false;
                        }
                $this->urlServidor =
$agencia->datos($idAgenciaDest)->URL.'/servidorWDDX.php'; 
                if (!empty($datos)) {
                        $this->asignaDatos($datos);
                        }
                return true;
                }
        function asignaDatos($datos){
                $this->datos = $datos;
                $this->peticion = $this->datos['peticion'];
                $this->tabla = $this->datos['tabla'];
                }
        /* 
        funcion creaPaquete
        Empaqueta los datos en el formato WDDX
        listo para enviar 
        */
        function creaPaquete($datos)
                {
                $packet_id  = wddx_packet_start("Llamada Remota WDDX");
                if (is_array($datos)) { //verVar($datos);
                        foreach($datos as $key => $data){
                                  //create a var whith the name of the content 
of $key
                                  $$key = $data;
                                  wddx_add_vars($packet_id,$key);
                                }
                        }
                else {
                        wddx_add_vars($packet_id, "datos");
                        }
                
                $paquete = wddx_packet_end($packet_id);// verVar($paquete);
                $paquete = urlencode($paquete);
                return $paquete;
                }
        
        function enviaPaquete($paqueteSerializado)
                {
                $ch = curl_init(); 
                curl_setopt ($ch, CURLOPT_URL, "$this->urlServidor"); 
                curl_setopt ($ch, CURLOPT_HEADER, 0);
                curl_setopt ($ch, CURLOPT_POSTFIELDS, $paqueteSerializado);
                curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
                if (! $resul = curl_exec ($ch)){
                        $this->lanzarErr("Error al comunicarse con 
'$this->urlServidor'");
                        return false;
                        }// verlog($resul);
                curl_close ($ch);               
                return $resul;
                }
        
        function analizaPaquete($paquete)
                {
                if (empty($paquete)) {
                        return '';
                        }
                $paquete= urldecode($paquete); //verlog($paquete);
                //preg_match("/(<\/wddxPacket>)/s", $paquete, $m);
                //$paquete=$m[0];
//error_log(print_r($m,TRUE),0);//verVar($m);verVar($paquete);
                $parsed_packet = wddx_deserialize($paquete);//
verlog($parsed_packet);
                return $parsed_packet;
                }
        
        public static function recibePaquete()
                {
                $fp = fopen("php://input", "r");
                $paqueteRecibido = '';
                while(!feof( $fp ))$paqueteRecibido.=fgets( $fp );
                fclose($fp);
                
                return $paqueteRecibido;
                }
        /*
        funcion enviarDatosRemoto
        envia los datos en formato wddx al servidor
        ,recibe una respuesta y la devuelve
        */
        public function enviarDatosRemoto()//$arrVariables)
                {
                //verificar si se envian o se reciben datos
                if (empty($this->datos) ){
                        die('No hay datos para enviar.');
                        }
                if ($this->datos['peticion'] == ENVIAR_DATOS) { //realiza la
consulta
                        $this->error = false;
                        $this->datos['arrObj'] = $this->consultaBD();//
verVar($this->datos['arrObj']);
                        if ($this->error){
                                return false;
                                } //verVar($this->datos['arrObj']);
                        } //verlog($this->datos);       
                //crear paquete
                $paquete = $this->creaPaquete($this->datos); 
                //enviar paquete remotamente
                $respuesta = $this->enviaPaquete($paquete); //echo
"resp=$respuesta,"; print_r($this->analizapaquete($respuesta)); echo ",
error: '$this->error'";echo "<br />";   
                if ($this->error) {             
                        return $this->msg;
                        }
                //analizar paquete
                $paqueteRecibido = $this->analizaPaquete($respuesta);
//print_r($paqueteRecibido);
                if (empty($paqueteRecibido)) {
                        $this->lanzarErr("La respuesta del servidor 
'$this->urlServidor' es
vacia. Por favor verifique su configuracion");
                        return false;
                        }
                if ($paqueteRecibido['error'] == 1){
                        
$this->lanzarErr($paqueteRecibido['respuesta'],$paqueteRecibido['codError']);
                        return false;
                        }
                return $paqueteRecibido['respuesta'];//en crea paquete se define
datos
                }
        public function recibeDatosRemoto()
                {
                $paquete = $this->recibePaquete(); //verlog($paquete);
                $consulta = $this->analizaPaquete($paquete); 
//verLog($consulta);
                if (empty($consulta) ){
                        $arrResp = array('respuesta' => 'consulta 
vacia.','error' => 1);
                        }
                else {
                        $peticion = $consulta['peticion'];
                        $this->tabla = $consulta['tabla'];
                        if ($peticion == SOLICITAR_DATOS) {
                                $datos = $this->consultaBD();
                                }
                        else { //enviar DATOS
                                $datos = $this->insertaBD($consulta['arrObj']);
                                }
                        if (!$datos) {
                                $datos = $this->msg;
                                }
                        $arrResp = array('respuesta' => $datos , 'error' =>
$this->error,'codError' => $this->codError);
                        }
                $respuesta = $this->creaPaquete($arrResp);
//verLog(print_r($arrResp));
                return $respuesta;
                } 
        function consultaBD()
                {//verVar($this) ; exit;
                switch ($this->tabla){
                        case T_ORDENES: 
                        $sql = "SELECT * FROM ordenes";         break;
                        case T_PRENDAS:
                        $sql = "SELECT * FROM prendas";         break;
                        case T_CLIENTES:
                        $sql = "SELECT * FROM clientes";        break;
                        case T_OPERARIOS:
                        $sql = "SELECT * FROM operarios";       break;
                        case T_AGENCIAS:
                        $sql = "SELECT * FROM agencias";        break;
                        }//verlog("$this->tabla,$sql");
                $datos =& $this->conex->getAssoc($sql,false, array(),
DB_FETCHMODE_OBJECT); //verlog(print_r($datos,1));
                if (PEAR::isError($datos)){
                        $this->lanzarErr($datos->getUserInfo());
                        //return $datos->getUserInfo();
                        return false;
                        }
                //verlog($datos);       
                return $datos;
                }
        /*
        funcion
        realiza la consulta de agregacion
        */
        function insertaBD($datos)
                {//verlog($datos);
                if (empty($datos)) {
                        $this->lanzarErr('Los datos para insercion son 
vacios.');
                        return false;
                        }
                switch($this->tabla){
                        case T_ORDENES:         $tabla = 'ordenes';     break;
                        case T_PRENDAS:         $tabla = 'prendas';     break;
                        case T_CLIENTES:        $tabla = 'clientes';    break;
                        case T_OPERARIOS:       $tabla = 'operarios';   break;
                        case T_AGENCIAS:        $tabla = 'agencias';    break;
                        default:                        $this->lanzarErr('La 
tabla no existe');
                                return false;;
                        }
                $contExt = 0;
                $sql = 0;
                foreach ($datos as $reg) { //recorre un array de objetos
                        $cont = 0;
                        $cadValores = '';
                        $cadCampos = '';
                        foreach($reg as $nombre => $valor) { //ciclo a traves 
de la clase
                                if ($cont == 0){
                                        $coma = '';
                                        $cont = 1;
                                        }
                                else {
                                        $coma = ',';
                                        }
                                $cadCampos .= "$coma $nombre";
                                $cadValores .= "$coma '$valor'";
                                }
                        if ($contExt == 0 ){
                                $sql = "INSERT INTO $tabla ($cadCampos)\nVALUES 
($cadValores)\n"; 
                                $contExt = 1;
                                }
                        else $sql .= ",($cadValores)\n";
                        }
                $db = $this->conex;
                $res = $db->query($sql);
                if (PEAR::isError($res)){
                        if ($res->getCode() == -5 ) { //registros duplicados
                                $this->lanzarErr("Existen registros duplicados 
en $tabla.",-5);
//verlog("tabla=$this->msg ");
                                return false;
                                }
                        else {
                                //die($res->getUserInfo());
                                return $res->getUserInfo();
                                }
                        }
                $numModif = $db->affectedRows();
                $this->msg = "Se insertaron $numModif registros en $tabla";
                return $this->msg;
                }
        function sincronizarTodo(){
                $arrTablas1 = array(
                                'ordenes'=>T_ORDENES, 
                                'prendas'       => T_PRENDAS, 
                                'clientes'      => T_CLIENTES,
                                'operarios' => T_OPERARIOS, 
                                'agencias'      => T_AGENCIAS);
                $arrTablas2 = array(
                        'operarios'     => T_OPERARIOS,
                        'agencias' => T_AGENCIAS);
                if (strtolower($this->idAgencia) == EQUIPO_PRINCIPAL){ //esta
agencia=principal, recibe arrtablas1,envia arrtablas2
                        $arrTablasPeticion = $arrTablas1;
                        $arrTablasEnvio = $arrTablas2;
                        }
                else {
                        $arrTablasPeticion = $arrTablas2;
                        $arrTablasEnvio = $arrTablas1;                  
                        }
                foreach($arrTablasPeticion as $nombre => $codTabla) {
                        $datos = array('peticion'=>SOLICITAR_DATOS,'tabla'=> 
$codTabla
,'arrObj'=>'');
                        $this->asignaDatos($datos);
                        $cad .= nl2br("Solicitando la informacion de 
$nombre...\n");
                        $this->error = false;
                        $resul = $this->enviarDatosRemoto(); //echo "aqui: 
$nombre,
$codTabla.<br />"; //verVar($resul);//$datos);
                        if ($this->error  ){
                                $cad .= "<br />$this->msg";
                                break;
                                }
                        $cad .= nl2br("Agregando la informacion de $nombre en 
mi BD...\n");
//verVar($resul); exit;
                        $this->error = false;
                        $resul2 = $this->insertaBD($resul); //verlog($resul); 
                        $cad .= "$this->msg";
                        if ($this->error  and $this->codError != 
ERR_REGISTROS_DUPLICADOS){
                                break;
                                }
                        $cad .= "$resul2<br />";
                        } 
                $cad .= "<br />";
                if (!$this->error or ($this->error and $this->codError ==
ERR_REGISTROS_DUPLICADOS) and 1 ) {
                        foreach($arrTablasEnvio as $nombre => $codTabla) { 
                                $datos = array('peticion' => ENVIAR_DATOS, 
'tabla' => $codTabla);
                                $this->asignaDatos($datos);
                                $cad .=  "Enviar datos de tabla $nombre ...<br 
/>";
                                $this->error = false; //echo "tabla=$codTabla ";
                                $resul = $this->enviarDatosRemoto(); 
                                $cad .= $this->msg; //verVar($this);
                                if ($this->error == TRUE and $this->codError !=
ERR_REGISTROS_DUPLICADOS){
                                        //$cad .= "<br />$this->msg";           
                                
                                        break;
                                        }                                       
                                $cad .= "$resul<br />"; //break; 
                                }
                        }
//                      }
                $this->msg = $cad; //$this->msg."<br />$cad";
                if ($this->error){
                        return false;
                        }
                
                return true;
                }
        }
?>
/* i'm calling first to sincronizarTodo() */

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/42809

-- 
Edit this bug report at http://bugs.php.net/?id=42809&edit=1

Reply via email to