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