【问题标题】:Nesting arrays in LiveCode $_SESSIONLiveCode $_SESSION 中的嵌套数组
【发布时间】:2017-03-29 10:04:00
【问题描述】:

我正在开发一个 LiveCode Server CGI 系统,作为保险业务的客户门户网站,我的意思是客户将登录并能够查看有关其帐户的大量信息。他们将能够查看他们的保单历史、保险详情和下载保险证书等。

目前基本已经到位,客户端可以登录,系统连接到数据库并拉回他们的数据。

但是,我想在登录期间预加载大部分重要数据。为此,我将数据加载到 $_SESSION 中,这对于基本用户数据(公司名称等)非常有用。

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

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

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

这只是显示一个空白表格行。我尝试将 $_SESSION 放入一个数组并使用 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>"

在这种情况下,客户的显示名称在第一列中显示正确的数据 - 所有其他列都是空白的。

我使用了完全相同的代码,但我只是使用 gUser(定义为全局 gUser)而不是 $_SESSION。当使用 gUser 代替 S_SESSION 时,所有数据都完全按预期显示 - 但不会持久化。

似乎 $_SESSION 无法存储嵌套数组。如果是这种情况,那么我将在 $_SESSION["policy_keys"] 中简单地存储一个键的文本列表(可能是 cr 分隔) - 然后在需要时使用 AJAX 动态加载数据。所以我知道有一些方法可以解决它,但我想在进行进一步更改之前我会先询问一下。

我在 Windows Server 2016 Datacenter 上使用 LiveCode Server 8.1.2

欢迎任何帮助和指导

【问题讨论】:

    标签: arrays session livecode


    【解决方案1】:

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

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

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

    put "data1" into tArr["key1"]
    put "data2" into tArr["key2"]
    ...
    put arrayEncode(tArr) into $_SESSION["myArray"]
    

    然后检索数组将是相反的:

    put arrayDecode($_SESSION["myArray"]) into tArr
    

    如果 $_SESSION 不喜欢二进制数据(arrayEncode 创建二进制数据),您可以使用 base64encode / -decode 添加另一层编码,以确保您只保存标准 ascii 代码。这就是我通过网络将数组从一个应用程序发送到另一个应用程序时所做的。

    put base64Encode(arrayEncode(tArr)) into $_SESSION["myArray"]
    put arrayDecode(base64Decode($_SESSION["myArray"])) into tArr
    

    但我不确定你是否会通过将大量数据保存到会话中受益,因为我想从数据库中重新填充会更快。

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

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多