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 :: Как такое осуществить?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
antobra
Отправлено: 24 Декабря, 2010 - 13:47:15
Post Id


Посетитель


Покинул форум
Сообщений всего: 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 единичку к каждому идентификатору сообщения конкретного пользователя.

Спасибо за потраченное время и возможную помощь.
 
 Top
Мелкий Супермодератор
Отправлено: 24 Декабря, 2010 - 14:06:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Стандартная фича автоинкремента:
делается поле (как правило, числовое), например, id человека.
делается второе поле, автоинкремент - счётчик сообщений
(ну и др. поля)
Ключ делается составной на оба поля.

Тогда у каждого пользователя будет свой счётчик сообщений Подмигивание


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 24 Декабря, 2010 - 14:17:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




antobra пишет:
Из этого можно понять, что для каждого пользователя существует свой порядок нумерации его личных сообщений.
Для осуществления возможности создания уникальной системы нумерации сообщения для каждого из зарегистрированных пользователей предполагающей включение порядка увеличение номеров в разделенном режиме - возможно использование схемы основанной на ключевых идентификаторов генерируемых специальным образом - БД поддерживает возможность использования в качестве ключевого поискового элемента произвольное текстовое информационное поле которое по содержимому является однозначно предстаимым в виде длинного числа - в таком случае реальный идентификатор сообщения может быть основан на принципе user_id*N+mess_id - где N являтеся заранее определенным числом гарантированно превывающим допустимое число сообщений


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
antobra
Отправлено: 24 Декабря, 2010 - 14:49:32
Post Id


Посетитель


Покинул форум
Сообщений всего: 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 получат одно и тоже значение, т.е. просто порядковый номер. А в чем секрет? Как сделать запись новых строк правильным? Улыбка
 
 Top
Мелкий Супермодератор
Отправлено: 24 Декабря, 2010 - 15:26:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




antobra пишет:
id - это auto_increment, создающий автоматически нумерацию всех новых полей по возрастанию.

id - статичный в рамках этой таблицы, не автоинкремент, берётся откуда-то ещё - как правило как автоинкремент другой таблицы (пользователей, например)

т.е. получается так:
id_user - id пользователя
id_message - автоинкремент, счётчик сообщений
первичный ключ на оба поля (составной, если пользоваться терминологией реляционных баз данных)
text, date

Меня в данной ситуации путает, как вы реализовали обмен сообщений - обмен сообщениями-то между двумя пользователями...

Ладно, сейчас на чём-нибудь попроще объясню, например. заметки:
Каждый пользователь может создавать заметки, при том, нумерация у каждого своя:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `zametki` (
  2.   `id_user` int(11) NOT NULL,
  3.   `id_z` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  4.   `date` datetime NOT NULL,
  5.   `text` text collate utf8_unicode_ci NOT NULL,
  6.   PRIMARY KEY  (`id_user`,`id_z`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

Тогда запрос на добавление заметки для пользователя с id=1 выглядит так:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `zametki` (`id_user` ,`date` ,`text` ) VALUES (1 , NOW( ) , 'текст заметки');

Замечу, что поле `id_z` я опустил за ненадобностью, ему самому присвоят значение.
А для добавления заметки пользователю с id=2 используется такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `zametki` (`id_user` ,`date` ,`text` ) VALUES (2 , NOW( ) , 'текст заметки');

Получается, что id пользователя должен быть известен заранее, но обычно так и есть.


-----
PostgreSQL DBA
 
 Top
antobra
Отправлено: 24 Декабря, 2010 - 15:42:21
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Угу.

А разве тут
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `zametki` (`id_user` ,`date` ,`text` ) VALUES (1 , NOW( ) , 'текст заметки');


не должно быть так:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `zametki` (`id_user`, 'id_z' ,`date` ,`text` ) VALUES (1 , NOW( ) , 'текст заметки');
 
 Top
Мелкий Супермодератор
Отправлено: 24 Декабря, 2010 - 16:04:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Специально заметку приписал:
Мелкий пишет:
Замечу, что поле `id_z` я опустил за ненадобностью, ему самому присвоят значение.


А если его писать, то и значение ему какое-то надо выдать, иначе будет ошибка парсера:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `zametki` (`id_user`, 'id_z' ,`date` ,`text` ) VALUES (1 , NULL , NOW( ) , 'текст заметки');

Автоинкрементное поле не обязательно указывать в запросе, ему и так присвоят номер.

(Отредактировано автором: 24 Декабря, 2010 - 16:04:36)



-----
PostgreSQL DBA
 
 Top
antobra
Отправлено: 25 Декабря, 2010 - 08:30:34
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




не внимателен(

Спасибо, займусь разбором.
 
 Top
JustUserR
Отправлено: 25 Декабря, 2010 - 16:54:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




antobra Для осуществления хранения уникального номера сообщения с локальной индексацией для каждого из пользователей системы возможно использование схемы - основанной на упаковке ключвых параметоров в единое информационное полей формируемое в целочисленной длинной константе - в таком случае применение операции модуля от деления и целочисленного деления позволяет обеспечить извлечение трбемых компонентов
Использование такой схемы является очевидным решением для множества случаев - так хранение локального системного времени осуществляется в виде общей целочисленной timestamp-константы - в то время как все интервальные элементы даты/времени является указываемыми для текущей области предоставления информации


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
antobra
Отправлено: 06 Января, 2011 - 16:35:56
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Друзья, а в одной таблице больше 2ух auto_increment нельзя сделать?
 
 Top
JustUserR
Отправлено: 06 Января, 2011 - 21:20:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




antobra пишет:
Друзья, а в одной таблице больше 2ух auto_increment нельзя сделать?
Для осуществления определения произвольных определяемых пользователем SQL-операций при обеспечении выполнения ассоциированных действий с текущей базой данных - возможно использования механизма триггеров позволяющих осуществить включение произвольных SQL-операций для фиксированных информационных полей таких как столбцы данных с потенциальным автоматическим инкрементом


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB