【发布时间】:2018-06-20 07:07:04
【问题描述】:
我有来自多个表多记录的 json 文件。 json 文件是从本地 mysql 数据库创建的,我还有另一个具有相同架构的在线数据库。但是每个表都没有相同数量的字段和相同的数据/值。但是所有表的某些字段名称都是相同的(id、add_on、last_updated)。我想通过执行单个 php 文件将这些 json 文件值导入在线数据库。
json文件如下:
[
{
"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只包含单表记录)
<?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 文件中获取。
这里是回显的结果:
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
【问题讨论】:
-
为什么不使用 rows 数组中的列为每个表构建查询。一个包含 JSON 中的列名和数据表列名的简单数组将允许您在浏览 JSON 时动态构建整个 INSERT 语句。
-
我找不到。