【问题标题】:use variable in fieldname in a cfloop [duplicate]在cfloop中的字段名中使用变量[重复]
【发布时间】:2016-07-24 05:02:47
【问题描述】:

我在名为 p1、p2、p3 等的数据库中有几个字段,它们由名为 GetUser 的查询返回。我想检查它们的值,但下面的代码错误出现在我身上。我确定我的格式“GetUser.p#x#”是错误的,但我不知道该怎么做。任何帮助将不胜感激。

我有以下代码,它可以工作...

    <cfquery name="GetUser"> 
        SELECT id, p00, p01, p02, p03, p04, p05, p06
        FROM users 
        where id = #session.user_id#
    </cfquery>

    <cfoutput query="GetUser">
        <cfif p01 is 1><li>Post 01</li></cfif>
        <cfif p02 is 1><li>Post 02</li></cfif>
        <cfif p03 is 1><li>Post 03</li></cfif>
        <cfif p04 is 1><li>Post 04</li></cfif>
        <cfif p05 is 1><li>Post 05</li></cfif>
        <cfif p06 is 1><li>Post 06</li></cfif>
    </cfoutput>

当然,这是一种糟糕的做法,所以我想做一个如下的循环来达到相同的结果:

    <cfloop index = "x" from = "1" to = "6"> 
        <cfif GetUser.p0#x# is 1><li>Post #x#</li></cfif>
    </cfloop>

Bt 这个错误了。所以我希望了解如何实现这一目标。

// 有一个类似的问题建议queryName["columnName"][rowNumber] 是必填项。这是不同的,而且更简单。

【问题讨论】:

  • getUser['p0' +x]是查询中动态变量的语法。
  • 应该说“来自您的查询”
  • 关闭,但不完全。
  • Post 0#x#
  • 导致错误:无法将 [p0] 字符串转换为数值。
  • sorrysorry,最近java太多了。应该是 & 而不是 +
  • 标签: coldfusion cfml railo lucee


    【解决方案1】:

    好的,知道了……答案是:

     <cfloop index = "x" from = "1" to = "10">
       <cfif getUser['p0' & x] is 1><li> 0#x#</li> </cfif>
     </cfloop>
    

    Matt Busche 几乎做到了。 getUser['p0' +x] 需要 o 是 getUser['p0' & x]

    谢谢!

    【讨论】:

    • 这是完整的工作代码吗?通常动态查询列引用也需要行号,即queryName["columnName"][rowNumber]。参见示例:trycf.com/gist/b304d69d93f16b4822a3455118fbc266/…
    • 是的,它是完整的工作代码,与标记为重复的不同。
    • 两个线程都询问如何动态访问查询列。答案是一样的:使用关联数组表示法。当然,Lucee/Railo 可能允许您省略查询行号。 ACF 没有。上面的 sn -p 不能编译。它缺少缺少的结束 CFIF 标记。
    • 这可能是正确的。我正在使用 Lucee 5。但是对于它的价值,我不清楚另一个线程。在发布这个问题之前,我查看了它。顺便说一句:修复了
    • 感谢您更新答案。顺便说一句,如果列值始终为 1 或 0,您还可以使用快捷方式 &lt;cfif getUser['p0' &amp; x]&gt;。 CF 会将数值隐式转换为布尔值。值 0 等于 false。任何其他数字(1、-1 等)的计算结果为 true。另外,不要忘记在所有变量查询参数上使用cfqueryparam。它提高了性能并有助于保护查询免受 sql 注入。
    【解决方案2】:

    为清楚起见进行了编辑:

    <cfquery name="getuser"  datasource="STACK">
        Select * from stackoverflow
    </cfquery>
    
    <cfset fieldNumber = #ListLen(getuser.ColumnList)#>
    <cfoutput>
    <cfloop index="i" from="1" to="#fieldNumber#"> 
    This is P#i#
    </cfloop>
    </cfoutput>
    

    从您的评论看来,您希望根据您返回的列进行条件检查。假设您的列命名一致,则返回的列应始终与循环的迭代匹配。您应该只需要循环尽可能多的字段,这样它就可以始终做到这一点,而无需硬编码 10 或其他任何内容。

    因此,您可以使用#i#,而不是检查值是p1还是p2,例如:

    &lt;cfif i is 1&gt; P1 is here. &lt;/cfif&gt;

    【讨论】:

    • 我想我需要更清楚。我的表中有以下字段名称:p0、p1、p2、p3 等。我正在执行此循环以检查查询中这些字段中的值。所以 p#x# 应该检查 getuser.p1,然后是 getuser.p2,依此类推。 p 不是变量。它是字段名称中的常量。
    • 更新了答案。我有些心不在焉地认为你出于某种原因在表单域上循环。
    • 嗨,我想我想做什么还不清楚。我更新了这个问题,以非常具体地说明我想要实现的目标。对不起,我不够清楚。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签