【问题标题】:Inserting data to MySQL from XML从 XML 向 MySQL 插入数据
【发布时间】:2014-02-01 23:57:26
【问题描述】:

我正在尝试从 XML 中检索数据并将其插入 MySQL,但数据不断重复或循环,不知道如何修复它。

这是我的 PHP 脚本,它通过 audioscrobbler.com API 获取 XML 数据。 (请参阅页面下方的 FULL XML 数据)

$artist = 'metallica';
$title = 'whiskey in the jar';
$xml = simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=$myAPIkey&artist=$artist&track=$title") or die("Error: Cannot create object");

foreach($xml->track->children() as $track => $data){

      $song_album .= $data->title;
      $song_tag = $data->tag->name[0];
      $song_imageURL .= $data->image[2];

  $xml = NULL;

}

我将这些值插入 MySQL 并且可以正常工作,但是使用 $song_album$song_tag 我会一遍又一遍地重复相同的数据,而且我找不到只插入一次文本值的方法。

这是插入 a 行后 *song_album* 列在 mysql 中的样子:

 Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.

它应该在哪里:

Garage, Inc.

这里是 *song_tag* 列在插入该行后在 mysql 中的样子:

metalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetal

它应该在哪里:

metal

这是 XML 原始数据:

<lfm status="ok">
<track>
<id>1003737</id>
<name>Whiskey in the Jar</name>
<mbid>664ae92a-f25a-4df4-a564-66ee87dff1c8</mbid>
<url>...</url>
<duration>303000</duration>
<streamable fulltrack="0">0</streamable>
<listeners>433263</listeners>
<playcount>3389216</playcount>
<artist>
<name>Metallica</name>
<mbid>65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab</mbid>
<url>http://www.last.fm/music/Metallica</url>
</artist>
<album position="9">
<artist>Metallica</artist>
<title>Garage, Inc.</title>
<mbid/>
<url>http://www.last.fm/music/Metallica/Garage,+Inc.</url>
<image size="small">http://userserve-ak.last.fm/serve/64s/54059755.png</image>
<image size="medium">http://userserve-ak.last.fm/serve/126/54059755.png</image>
<image size="large">http://userserve-ak.last.fm/serve/174s/54059755.png</image>
<image size="extralarge">http://userserve-ak.last.fm/serve/300x300/54059755.png
</image>
</album>
<toptags>
<tag>
<name>metal</name>
<url>http://www.last.fm/tag/metal</url>
</tag>
<tag>
<name>heavy metal</name>
<url>http://www.last.fm/tag/heavy%20metal</url>
</tag>
<tag>
<name>hard rock</name>
<url>http://www.last.fm/tag/hard%20rock</url>
</tag>
<tag>
<name>rock</name>
<url>http://www.last.fm/tag/rock</url>
</tag>
<tag>
<name>cover</name>
<url>http://www.last.fm/tag/cover</url>
</tag>
</toptags>
<wiki>...</wiki>
</track>
</lfm>

谢谢。

【问题讨论】:

    标签: php mysql xml foreach


    【解决方案1】:

    我不确定你为什么要连接字符串,我用你的代码做了试验,这似乎很好。只是在变量赋值时去掉了点,并为个人测试添加了 mysqli 代码。

    <?php
    
    error_reporting(E_ALL);
    
    // Connect
    $mysqli = new mysqli('localhost', 'root', '', 'dachi');
    
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    
    $artist = 'metallica';
    $title = 'whiskey in the jar';
    $xml = simplexml_load_file("test.xml") or die("Error: Cannot create object");
    
    $song_album = '';
    $song_imageURL = '';
    
    foreach($xml->track->children() as $track => $data){
        $song_album = $data->title; // I removed dot here
        $song_tag = $data->tag->name[0];
    
         // Remove dot if correct (can't understand just form this snippet why you concat)
        $song_imageURL .= $data->image[2];
    
        $xml = NULL;
    
        $stmt = $mysqli->prepare("INSERT INTO `test` (`test`) VALUES (?)");
        $stmt->bind_param('s', $song_album);
        $stmt->execute();
        $stmt->close();
    }
    
    ?>
    

    我也不确定你是否需要你声明的那些变量。

    请注意:

    如果你有$text = 'dachi';

    然后给$text .= 'boy';

    $text 则等于 'dachiboy'

    所以.= 用于连接,这就是你在循环中所做的。使用.= 将专辑名称分配给同一个变量,从而将它们加在一起。

    【讨论】:

    • 我删除了点并停止循环值,但我在 mySQL 数据库中添加了 12 次相同的歌曲,并且值位于不同的行中。如何仅在一行中插入数据?谢谢
    • 好的,所以如果一个问题是关于正确解析 XML 并为数据库做准备,那么请给出一个完整的 XML 文件并描述必须去哪个 mysql 表字段的数据。我很乐意为您提供帮助。
    【解决方案2】:

    你不能跳过整个循环,直接收集你需要的数据吗?比如:

      $xml = simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=$myAPIkey&artist=$artist&track=$title") or die("Error: Cannot create object");
    
      $song_album = $xml->track->title;
      $song_tag = $xml->track->tag[0]->name;
      $song_imageURL = $xml->track->image[2];
    

    【讨论】:

    • 我没有得到这个建议的数据
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多