【问题标题】:Stuck on the logic of creating tags for posts (like SO tags) (PHP)坚持为帖子创建标签的逻辑(如 SO 标签)(PHP)
【发布时间】:2010-04-07 02:09:17
【问题描述】:

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

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

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

当用户输入帖子时,我将数据插入“帖子”表中。它会自动为每个帖子插入 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”)插入到“postingtags”表中? 我应该...

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

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

我在这里的逻辑被卡住了,所以如果有人可以帮我解释下一步,我将不胜感激!

有没有更简单的插入标签的方法?

【问题讨论】:

    标签: php mysql tags


    【解决方案1】:

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

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

    否则,当您插入到 posts 表时,确定最后使用的主键就成了问题。为此,您需要像这样调用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;
    

    我在这里的逻辑卡住了,所以如果有人能帮我解释下一步,我将不胜感激!
    你现在明白了吗?

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

    我的问题是如何将数组中的标签(“postingtag”)插入到“postingtags”表中?
    您的代码可以很好地完成工作,尽管我会将所有内容都作为准备好的语句来完成。准备好的语句可以防止 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();
    }
    

    【讨论】:

    • 谢谢比利。我会尽力按照你说的去做。我看看有没有问题:)
    • 我应该把 ? 留在那里吗?当我得到 $posting_id=$dbc->insert_id 时,我是否只使用你为最后一个 sn-p 编写的代码?
    • @ggfan:是的。对 bind_param 的调用会自动将问号替换为正确的数据。例如,请参阅php.net/manual/en/mysqli.prepare.php
    猜你喜欢
    • 2021-05-25
    • 2018-01-27
    • 1970-01-01
    • 2013-06-19
    • 2018-02-11
    • 2023-03-26
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多