Мне нужно создать уникальный анонимный индекс для каждого пользователя, для каждой темы. Каждое сообщение не начинается с этого индекса, но как только пользователь редактирует сообщение как анонимное, ему присваивается анонимный идентификатор. Это означает, что второй постер темы не всегда «Аноним 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