【发布时间】:2017-07-18 18:41:47
【问题描述】:
我试图弄清楚如何删除数据库中不存在于数组中的所有 id。我一直在尝试在我的查询中使用 NOT IN,但我不确定为什么在脚本中运行它时它不起作用,就像我手动将它输入到 mysql 时一样。这是一个例子。
mysqli_query($con, "DELETE FROM table WHERE id NOT IN ($array)");
$array 是来自 json api 的 id 列表。我使用 CURL 来获取 id,我试图删除数据库中与 $array 中的 id 不匹配的所有 id。 首先,我使用另一个简单的 CURL 脚本来抓取 api 并将找到的 id 插入到数据库中,而我在这里要做的基本上是制作一个链接/数据检查器。 如果重新检查时在数组中找不到数据库中的 id,那么我希望它们被删除。
我认为上面的查询可以完美运行,但由于某种原因它没有。当从脚本运行查询时,mysql 日志会显示正在运行的查询。
例子:
DELETE FROM table WHERE id NOT IN ('166')
或者当我测试多个值时。
DELETE FROM table WHERE id NOT IN ('166', '253', '3324')
然后每次都会删除表中的每一行。我不太明白,因为如果我从日志中复制/粘贴相同的查询并自己手动运行它,它就可以完美运行。
我一直在尝试各种捕获数组数据的方法,例如 array_column、array_map、array_search 和我找到的各种函数,但最终结果总是相同的。 现在,只是为了测试,我使用这 2 位代码来测试 2 个不同的 api,这给了我与上面相同的 sql 查询日志输出。使用的函数只是我发现的几个随机函数。
//$result is the result from CURL using json_decode
function implode_r($g, $p) {
return is_array($p) ?
implode($g, array_map(__FUNCTION__, array_fill(0, count($p), $g), $p)) :
$p;
}
foreach ($result['data'] as $info){
$ids = implode_r(',', $info['id']);
mysqli_query($con, "DELETE FROM table WHERE id NOT IN ($ids)");
}
和
$arrayLength = count($result);
for($i = 0; $i < $arrayLength; $i++) {
mysqli_query($con, "DELETE FROM table WHERE id NOT IN ('".$result[$i]['id']."')");
}
如果有人知道发生了什么,我会感谢您的帮助或有关如何达到相同结果的任何建议。如果有帮助,我正在使用带有 innodb 表的 php 7 和 mysql 5.7。
【问题讨论】: