ID: 42809 User updated by: apolinux at hotmail dot com Reported By: apolinux at hotmail dot com -Status: Feedback +Status: Open Bug Type: WDDX related Operating System: Windows XP PHP Version: 5.2.4 New Comment:
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. Previous Comments: ------------------------------------------------------------------------ [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