我正在编写数据库导入函数。我的语言是php。我的数据是json格式的。
我的代码如下:
public function import($data = '') {
if (!isset($data)) {
return array(
'error' => "Error: no data"
);
}
$data_arr = json_decode($data, true);
if (is_array($data_arr) && sizeof($data_arr)) {
// Truncate DB table
$sql = 'TRUNCATE `ms_data`';
$this->db->query($sql)->execute();
// Import data
$sql = 'INSERT INTO `ms_data` (
`id`,
`name`,
`parent`,
`ordering`
) VALUES (
:id,
:name,
:parent,
:ordering
)';
foreach($data_arr as $d) {
$this->db->query($sql)
->bind(":id", $d['id'])
->bind(":name", trim($d['name']))
->bind(":ordering", $d['ordering'])
->execute();
}
return array(
'status' => 1,
'message' => 'Data has been imported'
);
} else {
return array(
'error' => "Input is not array"
);
}
}
这是有效的代码,但是:也许你知道上面的任何代码问题,我现在不知道,或者任何改进建议?
谢谢!
最佳答案
我看到一个问题:
如果使用此函数加载大量信息,则需要很长时间才能结束。
您可以使用一个查询加载所有数据,代码如下:
<?php
public function import($data = '') {
if (!isset($data)) {
return array(
'error' => "Error: no data"
);
}
$data_arr = json_decode($data, true);
if (is_array($data_arr) && sizeof($data_arr)) {
// Truncate DB table
$sql = 'TRUNCATE `ms_data`';
$this->db->query($sql)->execute();
$itemCount = count($data_arr);
// Import data
$sql = 'INSERT INTO `ms_data` (
`id`,
`name`,
`parent`,
`ordering`
) VALUES ';
for($i=1; $i <= $itemCount; $i++)
{
// Last item should not put comma after values.
if ($i == $itemCount)
{
$sql = $sql . "(?,?,?,?)"
}
else
{
$sql = $sql . "(?,?,?,?),"
}
}
$stmt = $this->db->prepare($sql);
$i = 1;
foreach($data_arr as $d) {
$stmt->bindParam($i++, $d['id'])
->bindParam($i++, trim($d['name']))
->bindParam($i++, $d['ordering']);
}
$stmt->execute();
return array(
'status' => 1,
'message' => 'Data has been imported'
);
} else {
return array(
'error' => "Input is not array"
);
}
}
?>
使用这种方法,您将在一个查询中插入所有行,这将大大减少执行时间,并且将是atomic operation。