首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用php将多条表记录从json导入到mysql

如何使用php将多条表记录从json导入到mysql
EN

Stack Overflow用户
提问于 2018-06-20 15:07:05
回答 1查看 1.6K关注 0票数 1

我有来自多个表多个记录的json文件。json文件是从本地mysql数据库创建的,我还有另一个具有相同模式的在线数据库。但每个表都不具有相同数量的字段和相同的数据/值。但是有些字段名对于所有的表都是相同的(id、added_on、last_updated)。我想通过执行一个php文件将这些json文件值导入到在线数据库中。

json文件如下所示:

代码语言:javascript
复制
[
    {
        "tableName":"table_Name_1",
        "rows":[
                {   
                    "t1column1":"valuet1row11",
                    "t1column2":"valuet1row12",
                    "t1columnx":"valuet1row1x"
                },
                {   
                    "t1column1":"valuet1row21",
                    "t1column2":"valuet1row21",
                    "t1columnx":"valuet1row2x"  
                },
                {   
                    "t1column1":"valuet1rowx1",
                    "t1column2":"valuet1rowx2",
                    "t1columnx":"valuet1rowxx"  
                }
               ]
    },
        {
        "tableName":"table_Name_2",
        "rows":[
                {   
                    "t2column1":"valuet2row11",
                    "t2column2":"valuet2row12",
                    "t2columnx":"valuet2row1x"
                },
                {   
                    "t2column1":"valuet2row21",
                    "t2column2":"valuet2row22",
                    "t2columnx":"valuet2row2x"  
                },
                {   
                    "t2column1":"valuet2rowx1",
                    "t2column2":"valuet2rowx2",
                    "t2columnx":"valuet2rowxx"
                }
               ]
    },
        {
        "tableName":"table_Name_n",
        "rows":[
                {   
                    "tncolumn1":"valuetnrow11",
                    "tncolumn2":"valuetnrow12",
                    "tncolumnx":"valuetnrow1x"
                },
                {   
                    "tncolumn1":"valuetnrow21",
                    "tncolumn2":"valuetnrow22",
                    "tncolumnx":"valuetnrow2x"  
                },{ 
                    "tncolumn1":"valuetnrowx1",
                    "tncolumn2":"valuetnrowx2",
                    "tncolumnx":"valuetnrowxx"
                }
               ]
    },
]

以下php代码用于将json文件记录导入到数据库中的单个表中。(这里的single_table.json只包含一个表记录)

代码语言:javascript
复制
<?php
    try
    {
        $connect = mysqli_connect("localhost", "fmart", "password", "mart_dbsync");    
        $query = '';
        $table_data = '';
        $filename = "single_table.json";

        $data = file_get_contents($filename);
        $array = json_decode($data, true); 

        foreach($array as $row) 
        {
            $query .= "INSERT INTO purchases(id, invoicenum, supplier, stock_keeper, counter, added_by, is_deleted, description, is_opening_stock, department, added_on, last_updated) VALUES ('".$row["id"]."', '".$row["invoicenum"]."', '".$row["supplier"]."', '".$row["stock_keeper"]."', '".$row["counter"]."', '".$row["added_by"]."', '".$row["is_deleted"]."', '".$row["description"]."', '".$row["is_opening_stock"]."', '".$row["department"]."', '".$row["added_on"]."', '".$row["last_updated"]."') ON DUPLICATE KEY UPDATE invoicenum='".$row["invoicenum"]."', supplier='".$row["supplier"]."', stock_keeper='".$row["stock_keeper"]."', counter='".$row["counter"]."', added_by='".$row["added_by"]."', is_deleted='".$row["is_deleted"]."', description='".$row["description"]."', is_opening_stock='".$row["is_opening_stock"]."', department='".$row["department"]."', added_on='".$row["added_on"]."', last_updated='".$row["last_updated"]."';";
        }

            mysqli_multi_query($connect, $query);  

            echo "<h1>All purchases appended </h1>";
    } 

    catch(Exception $e)
    {   
        echo $e->getMessage();    
    }
?>

在上面的php代码中,表名被硬编码到INSERT语句中。但是通过使用新的json (就像上面的json格式),它包含超过25个表,并且表名应该取自json文件。

