Php 使用WHERE x IN(1,2,3)清理MySQL资源

Php 使用WHERE x IN(1,2,3)清理MySQL资源,php,mysql,arrays,Php,Mysql,Arrays,我一直在阅读使用数组通过一个查询在多行上执行SQL函数的优化例程。我的问题特别涉及PHP/MySQL 我允许用户在我正在开发的系统中创建产品,然后为所述产品创建自定义属性。此问题与删除产品时的清理过程有关,因为产品数据、要素数据和要素选项都存储在不同的表中 这是我目前的清理程序: $feature_cleanup = array(); $result = mysql_query("SELECT * FROM features WHERE feature_parent = $parent_id")

我一直在阅读使用数组通过一个查询在多行上执行SQL函数的优化例程。我的问题特别涉及PHP/MySQL

我允许用户在我正在开发的系统中创建产品,然后为所述产品创建自定义属性。此问题与删除产品时的清理过程有关,因为产品数据、要素数据和要素选项都存储在不同的表中

这是我目前的清理程序:

$feature_cleanup = array();
$result = mysql_query("SELECT * FROM features WHERE feature_parent = $parent_id");
if($result && mysql_num_rows($result) > 0) {
  while($assoc = mysql_fetch_assoc($result) $feature_cleanup[] = $assoc['id'];
  @mysql_query("DELETE FROM features WHERE feature_parent = $parent_id");
  // TODO: Use $feature_cleanup to delete feature options
}
我目前的想法是:

$cleanup_list = implode(',', $feature_cleanup);

我可以简单地将$cleanup_列表作为IN传递,还是需要在其周围加上括号,或者需要进一步将其处理为字符串

@mysql_query("DELETE FROM feature_options WHERE option_parent IN $cleanup_list");
或:

“我可以简单地将$cleanup_列表作为IN传递吗?还是需要在其周围加上括号,或者需要进一步将其处理为字符串?”

这个问题的答案是需要将IN子句包装在parens中,以将其描述为一个集合,包括一个值

但是,如果在不同的表中存储了所有需要同时删除的值,则应该在数据库中小心地使用级联删除来处理这些值。例如,如果一个产品被删除了,那么该删除应该被级联到特色产品等,这样就不会留下任何产品的痕迹。我不想让一款产品成为未售出的特色产品。让数据库来完成这项工作

“我可以简单地将$cleanup\u列表作为IN传递,还是需要在其周围加上括号,或者需要进一步将其处理为字符串?”

这个问题的答案是需要将IN子句包装在parens中,以将其描述为一个集合,包括一个值


但是,如果在不同的表中存储了所有需要同时删除的值,则应该在数据库中小心地使用级联删除来处理这些值。例如,如果一个产品被删除了,那么该删除应该被级联到特色产品等,这样就不会留下任何产品的痕迹。我不想让一款产品成为未售出的特色产品。让数据库来完成这项工作

我建议您使用


不确定我的子查询是否符合您的需要,但我希望您能理解。

我建议您使用



不确定我的子查询是否符合您的需要,但我希望您能理解。

不要抑制错误消息。这是一个糟糕的做法,最终只会伤害到你。我很清楚错误消息抑制的风险,但是这些不是我关心的,因为我有一个完整的例程专门用于在脚本中稍后处理它们。你将错误和警告处理保存到以后,而不是立即处理它们?o、 无法抑制错误消息。这是一个糟糕的做法,最终只会伤害到你。我很清楚错误消息抑制的风险,但是这些不是我关心的,因为我有一个完整的例程专门用于在脚本中稍后处理它们。你将错误和警告处理保存到以后,而不是立即处理它们?o、 正在删除。。。或者,如果必须在应用程序中执行,则至少在事务内部执行,以便在出现任何故障时回滚到一致。已商定的事务。如果你不注意的话,使用级联删除可能会很危险,但从长远来看,这是你最好的选择。我以前没有使用过级联删除,你对如何使用它们有很好的入门知识吗?当然,它们还不错。你需要确保你的FK、PK和所有爵士乐都设置正确,否则你可能会受到伤害。使用MySQL workbench或PHPMyAdmin之类的工具来简化腿部工作。请记住,这将要求您在表上运行ALTER语句(如果它们已经设置好并正在运行)。感谢各位的帮助。我将投票表决,只是因为我知道这是正确的方式,但我必须做一些重组,让它以这种方式运作。时间限制现在不允许这样做,但我想在将来走这条路!层叠删除。。。或者,如果必须在应用程序中执行,则至少在事务内部执行,以便在出现任何故障时回滚到一致。已商定的事务。如果你不注意的话,使用级联删除可能会很危险,但从长远来看,这是你最好的选择。我以前没有使用过级联删除,你对如何使用它们有很好的入门知识吗?当然,它们还不错。你需要确保你的FK、PK和所有爵士乐都设置正确,否则你可能会受到伤害。使用MySQL workbench或PHPMyAdmin之类的工具来简化腿部工作。请记住,这将要求您在表上运行ALTER语句(如果它们已经设置好并正在运行)。感谢各位的帮助。我将投票表决,只是因为我知道这是正确的方式,但我必须做一些重组,让它以这种方式运作。时间限制现在不允许这样做,但我想在将来走这条路!我喜欢它的简单性,而且它似乎与我已经构建的东西一起工作。我会将此标记为已接受的解决方案。谢谢你的帮助。我喜欢它的简单性,它似乎与我已经建立的工作。我会将此标记为已接受的解决方案。谢谢你的帮助。
@mysql_query("DELETE FROM feature_options WHERE option_parent IN ($cleanup_list)");
DELETE FROM features WHERE feature_parent IN (SELECT * FROM features WHERE feature_parent = $parent_id)