首页 > 解决方案 > PHP 7.2 - SQL Server 2017 - 创建嵌套数组响应

问题描述

我有一个从 SQL Server 数据库中检索数据的存储过程。

使用查询结果,我需要填充 SOAPClient 方法的参数数组

目前我正在手动创建数组,但我想知道是否可以(并且值得)直接从 TSQL 以 SOAP 方法所需的方式创建数组:

使用 PHP 7.2 - SQL Server 2017

让我用一个例子来解释一下:这是我的查询结果:

Array
(
    [Key] => R******l
    [Password] => c*************z
    [AccountNumber] => 0****1
    [MeterNumber] => 2******5
    [ShipTimestamp] => 2020-10-29T10:24:19+01:00
    [ServiceType] => INTERNATIONAL_ECONOMY
    [PackagingType] => YOUR_PACKAGING
    [PreferredCurrency] => EUR
    [Weight_Units] => KG
    [TotalWeight] => 0.02
...
)

虽然它应该返回如下内容:

Array
(
    [Authentication] => Array
    (
        [User] => Array
        (
            [Key] => R******l
            [Password] => c*************z
        )
    )

    [Client] => Array
    (
        [Account] => 0*******1
        [Meter] => 2*******5
    )

    [Shipment] => Array
    (
        [ShipTimestamp] => 2020-10-29T10:41:26+01:00
        [DropoffType] => REGULAR_PICKUP
        [ServiceType] => INTERNATIONAL_ECONOMY
        [PackagingType] => YOUR_PACKAGING
        [PreferredCurrency] => EUR
        [TotalWeight] => Array
        (
            [Units] => KG
            [Value] => 0.02
        )
    )
    ...
)

有可能而且值得吗?

标签: phpsql-serversoap-clientphp-7.2

解决方案


您可以在 SQL 和 PHP 3中使用FOR JSON PATH1返回一行和一个 JSON 列,并将参数设置为将 JSON 解码为数组。json_decode($json, true)$assoctrue

SELECT (
  SELECT user_key [Authentication.User.Key]
       , user_password  [Authentication.User.Password]
       , client_account [Client.Account]
       , client_meter   [Client.Meter]
      --- and so on
  FROM my_table
  FOR JSON PATH
) [json]

结果应该是 JSON

{ 
 "Authentication": { "User": { "Key": "XXX", "Password": "XXX" } },
 "Client": { "Account": "YYY", "Meter": 200500 }
}

现在您可以在 PHP 中获取该值,对其进行解码并提供给 SOAP。

  $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
  $json = json_decode($row['json'], true);

但在 SQL 中,您需要一种特殊的语法来格式化这些类型:

  1. 日期CONVERT(varchar(10), date_col, 120)- 120结果2020-10-29 11:32:00格式,varchar(10)仅修剪日期部分,varchar(20)获取整个日期+时间2
  2. 布尔CAST(boolean_col as bit)( 0 -> false, 1 -> true)

更多信息:

  1. SQL:使用 FOR JSON 将查询结果格式化为 JSON
  2. SQL:使用不同格式的日期时间进行 CAST 和 CONVERT
  3. PHP: json_decode

推荐阅读