Застрял в логике создания тегов для сообщений (например, теги SO) (PHP) - PullRequest
1 голос
/ 07 апреля 2010

Я застрял на том, как создавать теги для каждого поста на моем сайте. Я не уверен, как добавить теги в базу данных. В настоящее время... У меня есть 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 сообщения?

Я застрял здесь в логике, поэтому, если кто-то может помочь мне объяснить следующий шаг, я был бы признателен!

Есть ли более простой способ вставки тегов?

1 Ответ

2 голосов
/ 07 апреля 2010

PostingTags - это таблица сопоставления Many-To-Many .Вы правы в оценке нужных вам данных, но я не понимаю, как мы можем помочь вам их найти.

1. В этом запросе как получить значение posting_id дляpost?
Разве ваше приложение не знает об этом, когда пользователь выбирает теги?Вам нужно будет узнать, какое сообщение на самом деле редактируется, прежде чем вы сможете присвоить ему теги.Это совершенно отдельная страница, где пользователь выбирает теги?Если это так, вам нужно создать скрытое поле в вашей веб-форме, которое передает 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;

Я застрял здесь в логике, поэтому, если кто-то может помочь мне объяснить следующий шаг, Я был бы признателен!
Теперь вы понимаете?

Есть ли более простой способ вставить теги?
Нет, если вы хотите, чтобы ваши пользователи могливставить произвольное количество тегов в сообщение.

Мой вопрос: как мне вставить теги в массиве ("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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...