Foros del Web » Programando para Internet » PHP »

Error en un "eval()"

Estas en el tema de Error en un "eval()" en el foro de PHP en Foros del Web. Hola a todos, Estoy intentando evaluar un código php como cadena de texto con la función eval() pero ésta me da un error: Cita: Parse ...
  #1 (permalink)  
Antiguo 17/01/2007, 15:35
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Error en un "eval()"

Hola a todos,

Estoy intentando evaluar un código php como cadena de texto con la función eval() pero ésta me da un error:

Cita:
Parse error: syntax error, unexpected $end in /mounted-storage/home37a/sub002/sc30230-UGAH/top100anuncios/cpanel/noticias.php(312) : eval()'d code on line 77
Lo que me supongo que significa que hay algunas comillas sin cerrar. Ahora bien, he hecho un echo de la cadena a evaluar y me devuelve esto:

Código PHP:
"\$custom_pattern = \"Bienvenida Clientes\";\$loaded = \"\";\$send_email = \"0\";\$pattern_name = \"Bienvenida Clientes\";\$delete_pattern = \"\";\$replace_pattern = \"1\";\$default_welcome = \"\";\$default_welcome_name = \"\";\$post_logged_client = \"\";\$pattern_title = \"Bienvenida Clientes\";\$destination = \"clients\";\$addressee = \"1\";\$affected1 = \"19\";\$auto = \"\";\$privacy = \"0\";\$affected2 = \"13\";\$affected_perc = \"68.42 %\";\$emails = \"varios emails separados por comas...\";\$subject1 = \"\";\$subject2 = \"\";\$body = \"código html sin ningun tipo de comillas\";\$signature_cb = \"on\";\$signature_img = \"on\";\$signature = \"código html sin ningun tipo de comillas\";\$fpatterns = \"pattern0\";" 
Pero por lo que se puede "ver" la cadena empieza con " y acaba con " tambien por lo tanto no se de que se esta quejando...

Para más información, el código a evaluar lo estoy guardando en una base de datos MySql y lo genero con php de esta manera:

Código PHP:
foreach($_POST as $key => $value){
    
$custom .= "\\\\$".$key.' = \\\\"'.$value.'\\\\"; ';

Y finalmente lo extraigo de la base de datos así:

Código PHP:
$evaled '"'.trim($sel_patterns_fa['Custom']).'"'//envuelvo la cadena de código a evaluar entre comillas dobles (")
echo "<textarea>".$evaled."</textarea>"//<-- este es el echo que puse arriba (sin el textarea claro)
eval($evaled); 
He estado probando otras mil combinaciones de comillas y barras invertidas y ninguna me ha dado un buen resultado

Si alguien sabe decirme el porque le estaré muy agradecido =)

ArgoN
  #2 (permalink)  
Antiguo 17/01/2007, 17:27
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

A ver, prueba asi:

Código PHP:
<?php
$custom 
"";
foreach(
$_POST as $key => $value)
{
    
$custom .= "\$" $key " = \""$value "\";";
}
?>
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #3 (permalink)  
Antiguo 17/01/2007, 17:55
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

Me parece que me confundi y te mostre algo que no querias. El codigo de mas arriba evalua el codigo php.

Si lo que queres es mostrar el codigo php como una cadena, no te hace falta usar eval me parece:

Código PHP:
<?php
$_POST
["nombre"] = "Prueba";
$custom "";
foreach(
$_POST as $key => $value){
    
$custom .= "\$$key = \"$value\";";
}  
echo 
$custom;
// Imprime $nombre = "Prueba";
?>
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #4 (permalink)  
Antiguo 17/01/2007, 19:22
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Gracias por responder Federico,

En realidad si que quiero que me evalue el código que almaceno en la base de datos. Es una forma que estoy probando de usar para no tener que crear muchos campos en la DB mysql. Creo una cadena con todas las variables y sus valores, y cuando quiero que tomen valor, ejecuto esa cadena como un codigo con la funciona eval().

He probado lo que me sugierias en el primer post pero da otro error:

Cita:
Parse error: syntax error, unexpected T_STRING in /mounted-storage/home37a/sub002/sc30230-UGAH/top100anuncios/cpanel/noticias.php(313) : eval()'d code on line 1
Y la cadena correspondiente al código a evaluar que me devuelve es la siguiente:

Código PHP:
"$custom_pattern = "Bienvenida Clientes";$loaded = "";$send_email = "0";$pattern_name = "Bienvenida Clientes";" 
Pero segun el manual de www.php.net de la funcion eval() las expresiones para evaluar tienen que ser equivalentes a un código normal en php pero para que no considere el símbolo $ como caracter hay qe ponerle \$, y de igual modo pasa con las comillas que delimitan el contenido de la variable:

Código PHP:
eval("\$body = \"$body\";"); //este codigo si que funciona 
En cambio el que estoy usando yo es muy parecido:

Código PHP:
"\$custom_pattern = \"Bienvenida Clientes\";\$loaded = \"\";\$send_email = \"0\";\$pattern_name = \"Bienvenida Clientes\";" 
Pero me da un error al evaluarlo y no se porque Quizas es porque no separo las linias y las pongo todas juntas pero no creo...

Gracias.

