【问题标题】:a query string into a structure查询字符串到结构中
【发布时间】:2018-07-21 12:43:29
【问题描述】:

我正在使用 taffy 并将一个未知的查询字符串传递给一个函数。我不知道提前传递的查询字符串值,所以我试图在函数中使用它,但它不起作用。请指出我正确的方向。

这是我的代码:

<cffunction name="qrystringToStruct" returntype="any">
    <cfargument name="myStruct" default="#structNew()#" type="struct">
    <cfargument name="str" required="true" default="">
    <cfscript>
        for(i=1; i LTE listLen(arguments.str,'&');i=i+1) {
        structInsert(myStruct, i, listGetAt(arguments.str,i,'&'));
        }
    </cfscript>
    <cfreturn myStruct>
</cffunction>

<cffunction name="getCourseById" taffy:verb="get" taffy:docs:hide>
  <cfargument name="structurl" type="any" default="" />
  <cfdump var="#structurl#">
 <cfdump var="#qrystringToStruct(structurl)#" abort> 
  <cfset var local = {} />

这就是我调用网址的方式:

http://localhost:9002/taffy/index.cfm//coursesMethods?credits=3&coursetitle=power 

但我得到的只是[empty string]

【问题讨论】:

  • 愚蠢的问题。 url.* 结构有什么问题?它会自动将 http 查询字符串更改为结构。
  • @JamesAMohler 好问题。但是,从他写问题的方式来看,听起来他不知道或无法预测 url 结构键。

标签: coldfusion coldfusion-11 lucee taffy


【解决方案1】:

让我先说我从未使用过太妃糖。但是话虽如此,我认为这与您发布的问题中指定的问题无关。您的代码中有几处让我感到困惑。

  • 您的调用 qrystringToStruct(structurl) 传递了一个参数,但您的函数定义有两个参数。
  • 为什么要将myStruct 声明为参数,然后在qrystringToStruct 函数定义中声明&lt;cfreturn myStruct&gt;?这毫无意义。
  • 您说您将完整的网址传递给http://localhost:9002/taffy/index.cfm//coursesMethods?credits=3&amp;coursetitle=power?为什么不直接使用cgi.QUERY_STRING 传递查询字符串部分?

无论如何,我认为您过于复杂了,您不需要自定义函数来解析您的查询字符串。您只需要一行代码。

<cfset qryString = listToArray(cgi.QUERY_STRING, "&")>

你可以在这里测试它here

【讨论】:

  • 嗨,好的,谢谢,但我想我错过了在查询命令中循环遍历结构的查询,这实际上是我发布问题时的 mitake,我错过了。这是我要执行的查询:&lt;cfoutput&gt; select * from course where 1=1 &lt;cfloop collection="#arguments.structurl#" item="kk"&gt; OR #kk# = "#trim(arguments.structurl['k'])# &lt;/cfloop&gt; &lt;/cfoutput&gt;
  • 我将函数更改为:&lt;cffunction name="QueryStringToStruct" output="false"&gt; &lt;cfargument name="QueryString" required="yes" type="string"&gt; &lt;cfset myStruct = StructNew()&gt; &lt;cfloop list="#QueryString#" delimiters="&amp;" index="i"&gt; &lt;cfset QueryStringParts = ListToArray(i, "=")&gt; &lt;cfset structInsert(myStruct, Trim(QueryStringParts[1]),Trim(QueryStringParts[2]))&gt; &lt;/cfloop&gt; &lt;cfreturn myStruct /&gt; &lt;/cffunction&gt;,我在这里为您创建的那个提琴:trycf.com/gist/f745d2f9258b392ad64a16b369ffe954/…
  • @JJK 好的,在比较了您在原始帖子中尝试执行的操作与更新后的要点之后,现在我可以看到您在做什么。再一次,你把事情复杂化了。您正在重新创建 ColdFusion 内置功能。正如 James Mohler 最初提到的那样,您需要的已经在 url 范围内。试试这个来验证&lt;cfdump var="#url#"&gt;。无需自定义函数。
  • @JJK - 请编辑您的问题并追加当前代码,以便清楚您实际想要做什么。也就是说 1) James 和 user9263373 可能是正确的,您不需要创建参数结构 - 您已经拥有一个:URL 范围。 2) 从不在 SQL 查询中使用原始客户端值。这是一个sql注入风险。 3) 函数应始终local 范围函数变量,包括循环索引,以避免线程问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多