如何在PHP中存储cookie,以便在不登录的情况下唯一地识别用户投票



>上下文

我的网站上有一个辩论系统,用户可以点击他们想要投票的辩论选项,然后显示对任一选项的辩论票数。但是,用户需要登录他们的帐户才能正常工作,因此路过的用户无法投票(您可以在此处查看功能(。我希望更改此代码,以便用户无需登录其帐户即可对辩论进行投票。知道大多数选项并不完全可靠并且可以解决,我决定使用 cookie 来存储信息,这些信息可以识别用户是否在没有登录的情况下对辩论进行了投票。

问题

由于我是使用 cookie 的新手,我想知道:实现 cookie 的最佳方法是什么,以便我可以将辩论投票插入我的数据库并在非登录用户单击同一辩论两次时对其进行检查?我想我只需要一个唯一的编号,该编号将作为cookie存储在客户端,直到删除cookie为止。考虑到这一点,我想我可以根据用户 IP 地址创建一个随机数,如下所示:

setcookie('temp_id', md5($_SERVER['REMOTE_ADDR']);

我知道用户可以更改 IP 地址,但我认为只要客户端存储了一个数字,这并不重要。这是获取可在客户端存储为 cookie 的唯一编号的好方法,还是我应该设置一个由于某种原因效果更好的其他唯一编号?这是安全的做法吗?那里似乎没有任何重要的私人用户信息。

问题的下一部分是我将如何更改我的数据库代码以适应那些未登录的人。我的数据库表poll_votes当前配置如下:

CREATE TABLE poll_votes (
vote_id INT(11) AUTO_INCREMENT PRIMARY KEY NOT NULL,
yes VARCHAR(50) NOT NULL,
no VARCHAR(50) NOT NULL,
poll_id INT(11) NOT NULL,
idUsers INT(11) NOT NULL,
article_id INT(11) UNSIGNED,
seen TINYTEXT NOT NULL,
FOREIGN KEY (article_id) REFERENCES articles (article_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (poll_id) REFERENCES polls (poll_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (idUsers) REFERENCES users (idUsers) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

如您所见,我表中的一个列是idUsers,它引用了表中的注册用户users。这意味着我将不得不通过添加另一列来更改表格,该列将在用户对辩论进行投票时跟踪唯一的 cookie ID,并将idUsers设置为NULL,对吗?我想在实施之前对此进行检查,以确保我没有误解在这种情况下如何使用cookie来解决此问题。如果有任何困惑,请告诉我。谢谢。

我看到了几个问题。我们为音乐活动建立了几个投票系统,你通常会有很多没有帐户的用户。

首先,IP地址不是一个好主意。

setcookie('temp_id', md5($_SERVER['REMOTE_ADDR']);

假设我在 DigitalEconomyHub.com 的共享办公室 - 有多个同事,我们都有相同的IP地址。我建议使用 UUID - 几乎无穷无尽的唯一数字。换句话说,我的同事会看到我投票支持什么(不酷(。

setcookie('voter_uuid', uniqid($_SERVER['REMOTE_ADDR'], true));

其次,数据库希望您始终拥有用户对象。

idUsers INT(11) NOT NULL

随机访问者的用户对象?将生成太多垃圾记录。 让我们以不同的方式做 - idUsers 成为一个可为空的字段,我们添加一个字段voter_uuid,该字段是 varchar 和索引的。

相关内容