我正在编写数据库导入函数。我的语言是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

10-04 23:25
查看更多