Arrays 在LiveCode$\u会话中嵌套数组

Arrays 在LiveCode$\u会话中嵌套数组,arrays,session,livecode,Arrays,Session,Livecode,我正在开发一个LiveCode服务器CGI系统,作为保险业务的客户机门户,我的意思是客户机将登录并能够看到有关其帐户的全部信息。他们将能够查看他们的保单历史记录、保险明细和下载保险凭证等 基本功能目前已经就绪,客户端可以登录,系统连接到数据库并收回其数据 但是,我希望在登录期间预加载大多数重要数据。为此,我将数据加载到$\u会话中,这对于基本用户数据(公司名称等)非常有效 只要我尝试在$\会话中存储一个数据数组,它就根本不起作用(例如,关于每个策略的数据)。如果我将此数据存储在一个全局数组变量中

我正在开发一个LiveCode服务器CGI系统,作为保险业务的客户机门户,我的意思是客户机将登录并能够看到有关其帐户的全部信息。他们将能够查看他们的保单历史记录、保险明细和下载保险凭证等

基本功能目前已经就绪,客户端可以登录,系统连接到数据库并收回其数据

但是,我希望在登录期间预加载大多数重要数据。为此,我将数据加载到$\u会话中,这对于基本用户数据(公司名称等)非常有效

只要我尝试在$\会话中存储一个数据数组,它就根本不起作用(例如,关于每个策略的数据)。如果我将此数据存储在一个全局数组变量中,它在加载的下一个页面上可以正常工作,但在会话的其余部分不会持续

下面的代码用于从数据库加载数据

//load client info
put $_SESSION ["username"] into var1
put "SELECT * FROM client WHERE client_number_display_text_c = :1" into tQuery
put revQueryDatabase(tDatabaseID, tQuery, "var1") into tCursor

put revDatabaseColumnNamed(tCursor, "_pk_client") into $_SESSION["pk_client"]
put revDatabaseColumnNamed(tCursor, "client_account_status") into $_SESSION["account_status"]
put revDatabaseColumnNamed(tCursor, "client_category_aec") into $_SESSION["category"]
put revDatabaseColumnNamed(tCursor, "client_display_name_c") into $_SESSION["display_name_c"]

//load policy info
put $_SESSION["pk_client"] into var1
put "SELECT * FROM policy WHERE " & quote & "_fk_client" & quote & " = :1" into tQuery
put revQueryDatabase(tDatabaseID, tQuery, "var1") into tCursor

if tCursor is an integer then
   put 1 into i

   put revDatabaseColumnNamed(tCursor, "_fk_broker") into $_SESSION["policies"][i]["fk_broker"]
   put revDatabaseColumnNamed(tCursor, "_pk_policy") into $_SESSION["policies"][i]["pk_policy"]
   put revDatabaseColumnNamed(tCursor, "policy_date_expiry_actual_aec") into $_SESSION["policies"][i]["actual_expiry_date"]
   put revDatabaseColumnNamed(tCursor, "policy_date_inception_aec") into $_SESSION["policies"][i]["inception_date"]
   put revDatabaseColumnNamed(tCursor, "policy_display_cover_products_c") into $_SESSION["policies"][i]["display_products_c"]
   put revDatabaseColumnNamed(tCursor, "policy_total_price_inc_tax_admin_c") into $_SESSION["policies"][i]["total_price_inc_tax_admin_c"]
end if
(我将使用一个循环来读取所有的策略数据,一旦我得到了这个位的工作,因此是'I'变量)

当显示主屏幕时,我使用代码

