Foros del Web » Programando para Internet » PHP »

eval()

Estas en el tema de eval() en el foro de PHP en Foros del Web. Gente : eval() no me anda ni para atras Código PHP: eval ( "return $this->code;" );  Tengo eso dentro una funcion y no me devuelve $this->code como ...
  #1 (permalink)  
Antiguo 05/08/2009, 15:01
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Exclamación eval()

Gente: eval() no me anda ni para atras

Código PHP:
eval ("return $this->code;"); 
Tengo eso dentro una funcion y no me devuelve $this->code como esperaba

y he probado hacer asignaciones y directamente dan error:

Código PHP:
eval ("$out = $this->code;"); 
leyendo los ejemplos del manual pude retornar una variable pero no logro hacerlo con un atributo de clase

Código PHP:
eval("\$return=" $valor ";" );
return 
$return
Si $valor vale 5 anda bien pero si en la linea anterior pongo

Código PHP:
$valor $this->code
me da este error:

Parse error: syntax error, unexpected '<' in .. : eval()'d code on line 1

A ver si me ayudan! [ gracias ]
__________________
Salu2!

Última edición por Italico76; 05/08/2009 a las 15:32
  #2 (permalink)  
Antiguo 05/08/2009, 15:35
Avatar de ACX_POISON  
Fecha de Ingreso: abril-2008
Ubicación: Talca-Chile
Mensajes: 750
Antigüedad: 16 años
Puntos: 7
Respuesta: eval()

lo unico que se me ocurre es
tener una variable $cadena asi
Código PHP:
$valor=$this->code;
$cadena="return($valor) ;";
y luego 
eval($cadena); 
no se si funcionen, pero ya has probado casi todo nooo....
__________________
Me junto con los que Saben, Queriendo Saber.
  #3 (permalink)  
Antiguo 05/08/2009, 15:42
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Exclamación Respuesta: eval()

ACX_POISON: gracias pero me da EXACTAMENTE el mismo error........
__________________
Salu2!
  #4 (permalink)  
Antiguo 05/08/2009, 15:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: eval()

es el mal uso de las comillas... ya que las comillas dobles siempre evalúan el contenido...

Código PHP:
eval('$out = $this->code;');
return 
$out
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 05/08/2009, 15:58
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
me faltaba super escapar una cadena que tenia tags.......ahora no da error......

$t->setProcessing ("\"<a href=\'{$elem[1]}\'>{$elem[0]}</a>\"");

...pero tampoco evalua las variables dentro del metodo

private function procesoItem($elem){
eval("\$return=" . $this->code . ";" );
return $return;

}

public function setProcessing ($code){
$this->code= $code;
}

Código PHP:
<?
// CLASE de TABLAS basada en betadir

$t = new table(3,500);
$t->setCols(4); // encadenar!
$a=5;
$t->setProcessing ("\"<a href='{$elem[1]}'>{$elem[0]}</a>\"");
//$t->setProcessing (5);

//$t->setRows(2);
$t->addItem( array ('Wikipedia','http://www.wikipedia.com') );
$t->addItem( array ('Google','http://www.google.com') );
$t->addItem( array ('BetaDir','http://www.betadir.com') );
$t->addItem( array ('YeapDIR','http://www.yeapdir.com') );
$t->addItem( array ('Foros Del Web','http://forosdelweb.com') );
$t->addItem( array ('Pirulex','http://www.pirulex.com') );

echo 
$t->getTable();


