Php 在将id添加到另一个表之前,请检查该表中是否存在id

Php 在将id添加到另一个表之前,请检查该表中是否存在id,php,mysql,sql,Php,Mysql,Sql,我正在做一件小事,比如你在facebook上看到的like功能。所以我是这样做的。我有一个名为products的表,其中包含人们可以喜欢的产品。 像这样(剥去衣服): 在添加到likes表之前,我需要检查产品表中是否实际存在具有该id的产品,并且其状态为0。我现在用很多php代码来实现这一点。使用sql做这件事的好方法是什么?可能吗?使用外键或类似的东西 我正在使用innodb表类型。您需要查询数据库以检查记录 例如,您的产品id是2,因此您的查询类似于 $query=从'your like t

我正在做一件小事,比如你在facebook上看到的
like
功能。所以我是这样做的。我有一个名为
products
的表,其中包含人们可以
喜欢的产品。
像这样(剥去衣服):

在添加到
likes
表之前,我需要检查产品表中是否实际存在具有该id的产品,并且其状态为0。我现在用很多php代码来实现这一点。使用sql做这件事的好方法是什么?可能吗?使用外键或类似的东西


我正在使用innodb表类型。

您需要查询数据库以检查记录

例如,您的产品id是
2
,因此您的查询类似于

$query=从'your like table'中选择*,其中'prodId'='ID'

然后

if(!mysql\u query('your-db',$query)):

如果您遇到这种情况,那么就是您输入like to数据库的时候了

endif


希望它有帮助

你可以做一个有条件的
插入
。对于产品6和用户7:

insert  into Likes
        (prodName, prodId, userId)
select  prodName
,       id
,       7
from    Products
where   id = 6
        and status = 0

如果此操作不插入任何行,则表明产品不存在状态为0的产品。

如果您只想对
插入进行词组化,使其符合规则,则可以使用
插入。选择
,如下所示:

insert into likes(prodId, userId)
    select <prodid>, <userid>
    from products p
    where p.prodid = <prodid> and status = 0
insert-into-likes(prodId、userId)
选择,
来自产品p
其中p.prodid=和status=0
我认为MySQL不支持“部分”外键约束,也可以在标记上包含要求


而且,您不应该将产品名称放在
likes
表中。您应该在
products
表中查找它。

尝试将产品表中不存在的内容添加到likes表中的关键因素是向用户提供反馈,让他们知道自己做错了。您确定的任何答案都不应该忽略用户反馈方面的内容——这基本上需要您的PHP代码

但是,是的-有一种方法可以通过外键实现。您可以在第二个表中索引prodid,并将其作为外键引用到第一个table.id。这意味着,如果您尝试插入,但出现错误,则问题可能是您试图在第一个表中添加不匹配的内容

然而,试图精确地确定错误是什么,以便确定响应该错误的正确逻辑,会导致其自身大量的php代码,并且对于未来的开发人员来说,维护起来不那么容易透明。我建议在您的产品对象中使用一个简单的方法:
isValid(id)
返回true/false-因此您的“检查此”代码只需执行
if(Product.isValid(prodId)){Like.insert(userId,prodId);}

但同时,我建议您在使用可能已经在使用的php代码的同时使用外键约束,以防止数据库中的未链接行变得杂乱无章。通常最好对坏数据设置多重屏障

另外。。。是否有将产品名称同时存储在product表和likes表中的原因?我不明白你为什么要把它放在桌子上

--Check to see if cleared product exist in products table
Select count(*) from products p where p.status = 0 and p.id = %IDVALUE

--Check if your user previous liked product
Select count(*) from products p, likes l where p.id = l.prodId and l.userId = %USERID

在代码中,您可以执行语句(用实际值替换%IDVALUE和%USERID),并检查返回列以获取计数并执行自定义逻辑。

目前,您需要使用prodId填充LIKE表,因此,无论使用哪种约束,都需要查找数据。因此:

INSERT INTO likes (prodname, prodId, userId)
SELECT prodname, id, 123456
FROM products
WHERE prodname='Le Sharp Knife'
AND status=0;

(只需将123456和“Le Sharp Knife”替换为您需要的参数即可)。

无需进行此类检查。请参阅在重复密钥上插入忽略和更新。或者存在数据库访问问题,或者数据有问题,或者某个地方有锁,或者。。。
INSERT INTO likes (prodname, prodId, userId)
SELECT prodname, id, 123456
FROM products
WHERE prodname='Le Sharp Knife'
AND status=0;