put "<tr>"
put "<td>" & $_SESSION["policies"][1]["display_products_c"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["inception_date"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["actual_expiry_date"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["total_price_inc_tax_admin_c"] & "</td>"
put "</tr>"
put“”
将“&$”会话[“策略”][1][“显示产品”]&”
将“&$”会话[“策略”][1][“起始日期”]&”
将“&$”会话[“策略”][1][“实际到期日”]&”
将“&$”会话[“策略”][1][“总价公司税管理”]&”
放置“”
这只是显示一个空白表行。我曾尝试将$\u会话放入一个数组并使用Combine,但我只是从嵌套数组中获取顶级数据,什么也没有

作为测试,我尝试了以下代码

put "<tr>"
put "<td>" & $_SESSION["display_name_c"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["inception_date"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["actual_expiry_date"] & "</td>"
put "<td>" & $_SESSION["policies"][1]["total_price_inc_tax_admin_c"] & "</td>"
put "</tr>"
put“”
放置“&$”会话[“显示名称”]&”
将“&$”会话[“策略”][1][“起始日期”]&”
将“&$”会话[“策略”][1][“实际到期日”]&”
将“&$”会话[“策略”][1][“总价公司税管理”]&”
放置“”
在这种情况下,客户端的显示名称在第一列中显示正确的数据-所有其他列均为空

我使用了完全相同的代码,但我只是使用gUser(定义为全局gUser)而不是$\u会话。当使用gUser代替S_会话时,所有数据显示与预期完全一致,但不会持久

看起来好像$\u会话无法存储嵌套数组。如果是这种情况,那么我只需在$_SESSION[“policy_keys”]中存储一个键的文本列表(可能用cr分隔),然后在需要时使用AJAX动态加载数据。所以我知道有很多方法可以解决这个问题,但我想在做进一步的改变之前我应该先问一下

我正在Windows Server 2016数据中心上使用LiveCode Server 8.1.2


任何帮助和指导都是最受欢迎的

首先:会话通常存储在平面文件中,因此在会话中存储大量数据可能不会获得太多(如果有的话)。第二,如果你有一个流量大的站点,它可能会给你的服务器带来性能和内存问题

除此之外,我不知道为什么不能在会话中保存多维数组,也许它是以某种特定的方式保存的(也许母舰上的某个人可以回答这个问题)。但这里有一个方法,我用了很多通过互联网发送“数组”。我现在无法访问服务器,因此无法针对您的具体情况进行测试。但理论是这样的

您可以尝试的是首先创建要保存在会话中的数组,然后使用arrayEncode将其存储在会话变量中。然后您至少会得到一个平面会话阵列:

put "data1" into tArr["key1"]
put "data2" into tArr["key2"]
...
put arrayEncode(tArr) into $_SESSION["myArray"]
然后检索数组的操作将与此相反:

put arrayDecode($_SESSION["myArray"]) into tArr
如果$\u会话不喜欢二进制数据(arrayEncode创建二进制数据),可以使用base64encode/-decode添加另一层编码,以确保只保存标准ascii码。这就是我在通过网络将阵列从一个应用程序发送到另一个应用程序时所做的

put base64Encode(arrayEncode(tArr)) into $_SESSION["myArray"]
put arrayDecode(base64Decode($_SESSION["myArray"])) into tArr
但我也不确定您是否会从将大量数据保存到会话中获益,因为我想从数据库中重新填充数据会更快


如果您基于数据库中的几个不同表构建了一个非常复杂的数组,并且无法创建一个select语句来再次检索所有数据,那么另一个解决方案可能是使用上述方法将数组存储在单个表中。但我强烈建议您在进行大量额外编程之前进行一些速度测试…

首先:会话通常存储在平面文件中,因此在会话中存储大量数据可能不会获得太多(如果有的话)。第二,如果你有一个流量大的站点,它可能会给你的服务器带来性能和内存问题

除此之外,我不知道为什么不能在会话中保存多维数组,也许它是以某种特定的方式保存的(也许母舰上的某个人可以回答这个问题)。但这里有一个方法,我用了很多通过互联网发送“数组”。我现在无法访问服务器,因此无法针对您的具体情况进行测试。但理论是这样的

您可以尝试的是首先创建要保存在会话中的数组,然后使用arrayEncode将其存储在会话变量中。然后您至少会得到一个平面会话阵列:

put "data1" into tArr["key1"]
put "data2" into tArr["key2"]
...
put arrayEncode(tArr) into $_SESSION["myArray"]
然后检索数组的操作将与此相反:

put arrayDecode($_SESSION["myArray"]) into tArr
如果$\u会话不喜欢二进制数据(arrayEncode创建二进制数据),可以使用base64encode/-decode添加另一层编码,以确保只保存标准ascii码。这就是我在通过网络将阵列从一个应用程序发送到另一个应用程序时所做的

put base64Encode(arrayEncode(tArr)) into $_SESSION["myArray"]
put arrayDecode(base64Decode($_SESSION["myArray"])) into tArr
但我也不确定您是否会从将大量数据保存到会话中获益,因为我想从数据库中重新填充数据会更快

如果您基于数据库中的多个不同表构建了一个非常复杂的数组,并且无法创建一个select语句来再次检索所有数据,那么另一个解决方案可能是使用上述方法将数组存储在一个表中