Foros del Web » Programando para Internet » PHP »

No Funciona el Eval????

Estas en el tema de No Funciona el Eval???? en el foro de PHP en Foros del Web. Hola, quizas el titulo no sea exacto, pero mi problema pense que se solucionaba con eval, pero no por que me sale error. necesito hacer ...
  #1 (permalink)  
Antiguo 23/12/2008, 09:35
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
No Funciona el Eval????

Hola,

quizas el titulo no sea exacto, pero mi problema pense que se solucionaba con eval, pero no por que me sale error.

necesito hacer algo asi:

Código PHP:
<?php
$ext
="pdf";
$validos="$ext=='jpg' or $ext=='gif' or $ext=='png'";
if(
$validos){
    echo 
"imagen";
}else{
    echo 
"pdf";
}
?>
es decir, guardar en una variable una condicion y luego evaluarla, pero con eval:
Código PHP:
if(eval($validos)){ 
me sale error, asi que deseo saber como puedo hacer lo siguiente.

Nota: asi como esta (sin el eval), si sale, pero incorrecto, por que deberia de pintar pdf y me pinta imagen????

bueno espero haberme explicado y me puedan ayudar.

Gracias.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #2 (permalink)  
Antiguo 23/12/2008, 11: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: No Funciona el Eval????

pon mas atención, recuerda que si.... se evalúa, pero debes tener cuidado con la sintaxis también...
(osea, las comillas que rodean al string que se devuelve de $ext no existen, ¿entiendes eso?)

Código PHP:
if (eval(" '$ext' == 'bar' or '$ext' == 'buz' ")) 
demás, para que usar eval() si con regex se logra lo mismo, y mejor!

Código PHP:
if (preg_match('/\.(jpe?g|gif|png)$/i'$ext)) 

--

Cita:
Iniciado por masterojitos Ver Mensaje
[...]

asi como esta (sin el eval), si sale, pero incorrecto, por que deberia de pintar pdf y me pinta imagen????

[..]
esto ultimo es obvio, ya que tu string (sin evaluar) es no empty o sea, no esta vacía... por lo tanto es un true y sin mas, por eso entras a la primer condición .... suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 23/12/2008, 11:09
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: No Funciona el Eval????

ah!!!!

la primera solucion, no le veo la diferencia, solo le añadiste comillas simples ('$foo'), o es que eso necesito el eval???

y ps la segunda se ve bien (pero por que mejor??), aver te comento y gracias men!!!
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #4 (permalink)  
Antiguo 23/12/2008, 11:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: No Funciona el Eval????

la primer razón tiene sentido en esto....

la comparación ya evaluada resultaría así...

Código PHP:
if (pdf == 'png' or pdf == 'gif'
bueno, en resumen... si notas el error de sintaxis???

vaya, pdf no es una constante o si lo es???

yo mas bien creo que es una simple string, cierto???


--
con respecto al regex, hay veces que es mas poderoso de lo que crees ... digo, y repito... para que evaluar, si con una simple expresión regular haces lo mismo... ¿eh??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 23/12/2008, 11:31
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: No Funciona el Eval????

plis cuando me respondas, has un nuevo post que no se si has actualizado.
ok gracias por la aclaracion y si la entiendo pero???

de la primera forma (con el eval), sale el mismo error:
Código PHP:
<?php
$ext
="pdf";
$validos="'$ext'=='jpg' or '$ext'=='gif' or '$ext'=='png'";
if(eval(
$validos)){
    echo 
"imagen";
}else{
    echo 
"pdf";
}
//sale esto:
//Parse error: syntax error, unexpected $end in /data/15/1/43/4/1369493/user/1468908/htdocs/artwork/vtronix2/admin/aa.php(6) : eval()'d code on line 1
?>
y con la segunda, no me reconoce y siempro devuelve false (entra al else).
Código PHP:
<?php
$ext
="gif";
if (
preg_match('/\.(jpg|gif|png)$/i'$ext)) {
//ya lo puse asi: if (preg_match('/\.(jpe?g|gif|png)$/i', $ext))  pero tampoco
    
echo "imagen";
}else{
    echo 
"pdf";
}
?>
gracias por todo pateketrueke.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #6 (permalink)  
Antiguo 23/12/2008, 11:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: No Funciona el Eval????

la primera, debes leer el manual de PHP .... ahí se especifica que debe escribirse idéntico, que sin eval() ...

Código PHP:
if (eval(" return ( '$ext' == 'gif' or '$ext' == 'png'? true: null); ")) 
por favor, lee el manual... http://php.net/eval

Cita:
Iniciado por http://php.net/eval
Existen algunos factores a tener en cuenta cuando se usa eval(). Recuerde que la cadena pasada debe ser código PHP válido, incluyendo cosas como la terminación de sentencias con un punto-y-coma de modo que el intérprete no falle en la línea siguiente al llamado a eval(), y escapar apropiadamente las cosas en cadena_codigo . Para mezclar salida HTML y código PHP, es posible usar una etiqueta de cierre PHP para abandonar el modo PHP.

la otra, bueno... espero leas esto: http://www.forosdelweb.com/f18/aport...s-pcre-646110/

ya que, en mi ejemplo... estoy especificando que se empieza con un punto \. y bueno, tan solo quitalo y prueba....

Código PHP:
if (preg_match('/^(jpe?g|png|gif)$/i'$ext)) 
en este caso, ya que tan solo comparas la extensión debe ser exacta... por eso el ^$
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 23/12/2008, 11:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

Mmm y digo porque no usas un arreglo? Asi es mas sencillo agregar/quitar extensiones validas, y luego usas in_array() para verificar?.

Saludos.
  #8 (permalink)  
Antiguo 23/12/2008, 11:58
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: No Funciona el Eval????

Usar cualquiera de ambos métodos no es eficientes, hay otras mejores maneras, por ejemplo la siguiente es de las mejores:

Código PHP:
$extensiones = array(
'jpg'=>'jpg',
'gif'=>'gif',
'doc'=>'doc',
'pdf'=>'pdf'
);
$extension 'pdf';
echo isset( 
$extensiones[$extension] ) ? 'Extensión válida' 'Solo puedes subir archivos con extensión 'join(', ',$extensiones); 

PD: Hay que usar solo regex cuando son necesarias, no en otro momento ya que no son livianas.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #9 (permalink)  
Antiguo 23/12/2008, 11:59
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: No Funciona el Eval????

Cita:
Iniciado por GatorV Ver Mensaje
Mmm y digo porque no usas un arreglo? Asi es mas sencillo agregar/quitar extensiones validas, y luego usas in_array() para verificar?.

Saludos.
me colgue escribiendo, eso mismo es mi anterior post, pero usando un simple isset.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #10 (permalink)  
Antiguo 23/12/2008, 12:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

De hecho hablando de optimización es más rapido in_array() usando un arreglo plano, ya que si te fijas en el ejemplo que pusiste tienes que usar un array doble para poder leer las llaves.

Saludos.
  #11 (permalink)  
Antiguo 23/12/2008, 13:00
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: No Funciona el Eval????

Puede usar más memoría, que por ser unas pocas posiciones no se justifica. Isset es mucho más veloz

Tiempos de isset sobre una iteración de 10000:

Código:
0,0045
0,0046
0,0045
0,0045
0,0048

Mismo código pero usando in_array con el array con solo claves.
Código:
0,0110
0,0118
0,0113
0,0112
0,0111
Más del doble, si bein es mínimo vale decír que es mejor isset ;)

Saludos
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #12 (permalink)  
Antiguo 23/12/2008, 13:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

Si es más rapido pero por optimización (no rapidez) creo es más limpio, inclusive en el mantenimiento, igual una combinación de lo que propones y intercambiando las posiciones usando array_flip.

Saludos.
  #13 (permalink)  
Antiguo 23/12/2008, 13:21
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: No Funciona el Eval????

Realmente no comprendo tu punto, si es por el array asociativo podés bajarle el peso así:

Código PHP:
$extensiones = array(
'jpg'=>'',
'gif'=>'',
'doc'=>'',
'pdf'=>''
); 
Seguramente tengamos una definicion antónima de "optimización".

Cada uno sabrá que le sienta mejor y es libre de usar cualquiera de ambas maneras ;).

