使用PHP和UUID跟踪动态网页状态

使用PHP和UUID跟踪动态网页状态,php,mysql,authentication,uuid,status,Php,Mysql,Authentication,Uuid,Status,我正在从头开始构建一个电子商务,用户可以在不登录的情况下执行许多操作,向购物车添加商品,创建自己的定制产品。为了解决这个问题,我生成了一个包含UUID的cookie,将UUID存储在MySQL表Users中,并将每个信息与该UUID关联。当用户最终注册一个帐户时,我将昵称、哈希、salt和电子邮件存储在与原始UUID关联的Registered_users表中。我甚至可以使用一个带有空字段的表,但这不是重点,如果在未注册时不检索有关用户的信息,这将变得毫无用处 如果用户删除cookie怎么办?UU

我正在从头开始构建一个电子商务,用户可以在不登录的情况下执行许多操作,向购物车添加商品,创建自己的定制产品。为了解决这个问题,我生成了一个包含UUID的cookie,将UUID存储在MySQL表Users中,并将每个信息与该UUID关联。当用户最终注册一个帐户时,我将昵称、哈希、salt和电子邮件存储在与原始UUID关联的Registered_users表中。我甚至可以使用一个带有空字段的表,但这不是重点,如果在未注册时不检索有关用户的信息,这将变得毫无用处

如果用户删除cookie怎么办?UUID是这个任务的好选择吗


请注意,整个电子商务都将支持SSL。

我认为您选择的系统很好。关于你的问题,如果用户删除cookie,会有两个后果

首先,用户丢失了他的购物车和个人产品。但这是某种预期的行为,所以我不担心。如果您真的担心用户在未注册时不应丢失所有有价值的数据,请考虑其他存储UUID的方法,例如localStorage或Flash Cookie。有关所有可能性的列表,其中许多不适合您的应用,请参阅

其次,包含UUID和其他数据的数据库表将随着时间的推移而增长。因此,您需要不时删除用户未注册帐户的旧条目。您的两个表使得识别未注册的用户变得相对简单。以下是如何使用SQL清理旧条目:

DELETE FROM Users WHERE date_created < '2012-01-01' AND 
  UUID NOT IN (SELECT UUID FROM Registered_Users);
我在这里选择了一个固定日期,以避免使用DATEDIFF函数。 在删除用户之前,您可能需要先删除其他数据


从数据库和性能的角度来看,如果UUID是一个不错的选择,请查看并形成自己的看法。也许仅仅使用用户自动递增的主键就足够了。

我觉得您选择的系统很好。关于你的问题,如果用户删除cookie,会有两个后果

首先,用户丢失了他的购物车和个人产品。但这是某种预期的行为,所以我不担心。如果您真的担心用户在未注册时不应丢失所有有价值的数据,请考虑其他存储UUID的方法,例如localStorage或Flash Cookie。有关所有可能性的列表,其中许多不适合您的应用,请参阅

其次,包含UUID和其他数据的数据库表将随着时间的推移而增长。因此,您需要不时删除用户未注册帐户的旧条目。您的两个表使得识别未注册的用户变得相对简单。以下是如何使用SQL清理旧条目:

DELETE FROM Users WHERE date_created < '2012-01-01' AND 
  UUID NOT IN (SELECT UUID FROM Registered_Users);
我在这里选择了一个固定日期,以避免使用DATEDIFF函数。 在删除用户之前,您可能需要先删除其他数据


从数据库和性能的角度来看,如果UUID是一个不错的选择,请查看并形成自己的看法。也许仅仅使用用户的自动递增主键就足够了。

决定是否清除未注册用户的好标准是什么?固定的非活动时间对我来说太浅了。使用自动增量会造成并发问题。这些步骤必须类似于:1创建一个新行2检索ID并将其存储在cookie中。这个操作必须是原子的,我认为在PHP/MySQL中不可能不使用事务,我希望尽量避免使用事务。我不确定“浅层”是什么意思。如果您不使用创建日期,而是使用最后一个活动时间,并选择一个30天以上的大间隔,那么您应该非常安全地只删除那些没有返回或已删除cookie的用户。如果两个并发请求在用户中创建了一条记录,则条目将具有不同的自动增量id,并且对PDO::lastInsertId或mysqli->insert_id的调用将返回两个不同的id,然后您可以将它们存储在cookie中。不使用事务的单个INSERT语句是非常原子的。决定是否清理未注册用户的好标准是什么?固定的非活动时间对我来说太浅了。使用自动增量会造成并发问题。这些步骤必须类似于:1创建一个新行2检索ID并将其存储在cookie中。这个操作必须是原子的,我认为在PHP/MySQL中不可能不使用事务,我希望尽量避免使用事务。我不确定“浅层”是什么意思。如果您不使用创建日期,而是使用最后一个活动时间,并选择一个30天以上的大间隔,那么您应该非常安全地只删除那些没有返回或已删除cookie的用户。如果两个并发请求在用户中创建一条记录,则 条目将具有不同的自动增量id,对PDO::lastInsertId或mysqli->insert_id的调用将返回两个不同的id,然后您可以将它们存储在cookie中。不使用事务的单个INSERT语句是非常原子化的。