2

クライアントから次の JSON 応答を受け取りました。

{
    "name": "Joel",
    "cities_visited": [{
        "city1": "Chicago",
        "city2": "Seattle"
    }],
    "active": true
}

結果を取得するために使用json_decodeしていますが、citys_visited を 1 つのデータ セットとして mysql に挿入する際に問題があります。私もjson_decode($json, true)運が悪いと試しました。

データベースに挿入できるように、このデータを適切にフォーマットして準備する方法について、誰かが私に洞察を与えることができますか?

どういうわけか、このcitys_visited配列をmysqlの1つのエントリ行に取得し、それを取り出してjson_encodeと同じように返すことができるようにする必要があります

4

2 に答える 2

2

の列が 1 つしかなくcities_visited、複数の値を入れる必要がある場合は、何らかの方法でシリアル化する必要があります。すでに JSON を扱っているので、それを json に戻してデータベースに送信することもできます。

$user = json_decode($input);
$user->cities_visited = json_encode($user->cities_visited);

そんな感じ。ただし、これは最善の解決策ではありません。実際にやりたいことは、ユーザーと都市の間に多対人の関係を作成することです

ユーザー

  • id (整数)
  • 名前 (文字列)
  • ステータス (文字列)

都市

  • id (整数)
  • 名前 (文字列)

訪問

  • ユーザー ID (整数)
  • city_id (整数)

上記の例のデータでは、ユーザー テーブルに Joel の行を 1 行、City テーブルにシカゴとシアトルの行を 2 行、Visits テーブルにそれらをリンクする 2 つの行を作成します。

このアプローチの利点は、データの分析がはるかに簡単になることです。最も訪問された都市を知りたいとしましょう。単に

select count(*) AS number_visits, name as city_name
from Visits v 
join Cities c on v.city_id = c.id
group by v.city_id
order by visits
limit 1

フィールドがデータベースでシリアル化されている場合cities_visited、PHP を使用して各ユーザーをループし、結果を自分でカウントする必要があります。

于 2013-04-19T21:56:45.200 に答える
1

配列を扱っているので、結果をデータベースに格納する前にシリアル化を試みることができます。次に、取得するときにシリアル化を解除します。

参照: http://php.net/manual/en/function.serialize.php

于 2013-04-19T21:54:33.953 に答える