Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct Cf脚本是否使用唯一键在结构中转换查询结果?_Struct_Coldfusion_Cfml_Cfquery_Cfloop - Fatal编程技术网

Struct Cf脚本是否使用唯一键在结构中转换查询结果?

Struct Cf脚本是否使用唯一键在结构中转换查询结果?,struct,coldfusion,cfml,cfquery,cfloop,Struct,Coldfusion,Cfml,Cfquery,Cfloop,在我的系统中,应该从CFML转换为CFSCRIPT的函数很少。在处理这个项目时,我遇到了这样一种情况:我的结构输出的结果比它应该输出的结果多很多空行,即使查询也只返回一行。以下是我在CFSCRIPT中的代码示例: cfstoredproc( procedure="GetZip", datasource=Application.dsnRead ) { cfprocparam( dbvarname="@Zip", value=trim(52401), cfsqltype="cf_sql_ch

在我的系统中,应该从CFML转换为CFSCRIPT的函数很少。在处理这个项目时,我遇到了这样一种情况:我的结构输出的结果比它应该输出的结果多很多空行,即使查询也只返回一行。以下是我在CFSCRIPT中的代码示例:

cfstoredproc( procedure="GetZip", datasource=Application.dsnRead ) {
    cfprocparam( dbvarname="@Zip", value=trim(52401), cfsqltype="cf_sql_char", maxlength=5 );
    cfprocresult( name="ZipResult" );

}

local.strZip = {};
strZip[ZipResult.RecID] = {
    "City" : trim(ZipResult.City),
    "State" : trim(ZipResult.State)
};

writeDump(strZip);
以下是我得到的输出:

array
1   [undefined array element]
2   [undefined array element]
3   [undefined array element]
4   [undefined array element]
5   [undefined array element]
6   [undefined array element]
7   [undefined array element]
8   [undefined array element]
9   [undefined array element]
10  [undefined array element]
11  [undefined array element]
12  [undefined array element]
13  [undefined array element]
14  [undefined array element] 
...
我想知道在结构中输出查询结果并使用RecID作为唯一键的最佳方法是什么?这个例子和上面的查询每次都会返回一条记录,但我想知道如果我需要循环查询结果和多条记录,这段代码会如何工作

更新:我想我发现了问题。RecID是my db表中的自动增量id。例如,当我返回RecID时,值可以是56743。因此,如果我在结构中将RecID作为键传递,这将导致结构中出现太多行。我的问题是如何防止这种情况?有没有办法只设置键?

你可以试试这个-

    var strZip = {};
    for ( i=1; i<=ZipResult.recordCount; i++)
    {
        strZip[ZipResult.RecID[i]] = {
             "City" : trim(ZipResult.City[i]),
             "State" : trim(ZipResult.State[i])
        };
    }

这样,我们将查询视为数组结构。

不,你说得对。因为它是一个整数,所以ColdFusion将数组填充到该整数的点,因为不能有一个包含大量空值的数组;它们必须有一些值,所以,正如你在这里看到的,它们是未定义的。 不能对结构键使用整数。如果你在它的前面加上一个字母,然后在你引用它的时候把键值切掉,那就行了。这有点骇人听闻,但我通常都是这样做的。
如果您想测试它,可以使用StructInsert而不是[]。

我不知道为什么您的CF会将strZip转换为数组,但这就是为什么您会得到大量空值。结构键可以是整数,但当您告诉数组插入x[42]时,数组中将有42个元素。local.strZip={};非常明确地声明strZip是一个结构。然而,CF中的作用域有时会变得怪异。根据您使用它的方式,我认为当您使用strZip[ZipResult.RecID]时,它可能会创建一个新的非范围变量,即数组。然后,当您转储它时,您正在转储strZip的阵列版本。您可以尝试使用local.strZip[ZipResult.RecID],看看这是否会改变您的行为。或者尝试转储local.strZip并查看它是否为空

或者你可以:

<cfscript>
    // Build a fake query object.
    ZipResult = queryNew(
        "RecID, City, State",
        "integer, varchar, varchar",
        [
              { RecID: 99, City: "Nashville", State: "TN" }
        ]
    );
    writeDump(ZipResult); // What's in our query?


local.strZip = {
    "#ZipResult.RecID#" : {
      City : trim(ZipResult.City) , 
      State : trim(ZipResult.State)
    }
};

writeDump(strZip);

</cfscript>
注意:我无法在TryCF中复制您的行为,但我也不可能在与您相同的范围内执行该代码。
确认:

之所以如此,是因为CF认为strZip是一个数组,而不是一个结构。我无法使用发布的代码片段复制它。你能把完整的功能贴出来吗?还有,CF的哪个版本?@Ageax我不知道如何在这里为ColdFusion创建工作代码段。我使用CF 2016。我不确定这是否仅仅是因为我试图将结果转储到屏幕上…@espresso_coffee刚刚发布了上面的整个功能。您也可以使用手动查询创建代码段,例如QueryNew,但是让我们先看看function@espresso_coffee-我们肯定需要看到完整的代码,因为到目前为止它还不可复制。在你的应用程序中建议一些不同的东西。我真的不理解在一个有很多活动的问题上的反对票。但无论如何,我已经证实了这个问题以及我对范围界定问题的怀疑。CFFiddle显然配置了与服务器相同的作用域搜索。我想我比TryCFs更喜欢这个设置。无论如何:是的,可以对结构键使用整数。但背景很重要。CF需要了解它是一种结构。通常这种情况发生在变量类型不明确的情况下。CF不知道您想要哪一个,所以它只能猜测。它看到一个整数并决定你想要一个数组。你是对的,我的评论有误导性:如果你对结构键使用整数,它不会抛出错误,但这正是发生的情况:CF将其转换为数组。我想另一种解决方法是设置strZip.a=或类似的,因此在开始添加数字键之前将其设置为struct,然后忽略该键。我真的不知道哪一个不那么黑客。FWIW,你可以使用更新答案。我怀疑原因是缺少范围。我不确定是什么导致了这个问题。我唯一能做的就是使用structnew而不是={};我不确定这是否会改变什么。structNew和={}之间基本上没有区别。我的示例在一个结构中设置了一个结构,这似乎是您最初的代码所做的。@espresso_coffee-两个单独的人无法使用OP posted复制它的事实强烈表明实际代码中与您发布的代码片段不同。但如果没有一个真正的重编案例,我们都只是猜测。。。请多花一点时间,将实际再现问题的最小数量的代码放在一起:-