Yapa: http://brian.moonspot.net/2008/06/05...is-quite-slow/ y http://www.straylightrun.net/2008/12...ein_arraycode/ (donde mensionan a array_flip como bien decís)
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #14 (permalink)  
Antiguo 23/12/2008, 13:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

Recuerda que muchas veces como programadores, tenemos que pensar que somos como escritores, hay que escribir lo mas limpio y ordenado posible, si empezamos a hacer trucos asi que si, son más rapidos pero que hacemos el código menos mantenible por un 3ro, entonces caemos en un problema.

Por ejemplo un programador usa:
Código php:
Ver original
  1. if($condicion)haz_funcion();else{una_funcion();otra_funcion();}

Si bien el código sirve y funciona a la larga el mantenimiento se hace dificil ya que el flujo del programa es dificil verlo directamente.

Por eso el usar el array_flip y solo dejar el array plano, asi puedes ver directo el array y saber sin ver mucho del código que es un array para extensiones permitidas.

Saludos.
  #15 (permalink)  
Antiguo 23/12/2008, 14:59
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: No Funciona el Eval????

Hola,

Y así ?

Código PHP:
<?php
$ext 
'JPG';
echo 
stristr('.jpg.gif.png'".$ext") ? 'imagen' 'pdf';
?>
Saludos,
  #16 (permalink)  
