DELETE FROM - MYSQL数据库上的foreach循环

时间:2014-12-20 12:49:02

标签: php mysql wordpress

我正在运行我的Wordpress数据库,我想向所有用户发送圣诞卡。

麻烦的是其中一些是虚假的。实际上差不多有3000个。

我不想发送这些邮件,因此他们只是反弹并填满我的收件箱并重载邮件服务器或其他任何内容。

所以我写了这个剧本。

 // Create connection
$link = mysqli_connect($servername, $username, $password, $dbname);

// Check connection
if (!$link) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully <br>";

//If form submitted

if ($_GET["form"] == "true") {
echo '<H1>FORM SUBMITTED</H1>';

// select all users

$query = "SELECT wp_users.ID FROM wp_users,wp_comments GROUP BY wp_users.ID ORDER BY wp_users.ID asc";

$result = $link->query($query);

while($row = mysqli_fetch_array($result)) {

$all_names[]=$row["ID"];


} 



 $query = "SELECT wp_users.ID FROM wp_users,wp_comments WHERE INSTR(wp_users.display_name, wp_comments.comment_author) > 0 GROUP BY wp_users.ID     ORDER BY wp_users.ID asc";

//execute the query.

$result = $link->query($query);

//display information:

while($row = mysqli_fetch_array($result)) {

$names[]=$row["ID"];


} 

$dupe_ID = array_diff($all_names,$names);

$i=0;

// LOOP THE COMMAND

foreach ($dupe_ID as $value) {


// DELETE THE USERS
$query = "DELETE FROM wp_users WHERE ID = $value";

if (mysqli_query($link, $query)) {
    $i++;
    } else {
        echo "Error deleting records: " . mysqli_error($link);
    }

}

echo $i . 'Names deleted';
}

else

{

// select all users

$query = "SELECT wp_users.display_name FROM wp_users,wp_comments GROUP BY wp_users.ID ORDER BY wp_users.display_name asc";

$result = $link->query($query);

while($row = mysqli_fetch_array($result)) {

$all_names[]=$row["display_name"];


} 



 $query = "SELECT wp_users.display_name FROM wp_users,wp_comments WHERE INSTR (wp_users.display_name, wp_comments.comment_author) > 0 GROUP BY wp_users.ID ORDER BY wp_users.display_name asc";

//execute the query.

$result = $link->query($query);

//display information:

while($row = mysqli_fetch_array($result)) {

$names[]=$row["display_name"];


} 

$dupe_names = array_diff($all_names,$names);

$i=1;

// print out the bogus names

foreach ($dupe_names as $value) {
echo $i.')'. $value .'<br>';
$i++;
}

echo '<p><h3>To delete these names click here </h3></p>';
echo '<form method="GET" target="bogus_users.php" ><input type=submit value="Submit">      <input type="hidden" name="form" value="true"></form>';

}

它分为两部分: -

1)页面准确地告诉我数据库中的哑弹并输出名称,以便我可以扫描它们。

2)提交表格。 $ _GET命令返回一个令牌,告诉脚本运行一个相同的脚本,该脚本将删除这些记录。这将返回正确的令牌,相当于伪记录的数量,但不会删除任何记录。

我跑了几次,直到我的ISP给我发了一封电子邮件,说我的服务器超载了。

这里有一个明显的错误,因为我可以看到它。

1 个答案:

答案 0 :(得分:2)

首先,在循环中删除是使用数据库的开头。你应该进行批量删除。

这样做的一种方法是将ID聚合成一个字符串$ values,格式为:id1,id2,id3,...然后执行类似

的操作

$query = "DELETE FROM wp_users WHERE ID in ($values)";

另一种方法是在wp_users表中添加一列来标记inActive用户。然后你会做一个软删除,这对数据库和服务器来说会容易得多。

您将运行更新语句设置inActive标志而不是DELETE语句,然后您只需通过电子邮件向活动用户发送电子邮件。

最后,由于您的代码已经在完成所有工作以找出真实用户,因此您只需使用相同的代码发送圣诞卡即可。因此,不是删除用户,只需邮寄真实的用户,而不是代码中的列表。