出于调试目的,无法将复杂对象类型转换为简单值

时间:2018-08-06 03:30:47

标签: html html5 coldfusion

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

下面是代码:

<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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

<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>