使用PDO将json文件导入MySQL时如何处理标签?

时间:2016-08-12 02:07:34

标签: php mysql json pdo

我似乎无法找到任何参考或示例(或者我没有找到正确的位置)来获取有关处理标签的信息。更具体地说,使用PHP / PDO将标签导入MySQL。我可以导入所有单值字段但无法找到如何处理标记,因为每个记录的标记数量各不相同。处理这个问题的最佳方法是什么?

我设置了我的数据库......

enter image description here

示例JSON数据......

{
    "name": "Google", 
    "uri": "https://www.google.com", 
    "description": "The largest and most popular search engine in the world",
    "tags": ["search", "web apps", "adwords"],
}, 
{
    "name": "NFL", 
    "uri": "https://www.nfl.com", 
    "description": "The National Football League",
    "tags": ["sports", "football"],
}, 
{
    "name": "CNN", 
    "uri": "https://www.cnn.com", 
    "description": "Cable News Network",
    "tags": [],
},

这是我用来导入单值字段的PHP / PDO代码......

$jsondata = file_get_contents('http://www.somewebsite/?format=json');
$data = json_decode($jsondata, true);

$stmt = $db->prepare("insert into bookmark values(?,?,?)");

foreach ($data as $row) {
    $stmt->bindParam(1, $row['name']);
    $stmt->bindParam(2, $row['uri']);
    $stmt->bindParam(3, $row['description']);
    $stmt->execute();
}

3 个答案:

答案 0 :(得分:1)

你有正确的想法,创建一个标签表,然后是书签和标签之间的地图。

我要做的是,从json字符串中爆炸或者json_decode标记值。 遍历数组并检查当前标记是否在tags表中,如果是,则将关系添加到地图中,如果没有,则插入标记,然后将关系插入到地图中。

(这样做可以确保您在标签表中只有一个标签副本。)

答案 1 :(得分:0)

$data = json_decode($jsondata, true);

foreach ($data as $row) {
    //insert new bookmark
    $sth_bkmk = $db->prepare('INSERT INTO bookmark(name, uri, description) VALUES (?, ?, ?)');
    $sth_bkmk->execute(array($row['name'], $row['uri'], $row['desc..']));
    save_tags($db->lastInsertId(), $row['tags']);
}

function save_tags($bkmk_id, $tags) {
    if (!$bkmk_id || !$tags) return;
    foreach ($tags as $tag) {
        //check if tag already exists
        $sth_tag = $db->prepare('SELECT id FROM tag WHERE name=?');
        $sth_tag->execute(array($tag));
        $tag_id = $sth_tag->fetch(PDO::FETCH_ASSOC);
        if (!$tag_id) {
            $sth_tag = $db->prepare('INSERT INTO tag(name) VALUES(?)');
            $sth_tag->execute(array($tag));
            $tag_id['id'] = $db->lastInsertId();
        }
        //insert new tagmap
        $sth_tagmap = $db->prepare('INSERT INTO tagmap(bookmark_id, tag_id) VALUES(?, ?)');
        $sth_tagmap->execute(array($bkmk_id, $tag_id['id']));
    }
}

答案 2 :(得分:0)

确定插入标记到MySql中,您可以执行以下操作:

insert_tags($tags);

$tags自然会是一个数组,需要一个循环。

insert_tags($tags)的SQL看起来与此类似:

INSERT IGNORE INTO代码(tag) VALUES (:tag);

IGNORE关键字是为了不插入重复项。比方说,有人多次使用'糖果'作为标签。

在上面转到这样的函数之后:tag_*()星号(*)是一个你可以提供的名称,对你的应用程序有意义。例如tag_photo()tag_article()

我们以tag_photo()为例,假设您有photos的表格。此功能应采用照片的主ID和用于标记照片的标签。像这样tag_photo($photo_id, array $tags)

注意:在调用此函数之前必须调用insert_tags()

tag_photo()会做以下几行。

  1. 获取所有插入的$tags的ID insert_tags()
  2. 将其另存为数组$ids
  3. 循环$ids将值插入到名为的中间表中 tagged_photos用于链接两个表格photostags 你的情况是tagmap
  4. SQL看起来像这样:

    INSERT INTO {tagged_photos {1}}

    您可以先使用(photo_id, tag_id) VALUES (:photo_id, :tag_id)数组遍历此SQL语句。

    $idsinsert_tags()在函数中是有意义的。在您的情况下tag_photo()。在bookmark()中,您需要使用主ID,然后才能调用bookmark()insert_tags()