这是回声的结果:

代码语言:javascript
复制
contacts

Insert query:

INSERT INTO contacts 
(First_Name, Last_Name, Company, Business_Phone, Email_Address)
VALUES
('Dave','Frank','Company1','0115 999999','zvv@zz.com'),
('Dave','Blogs','Company2','0115 888888','zvv@zz.com'),
('David','frank','Company3','0115 777777','zvv@zz.com')

Error: 1
INSERT INTO contacts (First_Name, Last_Name, Company, Business_Phone, Email_Address) VALUES ('Dave','Frank','Company1','0115 999999','zvv@zz.com'), ('Dave','Blogs','Company2','0115 888888','zvv@zz.com'), ('David','frank','Company3','0115 777777','zvv@zz.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1contacts_old

Insert query:

INSERT INTO contacts_old 
(First_Name, Last_Name, Company, Business_Phone, Email_Address)
VALUES
('Dave','Frank','Company1','0115 999999','zvv@zz.com'),
('Dave','Blogs','Company2','0115 888888','zvv@zz.com'),
('David','frank','Company3','0115 777777','zvv@zz.com')

Error: 1
INSERT INTO contacts_old (First_Name, Last_Name, Company, Business_Phone, Email_Address) VALUES ('Dave','Frank','Company1','0115 999999','zvv@zz.com'), ('Dave','Blogs','Company2','0115 888888','zvv@zz.com'), ('David','frank','Company3','0115 777777','zvv@zz.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 15:42:20

这只是一个框架,用于展示基于JSON中的数据构建查询的思想。它需要根据您的实际数据和表模式进行一些调整和调整。

作为改进,我还将为每个表构建一个具有多个值的插入。

编辑

更改代码以读取和插入JSON文件中的所有表。假定JSON文件中的表名和列名与实际的表匹配。它还为具有id列的表添加了ON DUPLICATE更新。

注意:未经测试,可能存在打字错误。

代码语言:javascript
复制
<?php
    try
    {
        $connect = mysqli_connect("localhost", "fmart", "password", "mart_dbsync"); 
        $query = '';
        $table_data = '';
        $filename = "single_table.json";

        $data = file_get_contents($filename);
        $array = json_decode($data, true); 

        foreach($array as $set) 
        {
            $tblName = $set['tableName'];
            if(sizeof($set['rows']) > 0) {
                $query = '';
                $colList = array();
                $valList = array();
                //  Get list of column names
                foreach($set['rows'][0] as $colname => $dataval) {
                    $colList[] = "`".$colName."`";
                }
                $query .= "INSERT INTO `".$tblName."` \n";
                $query .= "(".implode(",",$colList).")\nVALUES\n";
                //  Go through the rows for this table.
                foreach($set['rows'] as $idx => $row) {
                    $colDataA = array();
                    //  Get the data values for this row.
                    foreach($row as $colName => $colData) {
                        $colDataA[] = "'".$colData."'";
                    }
                    $valList[] = "(".implode(",",$colDataA).")";
                }
                //  Add values to the query.
                $query .= implode(",\n",$valList)."\n";
                //  If id column present, add ON DUPLICATE KEY UPDATE clause
                if(in_array("`id`",$colList)) {
                    $query .= "ON DUPLICATE KEY UPDATE\n\tSet ";
                    $tmp = array();
                    foreach($colList as $idx => $colName) {
                        $tmp[] = $colName." = new.".$colname." ";
                    }
                    $query .= implode(",",$tmp)."\n";
                } else {
                    echo "<p><b>`id`</b> column not found. <i>ON DUPLICATE KEY UPDATE</i> clause <b>NOT</b> added.</p>\n";
                    echo "<p>Columns Found:<pre>".print_r($colList,true)."</pre></p>\n";
                }
                echo "<p>Insert query:<pre>$query</pre></p>";
                $r = mysqli_query($connect, $query);  
                echo "<h1>".mysqli_num_rows($r)." Rows appeded in $tblName</h1>";
            } else {
                echo "<p>No rows to insert for $tblName</p>";
            }
        }
    } 

    catch(Exception $e)
    {   
        echo $e->getMessage();  
    }
?>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50942235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档