Как мне создать уникальный индекс для каждой темы? - PullRequest
0 голосов
/ 10 января 2019

Мне нужно создать уникальный анонимный индекс для каждого пользователя, для каждой темы. Каждое сообщение не начинается с этого индекса, но как только пользователь редактирует сообщение как анонимное, ему присваивается анонимный идентификатор. Это означает, что второй постер темы не всегда «Аноним 2».

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

Мне интересно, есть ли лучший способ хранить эти индексы и гарантировать, что нет повторяющихся чисел для пользователя, для темы? Должен ли я сделать отдельную таблицу? Может быть, использовать уникальное ограничение ..?

Я думал, что мог бы иметь стол с

-topic_id --- anon_index-

структура или что-то, но технически не было бы возможности повторения? И снова, я уже храню это в таблице других сообщений в своем собственном столбце, anonymous_index. Я мог бы просто найти max (anonymous_index), где $ topic_id = some # или что-то в этом роде, без необходимости создавать таблицу.

Я пытался создать против создания другой таблицы и использования максимального индекса анона или альтернативы (count (отличный (poster_id)), где anonymous_index> 0), которую я делаю, но, очевидно, что-то здесь не так.

Я вызываю функцию для получения анонимного индекса следующим образом:

$data = $event['data'];
$username = $event['post_author_name'];

// get checkbox value
$anonpost = $event['post_data']['is_checked'];

$post_mode = $event['mode'];
$data['is_anonymous'] = $anonpost;
$data['was_anonymous'] = ($post_mode == 'edit') ? $event['post_data']['is_anonymous'] : 0;
$data['anonymous_index'] = ($post_mode == 'edit') ? $event['post_data']['anonymous_index'] : 0;

// fixed to return 1 for new topics, and mean it this time... wouldn't work sometimes for some weird reason
$get_anon_index = function() use($data, $post_mode)
{
        if($data['is_anonymous'])
                if($data['anonymous_index'] > 0) return $data['anonymous_index'];
                else return $this->helper->get_poster_index($data['topic_id'], $data['poster_id']);

        // 0 is default case... is default case really necessary?
        return (int) ($post_mode == 'post');
};

$data['anonymous_index'] = $get_anon_index();

и вот функция get_poster_index в моем вспомогательном файле, которая выполняет работу sql:

// get unique poster index for consistent distinct anonymous posters
public function get_poster_index($topic_id, $poster_id)
{
    // have we already anonymously posted in this topic?
    // 0.7.0 - redundancy added (AND anonymous_index > 0)
    $anon_index_query = 'SELECT anonymous_index
                            FROM ' . POSTS_TABLE . "
                            WHERE topic_id = $topic_id
                            AND poster_id = $poster_id
                            AND anonymous_index > 0
                            ORDER BY post_time ASC LIMIT 1";

    $result = array();
    $result = $this->db->sql_query($anon_index_query);

    // these two get index of this post in that list
    $anonymous_index = (int) $this->db->sql_fetchfield('anonymous_index');

    $poster_index = $anonymous_index;
    $this->db->sql_freeresult($result);
    unset($result);

    // this only runs if we've never posted in this topic, having data from previous query...
    if($poster_index == 0)
    {
            $anon_index_query = 'SELECT COUNT(DISTINCT(poster_id)) AS anon_index
                                    FROM ' . POSTS_TABLE . "
                                    WHERE (topic_id = $topic_id AND anonymous_index > 0)
                                    OR (topic_id = $topic_id AND is_anonymous = 1)";

            $result = array();
            $result = $this->db->sql_query($anon_index_query);

            $poster_index = ((int) $this->db->sql_fetchfield('anon_index')) + 1;

            $this->db->sql_freeresult($result);
            unset($result);
    }

    return (($poster_index == 0) ? 1 : $poster_index);

Я сам проверил это, и все работает отлично Индексных повторов нет. Хотя на практике иногда два разных пользователя, размещающие анонимно в теме, имеют один и тот же анонимный индекс.

ожидается:

- post_id - - - user_id - - - is_anonymous - - - anonymous_index

1 12 верно 1

2 23 верно 2

3 12 верно 1

4 23 верно 2

5 34 верно 3

реальные результаты (как-то так):

- post_id - - - user_id - - - is_anonymous - - - anonymous_index

1 12 верно 1

2 12 верно 2

3 23 верно 2

4 12 правда 3

5 34 верно 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...