Несколько недель бьюсь над задачей: нужно создать BB-код, который бы выводил заданное количество случайных целых чисел в некотором промежутке. Он должен выглядеть примерно вот так:
[rand]3 from 1 to 100[/rand]
Если в скрипте просто использовать функцию mt_rand() или rand(), то возникает проблема: выпавшие значения сохраняются на какое-то время, но после обновления кэша они меняются, т.к. парсер заново обрабатывает текст сообщения и заново генерирует случайные числа.
Чтобы избежать этого, можно задать исходное число для генератора случайных чисел (seed), тогда каждый раз последовательность случайных чисел будет одной и той же. При этом для каждого форумного поста это исходное число должно быть уникальным. Было бы идеально для этого брать ID поста. Есть ли какой-нибудь способ, как в класс кастомного BB-кода можно вытянуть ID поста, текст которого сейчас обрабатывается?
Какие были идеи:
1) Можно было бы попробовать сделать запрос к базе данных типа
SELECT pid FROM posts WHERE post = $txt;
где $txt - текст поста, подающийся для парсинга в класс BB-кода. Однако текст для парсинга BB-кода и текст поста в базе данных отличаются друг от друга, надо будет его дополнительно обрабатывать, это проблематично.
2) Можно было бы попробовать через $request. Если создается новый пост (или топик), то выясняем это через через значение поля "do", и тогда ID нового поста можно узнать через запрос к базе данных:
SELECT MAX[pid] FROM posts;
к которому прибавляем единицу. Но мне непонятно, насколько это долговечный способ и что будет с итоговыми случайными значениями при обновлении кэша. Возможно, этот способ можно скомбинировать с каким-то другим: при создании поста делаем так, а потом добываем ID поста как-то иначе.
3) Можно было бы попробовать передавать ID поста из класса в класс через сигнатуры методов с самого начала, но тут надо хорошо разбираться в устройстве форума, чтобы ничего не поломать.
Может быть, у этой задачи есть какое-то простое и элегантное решение? Может быть, можно вообще не заморачиваться с определением ID поста и брать какое-нибудь другое уникальное число?
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Добрый день!
Несколько недель бьюсь над задачей: нужно создать BB-код, который бы выводил заданное количество случайных целых чисел в некотором промежутке. Он должен выглядеть примерно вот так:
[rand]3 from 1 to 100[/rand]Если в скрипте просто использовать функцию mt_rand() или rand(), то возникает проблема: выпавшие значения сохраняются на какое-то время, но после обновления кэша они меняются, т.к. парсер заново обрабатывает текст сообщения и заново генерирует случайные числа.
Чтобы избежать этого, можно задать исходное число для генератора случайных чисел (seed), тогда каждый раз последовательность случайных чисел будет одной и той же. При этом для каждого форумного поста это исходное число должно быть уникальным. Было бы идеально для этого брать ID поста. Есть ли какой-нибудь способ, как в класс кастомного BB-кода можно вытянуть ID поста, текст которого сейчас обрабатывается?
Какие были идеи:
1) Можно было бы попробовать сделать запрос к базе данных типа
где $txt - текст поста, подающийся для парсинга в класс BB-кода. Однако текст для парсинга BB-кода и текст поста в базе данных отличаются друг от друга, надо будет его дополнительно обрабатывать, это проблематично.
2) Можно было бы попробовать через $request. Если создается новый пост (или топик), то выясняем это через через значение поля "do", и тогда ID нового поста можно узнать через запрос к базе данных:
к которому прибавляем единицу. Но мне непонятно, насколько это долговечный способ и что будет с итоговыми случайными значениями при обновлении кэша. Возможно, этот способ можно скомбинировать с каким-то другим: при создании поста делаем так, а потом добываем ID поста как-то иначе.
3) Можно было бы попробовать передавать ID поста из класса в класс через сигнатуры методов с самого начала, но тут надо хорошо разбираться в устройстве форума, чтобы ничего не поломать.
Может быть, у этой задачи есть какое-то простое и элегантное решение? Может быть, можно вообще не заморачиваться с определением ID поста и брать какое-нибудь другое уникальное число?