coldfusion evaluate

coldfusion - ¿Cómo puedo dejar de usar la función de evaluación()?



evaluate (4)

Tengo una tabla con valores debajo de una columna llamada: str_condition

los valores en esta columna pueden ser: variables.bit_male / application.bit_male / isdefined(''session.int_user_id'')

El valor puede ser complejo como puede ser.

Necesito usar el valor de los valores en la columna.

Actualmente, lo que estoy haciendo es

<cfif evaluate(query.str_condition) eq true> .....code.... </cfif>

Ahora, necesito omitir el evaluar.


¿Cuántas combinaciones únicas existen en la base de datos? ¿Y aparecen nuevos valores sin interacción del desarrollador?

Si se trata de un número razonable de valores posibles que no cambian, utilice una instrucción switch y escriba la línea de código que maneja cada posible valor.

<cfswitch expression="#query.str_condition#"> <cfcase value="variables.bit_male"> <cfset passed = variables.bit_male> </cfcase> <cfcase value="application.bit_male"> <cfset passed = application.bit_male> </cfcase> <cfcase value="isdefined(''session.int_user_id'')"> <cfset passed = isdefined(''session.int_user_id'')> </cfcase> <cfdefaultcase> <cfset passed = false> </cfdefaultcase> </cfswitch> <cfif passed> .....code.... </cfif>

No tiene que escribirlos a mano, puede usar una consulta sql para generar la parte repetitiva del código de ColdFusion.

SELECT DISTINCT ''<cfcase value="'' + replace(table.str_condition,''"'',''""'') + ''"><cfset passed = '' + table.str_condition + ''></cfcase>'' as cfml FROM table ORDER BY len(str_condition), str_condition


Si estoy leyendo esto correctamente, no solo está almacenando nombres de variables en la base de datos, sino fragmentos de código reales como [isDefined (session.it_user_id)].

Si esto es lo que estás haciendo, entonces necesitas parar y repensar lo que estás tratando de lograr. Almacenar código en su base de datos y usar evaluar para ejecutarlo es una idea increíblemente mala.

Me parece que está intentando crear un bloque de código genérico que puede copiar pegar en varios lugares y simplemente establecer su lógica condicional en el archivo db.

La respuesta corta no es encontrar la forma de evitar el uso de la evaluación, sino detener el almacenamiento del código en la base de datos.


TBH, me quedaría con evaluate() para esto: estás aprovechando una de las pocas situaciones que tiene sentido. Si lo que tienes en el campo DB es solo una expresión (sin etiquetas), entonces evaluate() funcionará bien.

Como otros han sugerido ... almacenar expresiones en el DB no es ideal, pero puedo ver cómo a veces podría ser el mejor enfoque. Sin embargo , reconsidéralo, en caso de que puedas llegar a un enfoque completamente diferente (esta es la situación). -específico, por lo que realmente no podemos darle orientación sobre eso).

La única otra opción real para usted sería escribir el código de la base de datos en un archivo y luego include , pero esa sería una solución peor que usar simplemente evaluate() , creo.

Mucha gente se obsesiona con el dogma que evaluate() es malo, sin realmente detenerse a pensar por qué ese es el caso ... es innecesario para la mayoría de las situaciones en que la gente lo usa, pero está completamente bien en situaciones en las que es necesario (como el tuyo).


Esta es una respuesta editada, ya que originalmente leí mal la pregunta.

En muchos casos, la notación de matriz es su amigo

<cfif queryname[''fieldname''][rownumber] is true> code for true

Tenga en cuenta que el nombre de la consulta no está entre comillas, pero el nombre del campo es. Si no cita el nombre de campo, ColdFusion asumirá que es una variable.

También es pertinente que si está almacenando elementos en una base de datos, como un código, que desea seleccionar y luego ejecutar, debe seleccionarlos, escribirlos en otro archivo .cfm y luego incluir ese archivo. Eso es algo ineficiente.

En su caso, está almacenando nombres de variables en su base de datos. Si usar evaluar te está dando los resultados correctos, cualquier cosa que cambies probablemente sea un cambio para peor.