2016-08-12 93 views
0

我似乎無法找到任何參考或示例(或者我沒有在正確的位置尋找)處理標籤的信息。更具體地說,使用PHP/PDO將標籤導入MySQL。我可以導入所有單值字段,但無法找到如何處理標籤,因爲每條記錄的標籤數量有所不同。處理這個問題的最好方法是什麼?如何使用PDO將json文件導入到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(); 
} 
+0

導入標籤?你打算創建一個標籤系統嗎? –

回答

1

你有正確的想法,創建一個標籤表, n書籤和標籤之間的映射。

我會做什麼,爆炸或從json字符串json_decode標記值。 遍歷數組並檢查當前標記是否在變量表中,如果是,則將關係添加到地圖中,如果沒有,則插入標記,然後將關係插入到地圖中。

(做這種方式可以確保你永遠只能在標籤表中標籤的一個副本。)

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'])); 
    } 
} 
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. 插入與 insert_tags()
  2. 保存此作爲數組$ids
  3. 遍歷$ids值插入一箇中間表的所有$tags獲取的ID叫 tagged_photos這兩個錶鏈接photostags,在 你的情況是tagmap

的SQL會是這個樣子:

INSERT INTO tagged_photos (photo_id, tag_id) VALUES (:photo_id, :tag_id)

您將通過使用$ids陣列前面這個SQL語句循環。

這是有道理的,insert_tags()tag_photo()是在一個函數。在你的情況bookmark()。在bookmark()您需要主ID才能撥打insert_tags()tag_*,因爲您需要它。

相關問題