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