Antiguo 23/12/2008, 15:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

stristr, es más lento a hacer la búsqueda en el arreglo directamente. De hecho el mismo manual lo sugiere:
Cita:
Iniciado por Manual de PHP
Note: If you only want to determine if a particular needle occurs within haystack , use the faster and less memory intensive function strpos() instead.
Saludos.
  #17 (permalink)  
Antiguo 23/12/2008, 16:35
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: No Funciona el Eval????

Bueno, no recuerda la palabra exacta que antes me la decian que hacian, pero el tema que creo que se van del tema no (y ustedes?? GatorV y Nicolpasar!!) ya que yo queria que saliera, no hable de perfomancia???? pero vale igual gracias.

ah cierto, pateketrueke gracias, ambas ahora si me funcionaron.
y ps lo de arrays, no es mas largo... claro, quizas mas corto, pero si solo hablo de poco datos, no se nota la diferencia.

Gracias a todos y que Dios los Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #18 (permalink)  
Antiguo 23/12/2008, 17:24
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: No Funciona el Eval????

wao otro problema.....

si declaro la cadena antes que la extension no la reconoce?? es decir:

Código PHP:
<?php
$validos
=" return ('$ext'=='jpg' or  '$ext' == 'gif' or '$ext' == 'png'? true: null); ";
$ext="jpg";
if(eval(
$validos)){
    echo 
"imagen";
}else{
    echo 
"pdf";
}
?>
ayi no sale e ingresa a que es pdf????

no hay forma de poder declararlo despues y no antes de la $validos.

gracias.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #19 (permalink)  
Antiguo 23/12/2008, 18:09
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: No Funciona el Eval????

Hola,

Cita:
Iniciado por GatorV Ver Mensaje
stristr, es más lento a hacer la búsqueda en el arreglo directamente. De hecho el mismo manual lo sugiere:
Saludos.
Realmente no me refería a ningún tipo de optimización, solamente que el código era simple y claro, pero ahora que lo mencionas ... en mi código no hay ningún arreglo, es un simple String. Y nop, el 'overhead' del manejar un arreglo va a ser mucho más complejo que el manejo de dos Strings.

