坚持为帖子创建标签的逻辑(如SO标签)(PHP)

时间:2010-04-07 02:09:18

标签: php mysql tags

我被困在如何为我网站上的每个帖子创建标签。我不知道如何将标签添加到数据库中。 目前... 我有3张桌子:

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

Tags表只是标签的名称(例如:1 PHP,2 MySQL,3 HTML) 帖子(例如:1什么是PHP?,2什么是CSS?,3什么是HTML?) poststags显示了帖子和标签之间的关系。

当用户键入帖子时,我会将数据插入“发布”表格。它会自动为每个帖子插入posting_id(posts_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>';
    }

 ?>

我的问题是如何将数组中的标签(“poststag”)插入到我的“poststags”表中? 我应该......

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

1.在此查询中,如何获取帖子的posting_id值?

我坚持这里的逻辑,所以如果有人能帮助我解释下一步,我将不胜感激!

是否有更简单的方法来插入标签?

1 个答案:

答案 0 :(得分:2)

PostingTags是一个Many-To-Many映射表。您对所需数据的评估是正确的,但我不知道如何帮助您找到它。

1.在此查询中,如何获取帖子的posting_id值?
当用户选择标签时,您的应用程序是否不知道这一点?在为其分配标签之前,您需要知道实际编辑的帖子。这是一个用户选择标签的完全独立的页面吗?如果是,您需要在webform中创建一个隐藏字段,将posts_id从一个页面传递到下一个页面。

否则,它只会成为确定插入到postss表时使用的最后一个主键的问题。为此,您需要像这样致电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;

我坚持这里的逻辑,所以如果有人可以帮我解释下一步,我会很感激!
你明白了吗?

是否有更简单的方法来插入代码?
如果您希望您的用户能够在帖子中插入任意数量的标签,那就不是了。

我的问题是如何将数组中的标签(“poststag”)插入我的“poststags”表格?
你的代码可以很好地完成工作,不过我会做一切准备好的语句。准备好的语句可以防止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();
}