Проблема «кто использовал это» - PullRequest
1 голос
/ 28 января 2010

Хорошо ... Итак, я столкнулся со следующей проблемой: у меня есть одна таблица, которая работает должным образом - она ​​содержит идентификаторы пользователей, идентификаторы сообщений, содержание сообщений, время, когда было сделано сообщение.

Я использую его, чтобы распечатать следующее: содержание сообщения, кто является автором сообщения и когда оно было создано. Пока все работает просто отлично.

Теперь ... У меня есть кнопка, которая позволяет пользователям голосовать за данный пост - и здесь все работает очень хорошо. Однако теперь я хочу сделать еще одну функцию, которая будет показывать , кто и когда проголосовал. Вы знаете, так что под каждым постом будет список людей, которым понравился пост, и когда они нажал кнопку.

Моя идея состояла в том, чтобы иметь две таблицы - одну, содержащую информацию о сообщении post_table , и еще одну таблицу voted_table , в которой будут идентификаторы пользователя, время нажатия кнопки и post_id , за который было сделано голосование ... Но я понятия не имею, как на самом деле это сделать. В общем, мой вопрос:

Как я могу вставить в таблицу информацию из другой таблицы + некоторую другую информацию по нажатию кнопки?

Ответы [ 3 ]

1 голос
/ 28 января 2010
CREATE TABLE `user` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `username` varchar(32) default NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `post` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `owner_id` INTEGER UNSIGNED default NULL,
  `content` TEXT default NULL,
 PRIMARY KEY (`id`),
 KEY `post_I_owner` (`owner_id`),
 CONSTRAINT `post_FK_user`
   FOREIGN KEY (`owner_id`)
   REFERENCES `user` (`id`)
   ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE `vote` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `user_id` INTEGER UNSIGNED default NULL,
  `post_id` INTEGER UNSIGNED,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
   UNIQUE KEY `vote_IU_user_post` (`user_id`,`post_id`),
   CONSTRAINT `vote_FK_user`
     FOREIGN KEY (`user_id`)
     REFERENCES  `user` (`id`)
     ON DELETE SET NULL,
   CONSTRAINT `vote_FK_post`
     FOREIGN KEY (`post_id`)
     REFERENCES  `post` (`id`)
     ON DELETE CASCADE
) ENGINE=InnoDB;

Итак, с помощью схемы выше мы можем сделать следующее ...

в html / php для страницы viewPost, которую вы могли бы получить

<form name="vote_form" action="postVote.php" method="POST">
  <input type="hidden" name="post_id" value="1" />
  <input type="submit" value="Vote for this Post" />
</form>

Итак, в votePost.php вы можете сделать что-то вроде:

if(isset($_SESSION['user']['user_id']))
{
   $userid = $_SESSION['user']['user_id'];
}
else
{
  // redirect to a login or something
}

$sql = "INSERT INTO vote (user_id, post_id) VALUES (%s,%s)"
$sql = sprintf($sql, $userid, $_POST['post_id']);
mysql_query($sql);

Таким образом, mysql позаботится о отметке времени для вас. Обратите внимание, что вам нужно проверить / проверить входные данные (что я на самом деле здесь не делал) перед тем, как вставить их в базу данных и все эти забавные вещи по безопасности. Я бы также рекомендовал использовать Mysqli или PDO Mysql вместо старых библиотек mysql и использовать подготовленный этап (который сам по себе позаботится о большей части функций квотирования / выхода из значения)

1 голос
/ 28 января 2010

Чтобы выполнить запрос на вставку, когда пользователь нажимает кнопку, вам нужна пара движущихся частей. Сначала нужно добавить форму с помощью кнопки. Вам нужно будет добавить в форму достаточно информации, используя «скрытые» поля (post_id и user_id, если вы не можете получить это откуда-то еще). Вам нужно установить действие в форме, чтобы быть другой страницей PHP. На второй странице PHP вы получаете указанные переменные формы и используете их для генерации запроса вставки. (Есть проблемы с безопасностью, которые вы должны рассмотреть, например доверять значению user_id и проверять ввод пользователя, но я не буду вдаваться в подробности.) Если вы использовали method = "POST" в вашей форме, то вы получите значения с помощью $ _POST [$ formFieldName].

1 голос
/ 28 января 2010

Вы можете, если ваша база данных поддерживает транзакции. В mysql ищите ключевые слова BEGIN COMMIT и ABORT. Однако, если вы сделаете это, вы будете хранить данные в двух местах.

Кроме того, вы можете сохранить итоги голосования в таблице voted_table и изменить свой первый запрос, чтобы присоединиться к таблице voted_table для подсчета голосов.

select P.post_id, sum(V.votes) # add other post_table fields
from post_table as P, voted_table as V
where P.post_id=V.post_id
group by P.post_id #add other post_table fields you need here also
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...