我有一个表“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'
......等等。
但这真的是最好的方法吗?
提前致谢!
答案 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 . "'";
}