【问题标题】:Trying to delete all rows in database that do not match array尝试删除数据库中与数组不匹配的所有行
【发布时间】: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。

【问题讨论】:

    标签: php mysql arrays curl


    【解决方案1】:

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

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

    当你想要的是这个

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

    IN( 1,2,3,4)
    

    要使用 implode 得到这个,请包含这样的引号

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

    注意 每当直接将变量输入 SQL 时,都需要考虑诸如 SQLInjection 之类的安全隐患。如果 ID 来自罐头来源,你可能没问题,但我还是喜欢对它们进行消毒。

    【讨论】:

    • 我发现了我的问题。我已经有一段代码完全按照你说的做,所以我更加困惑。 $res = array_map(function($el){ return $el['id']; }, $result); $str = implode("','", $res);似乎我一直无法弄清楚的问题是我在 IN 和 () 之间有一个空格。我没有想到,这会导致问题,直到我看到你是如何写成这样 IN() 的。事情似乎在没有空间的情况下工作。谢谢。
    • 我不确定空间是否会导致问题,因为我还没有调查它,但一切正常。
    • SQL 中的IN ( ) and IN() 相同的东西不应该有关系 请参阅> dev.mysql.com/doc/refman/5.7/en/function-resolution.html
    【解决方案2】:

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

    这行得通:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多