Една и съща информация MYSQL

eddyy93

Registered
Здравейте интересува ме как мога да направя за всяка потребителска сесия да се отваря "лична база от данни" с предварително зададени критерии.

Тоест ако влезнат 2ма потребители и единия промени нещо в базата данни, това да не се отразява на другия потребител.

Мисля си за всяко ID на сесия на потребител да се генерира база от данни през PHP и след 10 - 15мин. неактивност да се трие, до тък добре обаче ако влезнат повече потребители, ще стане мазало от бази от данни и не мисля че е най - добрият вариант.

Това искам да го използвам за демо на PHP код, който използва база от данни.

Чрез sandbox ще стане, само че няма да е на моя комп., а в superhosting мисля че те не подържат такова нещо. За това търся други варианти.
 
По-добре направи отделна БД само за ДЕМО потребителите.
Всяка таблица на тази БД трябва да има FK с user_id-то на всеки демо потребител.

В последствие използвай този FK за да select-ираш, insert-ваш, update-ваш и delete-ваш това, което е направил.

Нека например системата ти има следната БД структура:
[sql]
users:
id int(11),
username varchar(32),
password varchar(32),
email varchar(115),
name varchar(255),
created_at TIMESTAMP,
updated_at TIMESTAMP

posts:
id int(11),
user_id int(11),
title varchar(255),
body text,
created_at TIMESTAMP,
updated_at TIMESTAMP

comments:
id int(11),

post_id int(11),
name varchar(255),
email varchar(115),
created_at TIMESTAMP,
updated_at TIMESTAMP[/sql]

Демо структурата ще бъде:
[sql]
demo_users:
id int(11),
username varchar(32),
password varchar(32),
created_at TIMESTAMP,
updated_at TIMESTAMP



users:
id int(11),
demo_user_id(id),
username varchar(32),
password varchar(32),
email varchar(115),
name varchar(255),
created_at TIMESTAMP,
updated_at TIMESTAMP

posts:
id int(11),
demo_user_id(id),
user_id int(11),
title varchar(255),
body text,
created_at TIMESTAMP,
updated_at TIMESTAMP

comments:
id int(11),
demo_user_id(id),
post_id int(11),
name varchar(255),
email varchar(115),
created_at TIMESTAMP,
updated_at TIMESTAMP[/sql]

И естествено заявките:

select * from users where demo_user_id = $_SESSION['demo_user_id']
select * from posts where demo_user_id = $_SESSION['demo_user_id']

итн..
 
Да идеята е добра, но да да се осъществи ще трябва много неща да преработя, самата система използва заявки за DROP, TRUNCATE и пресъздаване на таблици, което значително усложнява изпълнението на тази идея. Скоро време ще ми се наложи да измисля решение на проблема и за момента най - добре може би ще стане, като оставя само някой функции да се контролират от потребителите(тези със SELECT заявки само), на другите ще пиша че в демо вариант не работят и толкова. :))
 
Добре защо не направиш така:
1.Създаваш таблица в БД за сесиите (пр: sessid | ip | last_action)
2.Създаваш 1 скрипт, който include-ваш заедно с връзката към БД
Логиката на скрипта е следната:
2.1.Потребител влиза в сайта -> session_start()
-> SELECT sessid FROM sessions WHERE ip = $_SERVER['remote_addr']
Ако има резултат променяш id на сесията: session_id(sessions.sessid)
Ако няма резултат от заявката записваш сесията в БД: INSERT INTO sessions VALUES (session_id(), $_SERVER['remote_addr'], CURRENT_TIMESTAMP)
2.2.Ъпдейт на таблицата със сесиите при всяко зареждане: UPDATE sessions SET last_action = CURRENT_TIMESTAMP WHERE sessid = session_id()
3.Към всяка таблица която потребителя може да модифицира добавяш едно поле sid, в което при INSERT записваш id на текущата сесия
4.При всяка SELECT заявка добавяш в WHERE клаузата sid = $sid
5.Към скрипта от т.2 добавяш код, който да трие старите сесии и свързаните с тях записи:
5.1. SELECT sessid FROM sessions WHERE last_action < (CURRENT_TIMESTAMP - 3600) //За сесии неактивни повече от 1 час
5.2 Обхождаш с WHILE цикъл резултатите като към всяка таблица от т.3 изпълняваш: DELETE FROM table_name WHERE sid = sessions.sessid
5.3. Изтриваш и самите сесия от БД: DELETE FROM sessions WHERE last_action < (CURRENT_TIMESTAMP - 3600)

Още малко практични съвети:
-Включи също така разпознаване по user agent и/или бисквитка - може да имаш различни потребители с еднакъв IP адрес
-База данни, поддържаща референтна цялост би ти спестила т.5.1 и т.5.2 - при изтриване на запис от таблицата със сесиите ще се изтрият и свързаните записи в останалите таблици (което ще намали значително времето за изпълнение, особено ако цикъла трябва да обходи голям брой записи)
-Използването на framework би ти спестило цялата т.2 - повечето frameworks имат собствени класове за обслужване на сесиите и записването им в таблица в БД (пр: CodeIgniter)
-Ако обема на данните не е много голям може да обмислиш да ги записваш като обект или масив в самата сесия (или например в текстови файлове, обслужващи всяка отделна сесия), вместо да натоварваш MySQL с множество заявки. SQLite е добра идея ;)
Успех с начинанието
 

Back
Горе