Php 正在尝试删除数据库中与数组不匹配的所有行

Php 正在尝试删除数据库中与数组不匹配的所有行,php,mysql,arrays,curl,Php,Mysql,Arrays,Curl,我试图找出如何删除数据库中不存在于数组中的所有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。我一直在尝试在我的查询中使用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')
它每次都会删除表中的每一行。我真的不明白,因为如果我从日志中复制/粘贴同一个查询,然后自己手动运行它,它就可以完美地工作

我一直在尝试各种捕获数组数据的方法,如数组列、数组映射、数组搜索和我找到的各种函数,但最终结果总是一样的。 现在,为了进行测试,我使用这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=计数($result);
对于($i=0;$i<$arrayLength;$i++){
mysqli_查询($con,“从id不在(“””)“$result[$i]['id'].“”)的表中删除”;
}

如果有人知道发生了什么事,我会感谢他们的帮助或任何关于如何达到同样结果的建议。如果有帮助的话,我将PHP7和mysql 5.7与innodb表一起使用。

不能将数组和字符串混合使用

这项工作:

mysqli_query($con, "DELETE FROM table WHERE id NOT IN (".implode(',', $ids).")");

它可能不起作用,因为你的价值观是这样的

IN('1,2,3,4');
 $in = "'".implode("','", $array)."'";
你什么时候想要这个

IN('1','2','3','4')

要通过“内爆”实现这一点,请包含以下引号

IN('1,2,3,4');
 $in = "'".implode("','", $array)."'";

<强>注当直接将变量输入SQL时,需要考虑安全性,如SQLjjTunes。如果ID来自罐装来源,你可能没问题,但我还是喜欢对它们进行消毒

我解决了我的问题。我已经有一段代码完全按照你说的做了,所以我更加困惑了$res=array_map(函数($el){return$el['id'];},$result)$str=内爆(“,”,$res);似乎我一直无法理解的问题是,我在IN和()之间有一个空格。在我看到你在()中这样写之前,我没有想到这会引起问题。没有空间,一切似乎都在运转。谢谢。我不确定这个空间是否会引起问题,因为我还没有调查过,但一切都在进行中。在()和()中,这应该无关紧要。SQL中的相同内容请参见>