MYSQL删除字段不是数组的一部分

时间:2011-11-02 18:01:39

标签: php mysql arrays

我有一个表“groupdentlink”,我想删除表单中未检查的所有行。

本质上我想执行如下查询:

DELETE * FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id IS NOT IN ARRAY 'b'

我想我可以使用foreach循环设置变量,然后继续向其添加数组值,所以我最终得到:

DELETE * FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id != 'D1'
AND dentist_id != 'D5'
AND dentist_id != 'D8'

......等等。

但这真的是最好的方法吗?

提前致谢!

7 个答案:

答案 0 :(得分:17)

DELETE FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id NOT IN ('D1','D5','D8')

此处有更多信息http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_not-in

答案 1 :(得分:2)

如果要从Zend Framework驱动的应用程序执行此查询,请考虑以下事项:

$where = sprintf('dentist_id NOT IN ("%s")', implode('", "',array_map('mysql_escape_string', $array))); 
$this->sqlMapper->delete($where);

如果你试试。用于连接的运算符,由于引号,查询将导致致命错误。根据我使用htmlspecialchars或htmlencode的经验。操作员只会消耗你的时间和耐心。 sprintf的使用非常优雅,可以帮助您保持代码清洁。

我认为这些观察结果适用于任何使用php对象的应用程序。

答案 2 :(得分:0)

您只需要使用逗号加入ID:

$myarray = new array('D1', 'D5', 'D8');
$str = "";
foreach ($myarray as $item)
{
    $str .= $item . ",";
}
$str = rtrim($str, ",");

$query = "DELETE * FROM groupdentlink
             WHERE group_id = 'a'
             AND dentist_id NOT IN ($str)";

这将为您提供如下查询:

DELETE * FROM groupdentlink
    WHERE group_id = 'a'
    AND dentist_id IS NOT IN (D1, D5, D8);

如果你需要id周围的引号,那么改变这样的循环:

foreach ($myarray as $item)
{
    $str .= "'".$item . "',";
}

答案 3 :(得分:0)

Stack Exchange的新用户,请原谅并指示我是否犯了一个失礼。

前面的答案非常危险,因为它可以让你接受SQL注入攻击。

始终使用bind params。

始终使用bind params。

始终使用bind params。

提示:如果你的查询不像“DELETE * FROM groupdentlink WHERE group_id ='a'AND dentist_id IS NOT IN(?,?,?);”你做错了。

答案 4 :(得分:0)

优雅,完全参数化的解决方案(使用PDO):

$dentistIds = ['D1', 'D5', 'D8'];

$query = sprintf(
    "DELETE FROM online_order_shipping
           WHERE group_id = 'a'
             AND dentist_id NOT IN (%s)",
    implode(',', array_fill(0, count($dentistIds), '?'))
);

$stmtDelete = $pdo->prepare($query);
$stmtDelete->execute($dentistIds);

implode函数字符串?,,最后不添加逗号(source)。你可以把它变成一个函数来使它更具可读性,否则sprintf会保持它的整洁而没有丑陋的字符串连接。

答案 5 :(得分:0)

这是我的方法:

assuming you have an array called $csvstocknumbers = ['0','1']; $stocknumbers = implode(",",$csvstocknumbers) ; // make the content of the array in one string seprated by , $deleteoldvehicles = "DELETE FROM table_name WHERE column_name NOT IN
($stocknumbers ) ;"; mysqli_query($con, $deleteoldvehicles);

答案 6 :(得分:-1)

我发现了$str = rtrim($str, ",");的声明 没有删除引起一个尾随的逗号 错误
我想出了这项工作:

//没有引号的字符串

$str = array_shift($array);

//带引号的字符串

$str = "'" . array_shift($array) . "'";



foreach ($array as $item)
{

    $str .= ", '" . $item . "'";

}