Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как такое осуществить?
Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010
Помог: 1 раз(а)
Коллеги Прошу помочь разобраться в следующей ситуации. Помощь заключается не в конкретном коде, а логике. Мне нужно понять как это происходит.
Допустим, есть скрипт, который позволяет регистрировать пользователей, входить в аккаунт и т.п. Так же присутствует функция обмена личными сообщениями между пользователями внутри данного сайта.
В скрипте используется следующая схема отображения вышеупомянутых личных сообщений: name.ru/messages.php?id=1. Думаю всем ясно, что скрипт извлекает из GET номер и ищет по базе по столбцу id и отображает соответствующие данные. Но тут возникает проблема: пользователей много и все сообщения между ними записываются по auto_increment в столбце "id" 0от 1 и т.д. Т.е. любой пользователь видя id может сказать сколько уже было сообщений в системе, что конечно очень плохо и не профессионально.
Посмотрев на все другие сайты и даже такие как vkontakte.ru они используют такое:
Первое личное сообщение будет отображаться так: vkontakte.ru/mail.php?act=show&id=1
Второе - vkontakte.ru/mail.php?act=show&id=2
и т.д.
Из этого можно понять, что для каждого пользователя существует свой порядок нумерации его личных сообщений.
Как осуществить подобное? Я про логику - как это осуществляется. Не приплюсовывать же через UPDATE единичку к каждому идентификатору сообщения конкретного пользователя.
Спасибо за потраченное время и возможную помощь.
Мелкий
Отправлено: 24 Декабря, 2010 - 14:06:30
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Стандартная фича автоинкремента:
делается поле (как правило, числовое), например, id человека.
делается второе поле, автоинкремент - счётчик сообщений
(ну и др. поля)
Ключ делается составной на оба поля.
Тогда у каждого пользователя будет свой счётчик сообщений
----- PostgreSQL DBA
JustUserR
Отправлено: 24 Декабря, 2010 - 14:17:59
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
antobra пишет:
Из этого можно понять, что для каждого пользователя существует свой порядок нумерации его личных сообщений.
Для осуществления возможности создания уникальной системы нумерации сообщения для каждого из зарегистрированных пользователей предполагающей включение порядка увеличение номеров в разделенном режиме - возможно использование схемы основанной на ключевых идентификаторов генерируемых специальным образом - БД поддерживает возможность использования в качестве ключевого поискового элемента произвольное текстовое информационное поле которое по содержимому является однозначно предстаимым в виде длинного числа - в таком случае реальный идентификатор сообщения может быть основан на принципе user_id*N+mess_id - где N являтеся заранее определенным числом гарантированно превывающим допустимое число сообщений
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
antobra
Отправлено: 24 Декабря, 2010 - 14:49:32
Посетитель
Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010
Помог: 1 раз(а)
Мелкий пишет:
Стандартная фича автоинкремента:
делается поле (как правило, числовое), например, id человека.
делается второе поле, автоинкремент - счётчик сообщений
(ну и др. поля)
Ключ делается составной на оба поля.
Тогда у каждого пользователя будет свой счётчик сообщений
Правильно ли я понял, например будет такая таблица:
id | id_message | user | text | date | time
последние четыре столбца - все понятно
id - это auto_increment, создающий автоматически нумерацию всех новых полей по возрастанию.
id_message - будет auto_inccrement конкретного сообщения, который так же создается автоматически.
Как посылать запрос на запись, чтобы во втором столбце прописывалась нужная нумерация для конкретного пользователя?
Если например сделать запрос:
$bd = mysqk_query("INSERT INTO table ('user', 'text', 'date', 'time') VALUES ('$user', '$text', '$date', '$time') ");
то это будет простой запрос и в этом случае в id и id_message получат одно и тоже значение, т.е. просто порядковый номер. А в чем секрет? Как сделать запись новых строк правильным?
Мелкий
Отправлено: 24 Декабря, 2010 - 15:26:39
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
antobra пишет:
id - это auto_increment, создающий автоматически нумерацию всех новых полей по возрастанию.
id - статичный в рамках этой таблицы, не автоинкремент, берётся откуда-то ещё - как правило как автоинкремент другой таблицы (пользователей, например)
т.е. получается так:
id_user - id пользователя
id_message - автоинкремент, счётчик сообщений
первичный ключ на оба поля (составной, если пользоваться терминологией реляционных баз данных)
text, date
Меня в данной ситуации путает, как вы реализовали обмен сообщений - обмен сообщениями-то между двумя пользователями...
Ладно, сейчас на чём-нибудь попроще объясню, например. заметки:
Каждый пользователь может создавать заметки, при том, нумерация у каждого своя:
Замечу, что поле `id_z` я опустил за ненадобностью, ему самому присвоят значение.
А для добавления заметки пользователю с id=2 используется такой запрос:
Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010
Помог: 1 раз(а)
не внимателен(
Спасибо, займусь разбором.
JustUserR
Отправлено: 25 Декабря, 2010 - 16:54:55
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
antobra Для осуществления хранения уникального номера сообщения с локальной индексацией для каждого из пользователей системы возможно использование схемы - основанной на упаковке ключвых параметоров в единое информационное полей формируемое в целочисленной длинной константе - в таком случае применение операции модуля от деления и целочисленного деления позволяет обеспечить извлечение трбемых компонентов
Использование такой схемы является очевидным решением для множества случаев - так хранение локального системного времени осуществляется в виде общей целочисленной timestamp-константы - в то время как все интервальные элементы даты/времени является указываемыми для текущей области предоставления информации
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
antobra
Отправлено: 06 Января, 2011 - 16:35:56
Посетитель
Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010
Помог: 1 раз(а)
Друзья, а в одной таблице больше 2ух auto_increment нельзя сделать?
JustUserR
Отправлено: 06 Января, 2011 - 21:20:13
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
antobra пишет:
Друзья, а в одной таблице больше 2ух auto_increment нельзя сделать?
Для осуществления определения произвольных определяемых пользователем SQL-операций при обеспечении выполнения ассоциированных действий с текущей базой данных - возможно использования механизма триггеров позволяющих осуществить включение произвольных SQL-операций для фиксированных информационных полей таких как столбцы данных с потенциальным автоматическим инкрементом
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.