我可以从JSON动态创建mySQL表吗?

时间:2011-12-23 12:43:13

标签: php mysql json dynamic create-table

假设我有一个服务器端脚本,它通过表上的简单选择生成JSON。 JSON在第一个脚本中编码。

我无法控制第一个脚本,但是我知道底层数据库结构何时发生更改以及JSON结构何时发生更改。

脚本2使用CURL获取包含JSON的.js文件(内容),然后我可以将其解码为数组。

我需要做的是将数据存储在另一个数据库中。

我的问题基本上是关于自动化这个过程,并且当你不知道数组的结构到达时,能够从数组创建一个表。

可以吗?

编辑添加了当前的JSON,但关键是它可能会发生变化。

{"name": "Google",
 "homepage_url": "http://www.google.com",
 "blog_url": "",
 "blog_feed_url": "",
 "twitter_username": "",
 "category_code": "ecommerce",
 "tag_list": "retail-portal-online-shopping-markets",
 "alias_list": null,
 "image": null,
 "products":
  [],
 "relationships":
  [],
 "competitions":
  [],
 "providerships":
  [{"title": "Legal",
    "is_past": false,
    "provider":
     {"name": "TaylorWessing",
      "permalink": "taylorwessing"}}],
 "offices":
  [{"description": "European HQ",
    "address1": "",
    "address2": "",
    "zip_code": "",
    "city": "Brussels",
    "state_code": null,
    "country_code": "BEL",
    "latitude": null,
    "longitude": null}]}

3 个答案:

答案 0 :(得分:4)

创建mysql表并从任何JSON变量插入值的简单代码片段。这是一个快速的黑客..检查字段类型等:)可能有更好的方法,但这一个工作,已经节省了我手动字段命名的时间

可以修改此项以创建处理对象的关系表。现在,它是由数组形成的JSON东西而不是对象,即数组中的数组。

<?php

    JSON_to_table($place_your_JSON_var_here_please);

            function JSON_to_table($j_obj, $tblName = "New_JSON_table_" . time()){
            $j_obj = json_decode($your_JSON_variable, true);
            if(!mysql_num_rows( mysql_query("SHOW TABLES LIKE '" . $tblName . "'"))){ 
                $cq = "CREATE TABLE ". $tblName ." (
                id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";
                foreach($j_obj as $j_arr_key => $value){
                    $cq .= $j_arr_key . " VARCHAR(256),";
                }
                $cq = substr_replace($cq,"",-1);
                $cq .= ")";
                mysql_query($cq) or die(mysql_error());
            }

            $qi = "INSERT INTO $tblName (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= $j_arr_key . ",";
                }
                $qi = substr_replace($qi,"",-1);
            $qi .= ") VALUES (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= "'" . mysql_real_escape_string($value) . "',";
                }
            $qi = substr_replace($qi,"",-1);
            $qi .= ")";
            $result = mysql_query($qi) or die(mysql_error());

        return true;
            }
?>

答案 1 :(得分:1)

我会在问题旁边回答,但如果你想存储JSON,为什么不使用文档数据库呢? CouchDB沙发“按原样”存储您的JSON,无需您进行任何处理。

答案 2 :(得分:0)

获得JSON后,您可以使用PHP的json_decode函数将JSON转换为标准PHP对象。 http://php.net/manual/en/function.json-decode.php

然后,您可以通过使用foreach循环新创建的对象来构建SQL查询字符串。 http://php.net/manual/en/control-structures.foreach.php

当您遍历对象时,您可能必须进行类型检查以确保为数据库创建正确类型的字段。例如,使用PHP的is_numeric函数来确保将该字段设置为数字而不是varchar。但那取决于你在那里做什么。你可以让它翻录并使所有字段变成varchar。

您也可以按原样存储JSON对象,但我不知道您是否只需要存档数据,或者是否需要它来进行搜索和报告。如果您确实需要搜索/报告,那么您将不得不进行某种转换。或者做RageZ所说的并放入Couch数据库。还有其他一些选择,比如MongoDB。 http://www.mongodb.org/但是如果你没有时间学习和安装No-SQL数据库,那么我会坚持转换。