我似乎无法找到任何参考或示例(或者我没有找到正确的位置)来获取有关处理标签的信息。更具体地说,使用PHP / PDO将标签导入MySQL。我可以导入所有单值字段但无法找到如何处理标记,因为每个记录的标记数量各不相同。处理这个问题的最佳方法是什么?
我设置了我的数据库......
示例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();
}
答案 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()
会做以下几行。
$tags
的ID
insert_tags()
$ids
$ids
将值插入到名为的中间表中
tagged_photos
用于链接两个表格photos
和tags
你的情况是tagmap
。SQL看起来像这样:
INSERT INTO
{tagged_photos {1}}
您可以先使用(photo_id, tag_id) VALUES (:photo_id, :tag_id)
数组遍历此SQL语句。
$ids
和insert_tags()
在函数中是有意义的。在您的情况下tag_photo()
。在bookmark()
中,您需要使用主ID,然后才能调用bookmark()
和insert_tags()
。