Как сохранить теги/ключевые слова из массива в базу данных с помощью php?

Я видел этот вопрос: как сохранить теги (ключевые слова) в базе данных?

Хороший ответ о том, как должна быть структурирована база данных. Но как лучше сделать процесс сохранения в php? Процесс, который обрабатывает как добавление, так и удаление.

Ключевые слова публикуются в виде массива.

Изменить. Текущий код выглядит так:

<?php
    $new = explode(',', $_POST['tags']);

    $query = mysql_query("SELECT * FROM pages_tags WHERE page_id = '".$page_id."'") or die(mysql_error());
    while ($row = mysql_fetch_array($query))
    {
    $old[] = $row['tag'];
    }

    $tags_to_add    = array_diff($new, $old);
    $tags_to_remove = array_diff($old, $new);

    if (is_array($tags_to_add))
    {
    foreach ($tags_to_add as $add_tag) { $insert_tags[] = "('".$add_tag."', '".$page_id."')"; }
    $sql_insert_tags = "INSERT INTO pages_tags (tag, page_id) VALUES ".implode(',', $insert_tags);
    mysql_query($sql_insert_tags) or die(mysql_error());
    }

    if (is_array($tags_to_remove))
    {
    foreach ($tags_to_remove as $remove_tag) { $delete_tags[] = "('".$remove_tag."')"; }
    $sql_delete_tags = "DELETE FROM pages_tags WHERE page_id = '".$page_id."' AND tag IN (".implode(',', $delete_tags).")";
    mysql_query($sql_delete_tags) or die(mysql_error());
    }
?>

person Peter Westerlund    schedule 21.05.2011    source источник


Ответы (1)


Предлагаю выбрать текущие теги и после можно сделать:

$tags_to_add = array_diff($new, $old);
$tags_to_remove = array_diff($old, $new);

После этого вы пишете 2 тривиальных запроса: один для массовой вставки и один для удаления.

person zerkms    schedule 21.05.2011
comment
@zerkms Этот ответ был действительно интересным. Итак, я начинаю с сохранения тегов сообщений и тегов из базы данных в виде каждого массива? А затем сначала запустите цикл while из базы данных и сопоставьте с $tags_to_add и добавьте их, которых еще нет, в базу данных. Затем выполните новый цикл базы данных, чтобы соответствовать удаляемым тегам? - person Peter Westerlund; 21.05.2011
comment
@Peter Westerlund: массовая вставка: INSERT INTO table (field) VALUES ('val1'), ('val2'), .... Удалить DELETE FROM table WHERE field IN ('val1', 'val2', ...). Таким образом, вам нужно всего 2 запроса. Но сначала вам нужно запросить все существующие в настоящее время теги ($old) и сравнить их с $new. - person zerkms; 21.05.2011
comment
@zerkms Нужно ли иметь все таблицы «posts», «tags» и «post_tags»? Это немного саботирует это, потому что я хочу, чтобы строка тега из тегов таблицы автоматически исчезала, если с этим тегом не осталось сообщений. - person Peter Westerlund; 21.05.2011
comment
@Peter Westerlund: по какой причине? - person zerkms; 21.05.2011
comment
@zerkms Потому что мне нужен еще один запрос после каждой итерации цикла тегов, который проверяет, остались ли еще какие-либо из этих тегов в таблице «post_tag», и если их нет, то выполняется еще один запрос для удаления тега из «tag». Таблица. - person Peter Westerlund; 21.05.2011
comment
@ Питер Вестерлунд: нет. Пусть однажды добавленный тег будет храниться бесконечно. - person zerkms; 21.05.2011
comment
@Peter Westerlund: этот код должен работать. В любом случае, не вижу смысла очищать теги. - person zerkms; 22.05.2011
comment
@zerkms Например, если вы пишете неправильно. Мне не нужны ненужные данные в базе данных. Я хочу, чтобы он функционировал оптимально. - person Peter Westerlund; 22.05.2011
comment
@Peter Westerlund: 1 слово не оптимально. Даже если будет 10к устаревших элементов - вы не измерите разницу в производительности, если вы правильно настроили свои индексы. В любом случае, если вы этого хотите (ужасная идея) - вы можете создать триггер для подсчета действительно используемых в настоящее время тегов и удалить те, у которых 0 записей, по планировщику. - person zerkms; 22.05.2011
comment
@zerkms На мой взгляд, каждая бессмысленная строка в базе данных — пустая трата места. Я думаю, что у нас разные взгляды на то, что означает оптимум. В любом случае, да, я хочу, чтобы тег также исчез из таблицы «теги». Я лучше сделаю это прямо, но как можно быстрее. - person Peter Westerlund; 22.05.2011
comment
@Peter Westerlund: я уже дал вам представление о том, как их очистить (и я все еще думаю, что это пустая трата ресурсов. И да, я работаю с базами данных размером более 500 ГБ). - person zerkms; 22.05.2011
comment
@zerkms Я не думаю, что мы пойдем дальше этого. Спасибо за решение о том, как сохранить данные. Остальное могу узнать сам. Или создайте новый вопрос. - person Peter Westerlund; 22.05.2011
comment
@Peter Westerlund: я уже дал представление, как сделать все остальное ;-) Считать с помощью триггеров и очищать по планировщику. - person zerkms; 22.05.2011
comment
@zerkms Хорошо, извини, я не совсем понимаю твой ответ. Не могли бы вы уточнить это немного? - person Peter Westerlund; 22.05.2011
comment
@Peter Westerlund: создайте триггеры ON DELETE и ON INSERT в таблице отношений. В обоих триггерах обновите поле cnt в таблице tags до текущего количества вхождений текущего тега. - person zerkms; 22.05.2011
comment
@zerkms Думаю, теперь я понимаю. Я создаю новый столбец в таблице тегов под названием «количество». И обновлять его одновременно с вставкой или удалением тега в таблице отношений? Довольно умно на самом деле =) - person Peter Westerlund; 22.05.2011
comment
@ Питер Вестерлунд: да. И удалять раз в день (неделю, сколько угодно) те, что с 0 - person zerkms; 22.05.2011
comment
@zerkms Ну, мне это не нравится. Хотите, чтобы это было сделано напрямую. Думаю, я делаю это сразу после первого процесса. Это ужасно неправильно? - person Peter Westerlund; 22.05.2011
comment
@Peter Westerlund: вы говорите об эффективности, но хотите проделать бесполезную работу по редактированию каждого тега. Разве это не звучит странно? Выполнять работу 1 раз в день эффективнее, чем делать ее 100 тысяч раз в день. Вы так не думаете? - person zerkms; 23.05.2011