ArgoN
  #5 (permalink)  
Antiguo 17/01/2007, 19:28
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Acabo de fijarme que el último código que puse:

Código PHP:
eval("\$custom_pattern = \"Bienvenida Clientes\";\$loaded = \"\";\$send_email = \"0\";\$pattern_name = \"Bienvenida Clientes\";"); 
no da error, y debe ser seguramente porque lo acorté para que no saliera tan largo en el mensaje... Voy a ver cual de las variables del eval esta fallando... Cuando me funcione aviso

ArgoN
  #6 (permalink)  
Antiguo 17/01/2007, 19:48
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

El problema son las comillas que le metes antes del eval ($evaled = '"'....). Prueba este codigo solo, sin lo tuyo:

Código PHP:
<?php
$_POST
["prueba"] = "ejemplo";
$_POST["prueba2"] = "ejemplo2";
$custom "";
foreach(
$_POST as $key => $value)
{
    
$custom .= "\$" $key " = \""$value "\";";
}
eval(
$custom);
echo 
"prueba vale " $prueba " y prueba 2 vale " $prueba2;
?>
Imprime:

prueba vale ejemplo y prueba 2 vale ejemplo2

Y eso quiere decir que evaluo bien el codigo php.

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #7 (permalink)  
Antiguo 17/01/2007, 20:01
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Claro, eso funciona perfecto, pero mi duda es:

Si yo quiero guardar un código php en mi base de datos, pongamos un ejemplo sencillo:

$var = "hola";

como tengo que guardarlo, asi:

\$var = \"hola\";

o asi?

$var = "hola";

Creo que el problema está en el paso de mysql al php, algo pasa con las barras invertidas. Voy a probar con ejemplos sencillos.

Gracias por responder.

ArgoN
  #8 (permalink)  
Antiguo 17/01/2007, 20:48
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Al fin.

Creo que era la última posibilidad que me faltaba por probar:

Paso 1: (Recoger los valores POST y almacenarlos en la variable $custom formateados para evaluar luego)
Código PHP:
<?
$custom 
"";
foreach(
$_POST as $key => $value){
    
$custom .= '$'.$key.' = "'.$value.'";';
}
?>
Paso 2: (Guardar $custom a la base de datos)

Paso 3: (Evaluar $custom)
Código PHP:
$evaled trim($sel_patterns_fa['Custom']); //<-- valor recogido con una query de mysql
eval($evaled); 
También tenía otro error y era que en la cadena $custom había incluido unas comillas que hacian que funcionara mal el eval.

Moraleja: "Cuando algo se pone muy feo y la cosa se va complicando cada vez más, lo mejor es hacer lo más simple posible. Eso funcionará."

Adios

ArgoN

Última edición por -=ArgoN=-; 17/01/2007 a las 21:17
  #9 (permalink)  
Antiguo 17/01/2007, 21:14
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

Para usar con eval() y "ejecutar" la cadena como codigo php, ya sabes como es. El ejemplo que te di funcionó.

Para insertar en la bd, no hace falta eval. Debes formar la cadena como te mostre mas arriba, pero escapando(con \) los caracteres que pueden ocasionar problemas en la consulta.... por ejemplo las comillas dobles/simples, deben ser escapadas.

__________________
Federico.

Mi página: www.jourmoly.com.ar
  #10 (permalink)  
Antiguo 17/01/2007, 21:18
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Ya lo solucioné. La clave creo que fueron las comillas simples que hacen que los caracteres problemáticos los tome como caracteres normales.

Muchas gracias.

ArgoN
  #11 (permalink)  
Antiguo 17/01/2007, 21:23
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

Me alegro

Por cierto, si utilizas el codigo con eval(), mucho cuidadin a quien le das para que use el script:

Código PHP:
<?php
$_POST
["prueba"] = "ejemplo\";echo \"<strong>Esto lo agregue de listo que soy</strong>";
$_POST["prueba2"] = "ejemplo2";
$custom "";
foreach(
$_POST as $key => $value)
{
    
$custom .= "\$" $key " = \""$value "\";";
}
eval(
$custom);
echo 
"prueba vale " $prueba " y prueba 2 vale " $prueba2;
?>
Imprime: Esto lo agregue de listo que soyprueba vale ejemplo y prueba 2 vale ejemplo2
Fijate que simple seria para alguien inyectar codigo php.

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #12 (permalink)  
Antiguo 17/01/2007, 21:29
Avatar de -=ArgoN=-  
Fecha de Ingreso: octubre-2005
Ubicación: Barcelona, España
Mensajes: 843
Antigüedad: 18 años, 6 meses
Puntos: 1
Re: Error en un "eval()"

Jajajajaja que listo =)

Tranquilo, el eval lo uso para scripts que estan en el panel de control de mi web, con uso restringido =D

Saludos listín :P

ArgoN
  #13 (permalink)  
Antiguo 17/01/2007, 21:34
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Error en un "eval()"

Cita:
Iniciado por -=ArgoN=- Ver Mensaje
Tranquilo, el eval lo uso para scripts que estan en el panel de control de mi web, con uso restringido =D
Me alegro :P


__________________
Federico.

Mi página: www.jourmoly.com.ar
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 02:58.