Съвети за структура

Styl3rbg

Registered
Имам един недовършен форум и за пореден път се каня да го завърша.
Трябва ми идея за структурата на таблицата или по-точно с частта за прегледани теми и прочетен форум. Чудя се дали да бъде с mysql или с бисквитки, но най-вече ми трябва идея как ще стане. Цял следобед го мисля, но без успех..
 
Форума ми бачкаше на следния принцип:

При прочитане/отваряне на тема правя проверка дали дадената тема е била отваряна от потребителя, ако е отваряна просто правя UPDATE на въпросния ред /id/, ако не съществува такъв запис в таблицата правя заявка INSERT.

PHP:
$is_read = mysql_query("SELECT `id` FROM `reads` WHERE user_id = '{$user_id}' AND topic_id ='{$topic_id}';") or die(mysql_error());
if (mysql_num_rows($is_read) > 0) {
	mysql_query("INSERT INTO `reads` (user_id, topic_id, date) VALUES ('{$user_id}','{$topic_id}', UNIX_TIMESTAMP());") or die(mysql_error());
} else {
	mysql_query("UPDATE `reads` SET date = UNIX_TIMESTAMP() WHERE user_id = '{$user_id}' AND topic_id = '{$topic_id}';") or die(mysql_error());
}

Като променливите:
$user_id = променливата на вписания потребител
$topic_id = променливата на темата
date .. е времето..

Смяната на иконата дали е прочетена или не в даден форум я правя по следния начин:

PHP:
<?php
$f_id = (int)$_GET['id'];
$query = mysql_query("SELECT * FROM `topics` WHERE `f_id`='{$f_id}';")or die(mysql_error());
if(mysql_num_rows($query) > 0) {
	while($row = mysql_fetch_object($query)) {
	$topic_id = $row->id;
	$fdate = $row->date;
		if ($user_id) {
			$timeout = time() - 43200;
			if ($fdate < $timeout) {
				$read = 'прочетена';
			} else {
				$read_status = mysql_query("SELECT `id` FROM `reads` WHERE `user_id` ='{$user_id}' AND topic_id ='{$topic_id}' AND date > '{$fdate}';") or die(mysql_error());
				if (mysql_num_rows($read_status) > 0) {
					$read = 'прочетена';
				} else {
					$read = 'непрочетена';
				}
			}
		} else {
			$read = 'прочетена';
		}
		echo "Темата е: {$read}";
	}
} else {
	echo "В този форум няма прочетени теми";
}
?>

Не се сещам, как ще стане с бисквитки, но това е вариант също. :?:

Таблицата предполагам сам можеш да си е напишеш. Ако имаш няк'ви въпроси казвай.
 
Направи го с mysql, защото знаеш, че повечето хора си чистят бисквитките, а по този начин няма да получаваш реални статистики.
 
nom3r1 каза:
Форума ми бачкаше на следния принцип:

При прочитане/отваряне на тема правя проверка дали дадената тема е била отваряна от потребителя, ако е отваряна просто правя UPDATE на въпросния ред /id/, ако не съществува такъв запис в таблицата правя заявка INSERT.

PHP:
$is_read = mysql_query("SELECT `id` FROM `reads` WHERE user_id = '{$user_id}' AND topic_id ='{$topic_id}';") or die(mysql_error());
if (mysql_num_rows($is_read) > 0) {
	mysql_query("INSERT INTO `reads` (user_id, topic_id, date) VALUES ('{$user_id}','{$topic_id}', UNIX_TIMESTAMP());") or die(mysql_error());
} else {
	mysql_query("UPDATE `reads` SET date = UNIX_TIMESTAMP() WHERE user_id = '{$user_id}' AND topic_id = '{$topic_id}';") or die(mysql_error());
}

Като променливите:
$user_id = променливата на вписания потребител
$topic_id = променливата на темата
date .. е времето..

Смяната на иконата дали е прочетена или не в даден форум я правя по следния начин:

PHP:
<?php
$f_id = (int)$_GET['id'];
$query = mysql_query("SELECT * FROM `topics` WHERE `f_id`='{$f_id}';")or die(mysql_error());
if(mysql_num_rows($query) > 0) {
	while($row = mysql_fetch_object($query)) {
	$topic_id = $row->id;
	$fdate = $row->date;
		if ($user_id) {
			$timeout = time() - 43200;
			if ($fdate < $timeout) {
				$read = 'прочетена';
			} else {
				$read_status = mysql_query("SELECT `id` FROM `reads` WHERE `user_id` ='{$user_id}' AND topic_id ='{$topic_id}' AND date > '{$fdate}';") or die(mysql_error());
				if (mysql_num_rows($read_status) > 0) {
					$read = 'прочетена';
				} else {
					$read = 'непрочетена';
				}
			}
		} else {
			$read = 'прочетена';
		}
		echo "Темата е: {$read}";
	}
} else {
	echo "В този форум няма прочетени теми";
}
?>

Не се сещам, как ще стане с бисквитки, но това е вариант също. :?:

Таблицата предполагам сам можеш да си е напишеш. Ако имаш няк'ви въпроси казвай.
А ако има ново мнение в темата как ще стане?
 
Трябва да имаш две различни таблици за темата и за мненията; например;

`topics` t_id|title|forum_id|date|user_id
`posts` p_id|desc|topic_id|date|user_id
-----------------

Като при ново мнение правиш ъпдейт на `date` колоната в таблица `topics`, после си правиш проверка дали има нови мнения. Сещаш ли се? :)
 
nom3r1 каза:
Трябва да имаш две различни таблици за темата и за мненията; например;

`topics` t_id|title|forum_id|date|user_id
`posts` p_id|desc|topic_id|date|user_id
-----------------

Като при ново мнение правиш ъпдейт на `date` колоната в таблица `topics`, после си правиш проверка дали има нови мнения. Сещаш ли се? :)
А сега всичко ми е готово само се чудя как да направя "Маркирай форумите като прочетени" ?
 
Ами вкарваш запис в таблицата read (както е дадена в по-горен пример) за потребителя и всички форуми с текуща дата.

И П.П. форума става или с mysql или с текстови файлове като датабаза, но не и с бисквитки. Цялата информация трябва да се пази на твоя сървър.
 

Горе