De cualquier forma ... la comparación char a char ... tiene que existir obligatoriamente. Y en mi caso no salta de lugar en lugar ... lo realizar directamente en un lugar secuencial en la memoria.

Puedes revisar el código fuente de PHP para ver la cantidad de instrucciones que requiere una comparación de 2 Strings, incluyendo que las convierte a 'lower case' antes de la comparación.

Cita:
Iniciado por masterojitos Ver Mensaje
si declaro la cadena antes que la extension no la reconoce?? es decir:

Código PHP:
<?php
$validos
=" return ('$ext'=='jpg' or  '$ext' == 'gif' or '$ext' == 'png'? true: null); ";
$ext="jpg";
if(eval(
$validos)){
    echo 
"imagen";
}else{
    echo 
"pdf";
}
?>
En ese caso la expansión de variables se lleva a cabo en la asignación de $validos, tienes que crear el String $validos, de manera que se evalúe después de la asignación.

Código:
$validos=' return $ext == "jpg" or $ext == "gif" or $ext == "png" ; ';
Saludos,
  #20 (permalink)  
Antiguo 23/12/2008, 19:46
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: No Funciona el Eval????

Cita:
Bueno, no recuerda la palabra exacta que antes me la decian que hacian, pero el tema que creo que se van del tema no (y ustedes?? GatorV y Nicolpasar!!) ya que yo queria que saliera, no hable de perfomancia???? pero vale igual gracias.
Y uno le pone toda la onda para esto?...
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #21 (permalink)  
Antiguo 23/12/2008, 22:57
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: No Funciona el Eval????

jajajaja......

gracias gracias.

Dios los Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #22 (permalink)  
Antiguo 26/12/2008, 12:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: No Funciona el Eval????

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,
Realmente no me refería a ningún tipo de optimización, solamente que el código era simple y claro, pero ahora que lo mencionas ... en mi código no hay ningún arreglo, es un simple String. Y nop, el 'overhead' del manejar un arreglo va a ser mucho más complejo que el manejo de dos Strings.

De cualquier forma ... la comparación char a char ... tiene que existir obligatoriamente. Y en mi caso no salta de lugar en lugar ... lo realizar directamente en un lugar secuencial en la memoria.

Puedes revisar el código fuente de PHP para ver la cantidad de instrucciones que requiere una comparación de 2 Strings, incluyendo que las convierte a 'lower case' antes de la comparación.
Claro hablando de simpleza es más simple al verlo, pero yo creo que si el Manual mismo nos esta recomendando hacerlo de otra forma, en ese caso es mejor hacerle caso a los programadores del core de PHP, en cuyo caso usando la forma que tu expones quedaría así:
Código php:
Ver original
  1. <?php
  2. $ext = 'JPG';
  3. echo ( stripos('.jpg.gif.png', ".$ext") !== false ) ? 'imagen' : 'pdf';

Saludos
  #23 (permalink)  
Antiguo 26/12/2008, 13:16
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: No Funciona el Eval????

Hola,

Allí fue donde me equivoqué:

Cita:
Iniciado por GatorV Ver Mensaje
stristr, es más lento a hacer la búsqueda en el arreglo directamente. De hecho el mismo manual lo sugiere:
Creí que te referías a realizar la búsqueda en un arreglo, es decir, aplicar la función stripos a cada valor de un arreglo o algo parecido; lo cual ahora me parece evidente que no te referías a eso.

Cita:
Iniciado por GatorV Ver Mensaje
... pero yo creo que si el Manual mismo nos esta recomendando hacerlo de otra forma, en ese caso es mejor hacerle caso a los programadores del core de PHP ...
La diferencia principal es que no guarda un buffer extra donde almacena la cadena encontrada, solamente la posición. Por lo tanto si va a ser más rápido de la manera que dice en el manual y que correctamente propusiste.

Saludos,
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 18:02.