Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql-php中使用IN操作符删除所有行_Php_Mysql - Fatal编程技术网

如何在mysql-php中使用IN操作符删除所有行

如何在mysql-php中使用IN操作符删除所有行,php,mysql,Php,Mysql,我在理解下面这个程序的行为时遇到问题。下面是一个简单的代码,用于删除在操作员中使用的电子邮件地址 $emails = $_POST['ids']; $sql = "DELETE FROM newsletter where email "; $condition = sprintf('IN ("%s")',implode(' "," ',$_POST['ids'])); $sql = $sql.$condition; include '../includes/db.

我在理解下面这个程序的行为时遇到问题。下面是一个简单的代码,用于删除在操作员中使用的电子邮件地址

$emails = $_POST['ids'];
    $sql = "DELETE FROM newsletter where email ";
    $condition = sprintf('IN ("%s")',implode(' "," ',$_POST['ids']));
    $sql = $sql.$condition;
    include '../includes/db.php';
    $r = mysql_query($sql);

    echo $sql;
它只删除一个电子邮件id并返回true。我怎样才能让它以删除所有电子邮件的方式运行呢

下面是使用上述代码构造的查询

从通讯中删除电子邮件(“adfadsf@gmail.com "," asdfasfasf@gmail.com "," kjhkhsd@assdfsdf.sdfsf "," shit@gshit.com "," someother@gmail.com))

这是错误的删除方式吗?

而不是:

$condition = sprintf('IN ("%s")',implode(' "," ',$_POST['ids']));
做:


IN运算符将字段的内容和值精确匹配。值的开头和结尾处的空格可能会导致您的问题。

该查询有效,但您在电子邮件之前/之后添加空格


"asdfasfasf@gmail.com“不匹配”asdfasfasf@gmail.com“

这段代码很容易受到SQL注入攻击,我可以让post像

"); delete from newsletter; delete from newsletter where email in ("
“是我的帖子字符串的一部分,这将擦除您的新闻稿表

但是,除了代码的关键问题外,还有可能是空格(您的字符串在数据库中是否包含空格?)和双引号的使用。我不是100%确定,但我确定“可以用作字段指示符而不是字符串,因此您可能需要单引号

$emails = $_POST['ids'];
$sql = "DELETE FROM newsletter where email ";
$condition = sprintf("IN ('%s')",implode("','",$_POST['ids']));
$sql = $sql.$condition;
include '../includes/db.php';
$r = mysql_query($sql);
echo $sql;
那么输出应该是

DELETE FROM newsletter where email IN ('adfadsf@gmail.com','asdfasfasf@gmail.com','kjhkhsd@assdfsdf.sdfsf','shit@gshit.com','someother@gmail.com')

如果需要在SQL查询中插入字符串,则必须对其进行单引号引用并防止SQL注入。此外,in子句中的逗号分隔符不应被引用

$safe_emails = array();
foreach($_POST['ids'] as $i){
    $safe_emails[] = "'" . mysql_real_escape_string($i) . "'";
}
$sql = 'DELETE FROM newsletter WHERE email IN (' . implode(', ', $safe_emails) . ')';

我希望我的电子邮件地址是
shit@gshit.com
…@todda.speot.is-你可以随时问:)我也剪切和粘贴了代码,所以它有同样的错误,但是你给$\u POST['id']分配了$email,但是你重新使用了$\u POST['id']而不是$email,这是故意的吗?我想知道为什么SQL注入对新手来说如此难以理解。旧式Mysql扩展不支持多个语句,但我相信您可以构建一个精心编制的参数来组成一个多表删除命令并清除任意数据。或者只需执行
”)或email=email或email in(“
$safe_emails = array();
foreach($_POST['ids'] as $i){
    $safe_emails[] = "'" . mysql_real_escape_string($i) . "'";
}
$sql = 'DELETE FROM newsletter WHERE email IN (' . implode(', ', $safe_emails) . ')';