2010-04-07 22 views
1

我被困在如何爲我的網站上的每個帖子創建標籤。我不知道如何將標籤添加到數據庫中。 目前... 我有3個表:陷入爲帖子創建標籤的邏輯(如SO標籤)(PHP)

+---------------------+ +--------------------+ +---------------------+ 
| Tags    | | Posting   | | PostingTags   | 
+---------------------+ +--------------------+ +---------------------+ 
| + TagID    | | + posting_id  | | + posting_id  | 
+---------------------+ +--------------------+ +---------------------+ 
| + TagName   | | + title   | | + tagid    | 
+---------------------+ +--------------------+ +---------------------+ 

的標籤表的標籤(例如:1個PHP,MySQL的2,3 HTML)的只是名字 過賬(例如:1什麼是PHP ?,2什麼是CSS?3什麼是HTML?) poststags顯示了發佈與標籤之間的關係。

當用戶輸入發帖時,我將數據插入到「發佈」表中。它會自動插入每個帖子的posting_id(posting_id是主鍵)。

$title = mysqli_real_escape_string($dbc, trim($_POST['title'])); 
    $query4 = "INSERT INTO posting (title) VALUES ('$title')"; 
    mysqli_query($dbc, $query4); 

然而,如何爲每個帖子插入標籤? 當用戶填寫表格時,所有可用標籤都會有一個複選框區域,並檢查他們想要的任何標籤。 (我不是在做用戶輸入他們想要的標籤的地方)

這顯示每個標籤與一個複選框。當用戶檢查每個標籤時,它將被存儲在名爲「postingtag []」的數組中。

<label class="styled">Select Tags:</label> 
    <?php 

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
$query5 = "SELECT * FROM tags ORDER BY tagname"; 
$data5 = mysqli_query($dbc, $query5); 
while ($row5 = mysqli_fetch_array($data5)) { 
    echo '<li><input type="checkbox" name="postingtag[]" 
     value="'.$row5['tagname'].'" ">'.$row5['tagname'].'</li>'; 
    } 

?> 

我的問題是如何將數組中的標籤(「postingtag」)插入到我的「poststags」表中? 我應該......

$postingtag = $_POST["postingtag"]; 
foreach($postingtag as $value){ 
$query5 = "INSERT INTO postingtags (posting_id, tagID) 
       VALUES (____, $value)"; 
mysqli_query($dbc, $query5); 
}  

1.In此查詢,我怎麼得到這個職位的posting_id價值?

我被困在這裏的邏輯,所以如果有人能幫我解釋下一步,我將不勝感激!

是否有更簡單的方法來插入標籤?

回答

2

PostingTags是Many-To-Many映射表。您對所需數據的評估是正確的,但我看不出我們如何幫助您找到它。

1.在此查詢中,如何獲取帖子的posts_id值?
當用戶選擇標籤時,您的應用程序不知道這一點嗎?在爲其分配標籤之前,您需要知道實際正在編輯的帖子。這是一個完全獨立的頁面,用戶在選擇標籤嗎?如果是這樣,您需要在您的網頁表單中創建一個隱藏字段,以將posting_id從一個頁面傳遞到另一個頁面。

否則,它只是成爲確定插入張貼表時使用的最後一個主鍵的問題。對於這一點,你需要調用mysqli::insert_id這樣的:

//This is the first snippet of code you posted 
$title = mysqli_real_escape_string($dbc, trim($_POST['title'])); 
$query4 = "INSERT INTO posting (title) VALUES ('$title')"; 
mysqli_query($dbc, $query4); 
$posting_id = $dbc->insert_id; 

我被困在這裏的邏輯,因此,如果有人可以幫我解釋一下,下一步,我將不勝感激!
你現在明白嗎?

有沒有簡單的方法來插入標籤?
如果您希望用戶能夠向帖子中插入任意數量的標籤,請不要使用此功能。

我的問題是如何將數組中的標籤(「張貼標籤」)插入到我的「張貼標籤」表中?
你的代碼可以很好地完成工作,但我會盡全力做好準備的陳述。準備好的語句可以防止SQL注入攻擊,因此您不必記住要轉到查詢中的所有內容。這也是一個做事的少得多的詳細方式:

//This is the last snippet of code you posted 
//Populate postid as specified in the first part of this answer. 
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
foreach($postingtag as $tag) { 
    $sql = 'INSERT INTO postingtags (posting_id, tagID) VALUES (?, ?);'; 
    $insertStatement = $dbc->prepare($sql); 
    $insertStatement->bind_param('ii', $postid, $tag); 
    $insertStatement->execute(); 
} 
+0

謝謝比利。我會盡力去做你說的。我會看看是否有任何問題:) – ggfan 2010-04-07 02:41:07

+0

我應該保留在那裏嗎?當我得到$ posting_id = $ dbc-> insert_id時,是否僅使用您爲最後一段代碼編寫的內容? – ggfan 2010-04-07 02:43:26

+0

@ggfan:是的。對bind_param的調用會自動用正確的數據替換問號。有關示例,請參閱http://www.php.net/manual/en/mysqli.prepare.php – 2010-04-07 02:51:20

-2

您應該使用數組格式存儲選定變量的值,這樣你就可以轉換成JSON,並將其存儲在數據庫中。

我希望這會有所幫助。