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

时间:2017-07-18 18:41:47

标签: 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插入到数据库中,我在这里尝试做的基本上是创建一个链接/数据检查器。 如果在重新检查数组时未在数组中找到数据库,那么我希望它们被删除。

我认为上面的查询会很完美,但由于某些原因它并没有。从脚本运行查询时,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']."')");
}

如果有人知道发生了什么,我会提供有关如何获得相同结果的帮助或任何建议。我正在使用php 7和mysql 5.7与innodb表,如果这有帮助。

2 个答案:

答案 0 :(得分:1)

你不能混合数组和字符串。

这有效:

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

答案 1 :(得分:1)

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

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

当你想要的是这个

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

OR

IN( 1,2,3,4)

使用implode来获取此内容包括像这样的引号

 $in = "'".implode("','", $array)."'";

注意 每当直接将变量输入SQL时,都会考虑安全性因素,例如SQLInjection。如果ID来自罐装来源你可能还可以,但无论如何我想要消毒它们。