0

希望在这里得到一些帮助。我有一个大的 xml 文件(在上面的代码中称为 xml-file.xml)。我在上面的代码中遇到的问题是将所有内容写入数据库非常慢。我认为它很慢的原因是因为该部分循环播放电影并仅将电影名称以逗号分隔的字符串写入表中。我的问题 - 有没有更有效的方法将电影名称转换为逗号分隔的字符串,然后写入表格?提前感谢您的帮助!

XML 标记:

    <users>
      <user>
        <id>7280462</id>
        <name>John</name>
        <movies>
          <name>
            <![CDATA[Jack]]>
          </name>
          <description>
            <![CDATA[comedy]]>
          </description>
          <name>
            <![CDATA[Superman]]>
          </name>
          <description>
            <![CDATA[action]]>
          </description>
          <name>
            <![CDATA[Ace Venture]]>
          </name>
          <description>
            <![CDATA[comedy]]>
          </description>
          <name>
            <![CDATA[Major League]]>
          </name>
          <description>
            <![CDATA[sports]]>
          </description>
        </movies>
      </user>
    </users>

我的PHP代码:

    $file = 'xml-file.xml';
    $users = simplexml_load_file($file);

    $num_rows = count($users);
    for ($j=0; $j < $num_rows; $j++) { 
        $userid = $users->user[$j]->id;
        $name = $users->user[$j]->name;

        //update table with userid and name
        $db->exec("INSERT INTO table (userid, name) VALUES ('$userid', '$name')");

            //loop through movies and write only movie name to table as comma separated string
            foreach ($users->user$j]->movies as $element) {
              foreach($element as $key => $val) {
                  if ($key != 'description') {
                       //echo "{$key}: {$val}";
                       $title = trim($val).',';
                      $db->exec("UPDATE table set movies = concat(movies,'','$title') where userid = '$userid'");
                    }
              }
            }

    }
4

2 回答 2

1

这个怎么样:

for ($j=0; $j < $num_rows; $j++) { 
    $userid = $users->user[$j]->id;
    $name = $users->user[$j]->name;
    $titles = "";

    foreach ($users->user$j]->movies as $element) {
        foreach($element as $key => $val) {
            if ($key != 'description') {
                   $titles .= trim($val).',';
            }
        }
    }

    $titles = trim($titles, ",");

    $db->exec("INSERT INTO table (userid, name, movies) VALUES ('$userid', '$name','$titles')");

 }

它一次性生成所有 SQL,因此您只需要一条语句。

于 2012-08-17T16:00:38.763 回答
1

首先重新调整您的数据库。这将避免使用 concat 等。为此请查看 Google。

您需要确保您的查询知道任何索引,或者如果没有索引,请创建一个。

MySql 中的EXPLAIN关键字是你的朋友。它会告诉你发生了什么或没有发生什么。

另外更改 XML 的格式并使用 DOM。

有一个标签“电影”,其中仅包含有关 A 电影的详细信息。

IE

<movies>
    <movie>
       <name>Jack</name>
       <description>Comedy</descript>
     </movie>
     <movie>
        <name>Superman</name>
        <description>Action</description>
     </movie>
  ....
</movies>
于 2012-08-17T16:11:30.507 回答