【问题标题】:debugging purposes, Complex object types cannot be converted to simple values调试目的,复杂对象类型不能转换为简单值
【发布时间】:2018-08-06 03:30:46
【问题描述】:

我还是这门课程的新手。谁能帮我解决复杂对象类型无法转换为简单值的问题?

代码如下:

<td name="" style="text-align: center;" width="130px">
                  <cfoutput>
                  <cfquery name="str1" datasource="abcd">
                    SELECT Verifyby
                    FROM str
                  </cfquery>


                      <form action="" method="post">
                      <cfquery datasource="abcd" name="sign">
                       SELECT Sign
                       FROM sign
                      </cfquery>
                      </form>

                    <cfset str1.Verifyby = '#Sign#'>
                    <cfset #Verifyby# = str1.Verifyby>

                    <cfif #Verifyby# eq ''>                     
                        <input type="checkbox" id="myCheck" value="#Sign#" onclick="submit()">
                    <cfelse>
                      <p>#Verifyby#</p>
                    </cfif>
                  </cfoutput>
                </td>

【问题讨论】:

  • 您的问题不清楚。请花一些时间阅读帮助页面,stackoverflow.com/help/how-to-ask
  • TBH,我认为您需要花更多时间了解基本的html 以及&lt;form&gt; 的工作原理。还有我们如何将它与 ColdFusion 一起使用。然后尝试了解英镑 (#) 符号的工作原理。那将是一个很好的起点。 value="#Sign#" 出现错误,因为您试图在此处将查询变量 sign 显示为字符串。
  • 另外,strsignM是什么?查询可能会使用 JOIN,但是如果不了解这两个表以及它们之间的关系,很难说。

标签: html coldfusion


【解决方案1】:

好的。你的代码只需要一点点改进

问题:

您收到错误的原因是因为您试图将整个查询的值读入一个“简单值”,在这种情况下是一个字符串:

<cfset str1.Verifyby = '#Sign#'>

我还将重新组织您的部分代码,以便所有业务逻辑 [查询,在这种情况下] 都位于 HTML 之上。我会将条件子句的第一个分支放在:

<form>

它更容易阅读,尽量不要不必要地使用“#”符号。

我也倾向于使用:

Len(Trim(variables.someVariable))

在测试空字符串时,以防出现不需要的空格,除非您需要在相等测试中包含空格。

另外,请记住确定变量的范围。所以:

<cfset verifyby = qStr1.Verifyby>

应该是:

<cfset variables.verifyby = qStr1.Verifyby>

因为,否则,Coldfusion 必须使用优先例程来确定变量可能在什么范围内,这需要额外的时间。

但是,正如 Ageax 所指出的,最好直接在此处使用查询列引用。

所以,这里是解决方案:

<cfquery name="str1" datasource="DHRMS">
  SELECT Verifyby
  FROM str
</cfquery>

<cfquery datasource="DHRMS" name="sign">
  SELECT Sign
  FROM signM
</cfquery>

<td style="text-align: center;" width="130px">

  <cfoutput>

    <cfif NOT Len(Trim(qStr1.Verifyby))>
      <form action="save_HOD-staff" method="post">
        <input type="checkbox" id="myCheck" value="#qSign.Sign#" onclick="submit()">
      </form>
    <cfelse>
      <p>#qStr1.Verifyby#</p>
    </cfif>

  </cfoutput>

</td>

【讨论】:

  • 没错,但在大多数情况下,额外的时间可以忽略不计。 IMO,范围界定的主要原因是消除歧义。 CF 允许在多个作用域中声明相同的变量名。当它应用优先规则时,它并不总是正确地“猜测”。范围界定可确保您获得预期的变量。我意识到这只是为了说明......但是,创建qStr1.Verifyby 的副本没有任何目的;-)。只需在输出中直接使用变量即可。 (另外,不清楚这两个查询是否包含多条记录,这也可能改变代码)。
  • 是的。您对范围界定是正确的,但我认为对于 OP,一个新来者,这可能是一个很好的一般提示。
  • 范围界定绝对是一个好技巧!只是提到另一个,因为新用户经常创建额外的变量/副本,因为他们没有意识到他们可以直接使用原始变量。
  • @Ageax 实际上,现在,该解决方案确实需要占位符,因为我注意到查询需要“记录计数”测试。如果任一表为空,这将避免页面引发错误。我意识到这是一个边缘案例,但我觉得这是一个有效的场景。
  • @Ageax 是的。您对使用直接查询列引用是正确的。一定是热量;)我已经修改了我的答案以反映这一点......
【解决方案2】:
<cfset str1.Verifyby = '#Sign#'> 
<cfset #Verifyby# = str1.Verifyby>

应阅读:

<cfset str1.Verifyby = Sign.sign />
<cfset Verifyby = str1.Verifyby />

您将查询结果对象包装在一个字符串中,然后尝试将其作为字符串输出,这是不合法的,因为它是一个复杂对象。假设您想要查询列的值,您需要在查询结果中引用该列。

如果您想证明它是一个复杂对象,请在 cfquery 下方添加以下代码:

<cfdump var='#sign#' abort='true'/>

也就是说,这段代码还有很多错误。下面的代码应该运行;但这并不意味着会按照您的意愿行事。

<td style="text-align: center;" width="130px">
  <cfoutput>
    <!--- Get the current verifyBy value, but not using? --->
    <cfquery name="currentVerifyBy" datasource="DHRMS">
      SELECT Verifyby
      FROM str
    </cfquery>

    <cfquery name="getSign" datasource="DHRMS">
      SELECT Sign
      FROM signM
    </cfquery>

    <cfset Verifyby = getSign.sign />

    <cfif Verifyby eq ''>
      <form action="save_HOD-staff" method="post">
        <input type="checkbox" id="myCheck" value="#getSign.Sign#" onclick="submit()">
      </form>
    <cfelse>
      <p>#Verifyby#</p>
    </cfif>
  </cfoutput>
</td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多