Class 
table {
  
  private 
$width;
  private 
$cols;     
  private 
$rows=NULL
  private 
$code=NULL;
  private 
$tabla// html generado
  
  
private $icon'<img src="http://www.bancocredicoop.coop/modules/personas/images/bullet_on.gif">';
  
  private 
$list=array();
  private 
$item//array bi-
  
private $total=0;  // cant de items  
  
    
  
public function __construct($width){    
    
$this->width$width;
  }    
  
  public function 
setCols ($cols){
    
$this->cols $cols;
    return 
$table;
  }
  
  public function 
setRows ($rows){
    
$this->rows $rows;
    return 
$table;
  }     
  
  public function 
setProcessing ($code){
    
$this->code$code;    
  }
 
  private function 
procesoItem($elem){      
    
//return "<a href='{$elem[1]}'>{$elem[0]}</a>";            
    
eval("\$return=" $this->code ";" );    
    return 
$return;    
  }
 
  public function 
getTable(){  // __tostring 
    
$this->doTable();
    return 
$this->tabla;
  }  
 
  
  public function 
addItem($fila){
    
$this->list[]=$fila;
    
$this->total++;
  }
  
  private function 
assign (){
  
// asigno elementos al listado
    
$i=0;
    for (
$f=0;$f<$this->rows;$f++){    
      for (
$c=0;$c<$this->cols;$c++){    
        
$this->item[$f][$c] = $this->list[$i]; 
        ++
$i;
      }
    }
  }

  private function 
doTable (){  
  
    if (
$this->rows == NULL){
      
$this->rows ceil(count($this->list) / $this->cols); 
    }
    
    
$this->assign();   
    
    
// creo tabla en HTML
    
$tabla="<table width='".$this->width."'  border='0' CellSpacing='5' CellPadding='5'>";  
    for (
$f=0;$f<$this->rows;++$f){    
  
      
$fila "<tr>"
      for (
$c=0;$c<$this->cols;$c++){       
        if (
count($this->item[$f][$c])>0){           
          
$fila $fila"<td align='left'>".$this->icon$this->procesoItem($this->item[$f][$c]) ."</td>";
        }else{
          
$fila $fila"<td align='left' >&nbsp;</td>";  
        }
      }
      
$fila$fila."</tr>";   
      
$tabla $tabla $fila;
    }  
    
$tabla$tabla.'</table>';
    
$this->tabla=$tabla;
  }   
    
# fin de la clase     
?>
PATE ... probé tu modificacion.. pero con como le paso ahora el codigo las comillas son las que salen impresas.

Alguien sabe si puedo evaluar variables que estan "definidas" dentro de una funcion o metodo ?

podrá solucionarse mi problema? no se que mas probar...
__________________
Salu2!

Última edición por GatorV; 05/08/2009 a las 21:43
  #6 (permalink)  
Antiguo 05/08/2009, 19:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: eval()

en el código no debes usar comillas dobles, si en un futuro se van a evaluar las "variables" dentro...
Código PHP:
$t->setProcessing ("\"<a href='{$elem[1]}'>{$elem[0]}</a>\""); 
Código PHP:
function foo($candy$bar)
{
  eval(
'$out = "' $candy '";');
  return 
$out;
}

echo 
foo('<span title=\"{$bar[0]}\">{$bar[1]}</span>', array('tooltip''texto')); 
la clave esta en el uso correcto y creativo de las comillas, no mas...


suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 05/08/2009, 19:23
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: eval()

Cita:
en el código no debes usar comillas dobles, si en un futuro se van a evaluar las "variables" dentro...
PATE... sucede que quiero hacer un enlace y las comillas simples no validan...y trato de hacer las cosas bien.....

Sabras por que no me funciona el programa ? (muchas gracias igual por molestarte en ese codigo)

Tu programita es con funciones pero el mio es una clase.....y alli me salta error.... con los atributos. Otra diferencia [importante] es que en mi caso las variables vienen de DENTRO del modulo y no del programa que lo llama.

Si alguien lo prueba.......y cambia el metodo por este otro....... al menos ve lo que quiero hacer:

Código PHP:
private function procesoItem($elem){      
    return 
"<a href='{$elem[1]}'>{$elem[0]}</a>";                
  } 
Claro! en ese caso... no podria luego decirle que haga un SPAN en vez de un enlace.... por ejemplo... por eso necesito poder usar EVAL()
__________________
Salu2!

Última edición por Italico76; 05/08/2009 a las 19:31
  #8 (permalink)  
Antiguo 05/08/2009, 19:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: eval()

yo no encuentro donde esta la confusión, un método se usa igual que una función...

que las variables están en otro "contexto" es distinto, pero funcionan igual...

Código PHP:
private function procesoItem($elem)
{
  eval(
'$out = "' $this->code '";');
  return 
$out;




y claro, debes escapar las comillas dobles... siempre!!

(en este caso no debes usar comillas dobles para tu argumento... ya que eso provocaría la evaluación indeseada de $elem)
Código PHP:
// BIEN
$t->setProcessing("<a href=\\\"{\$elem[1]}\\\">{\$elem[0]}</a>");

// MEJOR
$t->setProcessing('<a href=\"{$elem[1]}\">{$elem[0]}</a>'); 
eso es porque en la llamada a eval() usamos comillas dobles para rodear la cadena que contiene variables...

como te mencioné al comienzo, estas variables se deben evaluar dentro de las comillas en la expresión-a-evaluar dentro de la función eval()

¿confundido??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 05/08/2009 a las 19:44
  #9 (permalink)  
Antiguo 05/08/2009, 20:01
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: eval()

// MEJOR
$t->setProcessing('<a href=\"{$elem[1]}\">{$elem[0]}</a>');

Si hago eso...... revienta de nuevo..... pero gracias igual

Parse error: syntax error, unexpected '<' in C:\xampp\htdocs\full\clases\table.class.php(57) : eval()'d code on line 1
__________________
Salu2!
  #10 (permalink)  
Antiguo 05/08/2009, 20:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: eval()

Cita:
Iniciado por Italico76 Ver Mensaje
// MEJOR
$t->setProcessing('<a href=\"{$elem[1]}\">{$elem[0]}</a>');

Si hago eso...... revienta de nuevo..... pero gracias igual

Parse error: syntax error, unexpected '<' in C:\xampp\htdocs\full\clases\table.class.php(57) : eval()'d code on line 1
eso es porque sigues usando tu método viejo... ¿o como es tu método actual??

en el cual colocas la variable directamente, si pones atención ... yo estoy usando comillas rodeando la expresión de $this->code para evitar este problema...

Cita:
Iniciado por pateketrueke Ver Mensaje
[...]
Código PHP:
private function procesoItem($elem)
{
  eval(
'$out = "' $this->code '";');
  return 
$out;

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 05/08/2009, 20:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: eval()

EXCELENTE!!!! ahora caí..... en cuenta de lo que me decias.... y si.. funcionó (!)

te mereces karma infinito.....
__________________
Salu2!
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 10:54.