【发布时间】:2018-09-11 04:55:33
【问题描述】:
我一直在环顾四周,发现了许多类似的问题,但答案似乎不是我想要的。
我网站的注册流程如下:
- 用户提供电子邮件和密码
- 电子邮件和密码已插入
_unverified表中 - 验证链接已发送到电子邮件地址
- 一旦用户点击链接,电子邮件和密码将从
_unverified转移到_verified
因此,当用户尝试创建帐户时,我必须查询两个表以确保电子邮件尚未在使用中。如下所示,我总是单独执行此操作,这显然会使脚本膨胀。
$statement = $connect->prepare("SELECT account_email FROM users_unverified WHERE account_email = :account_email");
$statement->bindParam(":account_email", $_POST["email"]);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
if ($result["account_email"]) // verification process is already active or has expired
$statement = $connect->prepare("SELECT account_email FROM users_verified WHERE account_email = :account_email");
$statement->bindParam(":account_email", $_POST["email"]);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
if ($result["account_email"]) // account already exists
值得注意的是,$_POST["email"] 将出现在一个表中或另一个表中,或者两者都没有。
在我发现的类似问题中,人们建议使用JOINS 和UNIONS。但是,在阅读了每种方法之后,我不相信 JOINS 和 UNIONS 是我正在寻找的,因为我不想组合行或结果集(当然,除非我仍然能够识别该值位于哪个表中?)。
简单地说,我希望能够使用一条准备好的语句查询两个表,但如果值确实位于其中一个表中,则仍然能够确定该值位于哪个表中。我在想像下面这样的事情,我在this question 中遇到过,但是,我不相信您能够确定该值在哪个特定表中。
$statement = $connect->prepare("SELECT account_email FROM users_unverified, users_verified WHERE account_email = :account_email");
是否有任何方法可以组合这些查询,同时仍然能够识别该值存在于哪个特定表中?
【问题讨论】:
-
为什么没有经过验证的列而不是单独的表?
-
@chris85 我绝对可以这样做,但我更愿意将表分开,以便
_verified尽可能保持精简,以便尽可能快地保持查询。由于我在共享主机上,我也不想一直手动浏览表格并清除所有过期的、未验证的帐户 -
我支持@chris85。也许你觉得通过使用某种形式的关系表在这里是可行的。不是在验证用户时。哦,它确实有效,但关系表最适用于现有数据和长期存在的数据。我只是在验证时设置了一个布尔标志。
-
“我也不想手动检查表并清除所有过期的、未验证的帐户” - 为什么不只运行一个 cron为您做这件事并在一段时间内对未经验证的帐户使用 WHERE 子句?或者一个事件处理程序,TRIGGER。
-
@FunkFortyNiner 你能在共享主机上运行 cron 作业吗?!我必须联系我的供应商。对于未来的其他用例,这个问题的答案仍然很高兴
标签: php mysql prepared-statement