将数据从一个表插入到另一个php sql

将数据从一个表插入到另一个php sql,php,mysql,Php,Mysql,我正在制作一个私人邮件应用程序,并尝试创建一个“已删除邮件”文件夹,以便用户希望从其收件箱或已发送文件夹中删除的邮件转到“已删除”。我设法写代码完全删除他们,但这不是我想要的。我在数据库中创建了另一个名为“deleted”的表,因此我尝试从收件箱中删除它们,然后将它们插入其中 这就是我到目前为止所拥有的: if ( isset($_GET['delete'])) { $multiple = $_GET['multiple']; $i=0; $q = "insert into delet

我正在制作一个私人邮件应用程序,并尝试创建一个“已删除邮件”文件夹,以便用户希望从其收件箱或已发送文件夹中删除的邮件转到“已删除”。我设法写代码完全删除他们,但这不是我想要的。我在数据库中创建了另一个名为“deleted”的表,因此我尝试从收件箱中删除它们,然后将它们插入其中

这就是我到目前为止所拥有的:

if ( isset($_GET['delete'])) {
    $multiple = $_GET['multiple'];

$i=0;
$q = "insert into deleted  (select * from email where to_user = '$user')";
foreach($multiple as $msg_id) 
{ 
        $i++;

    if ($i==1) {
        $q .= " WHERE id = ". mysql_real_escape_string($msg_id)."";
    } else {
        $q .= "OR  id = ". mysql_real_escape_string($msg_id)."";
    }
}

mysql_query($q) or die (mysql_error());
header("location: " .$_SERVER['PHP_SELF']);
exit();
}
它给了我这个错误:


您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行“WHERE id=14”附近使用的正确语法。使用触发器

大概是这样的:

CREATE TRIGGER `my_insert_table2_trigger`     
  AFTER DELETE ON `table1`     
  FOR EACH ROW     
BEGIN
  INSERT INTO `table2` VALUES (OLD.id, OLD.Column_with_value)
END

只是一个想法-您也可以在表中添加一列-“DELETED_FLAG”也许可以当您希望它显示为“已删除”时,可以将其设置为Y

从长远来看,这将节省一些复杂性。

问题是您的查询中提到了两个WHERE子句,如下所示。另外,从“选择零件”中删除这些


此脚本的输出将是:

insert into deleted  (select * from email where to_user = '$user') WHERE id = 14
insert子句上不能有WHERE。您可能正在寻找的是:

insert into deleted  (select * from email where to_user = '$user' AND id = 14)
您可以通过调整右括号的位置,并将WHERE子句改为列为和来说明这一点

进一步考虑,这也不会实现您想要的。您正试图将多个ID连接在一起,但在SQL工作的方式和/或中,这将无法完成您正在尝试的操作。OR语句需要用括号括起来,以确保它被AND语句抓住,如下所示:

INSERT INTO deleted  (SELECT * FROM email WHERE to_user = '$user' AND (id = 14 OR id = 15))
您的代码应如下所示:

$q = "insert into deleted  (select * from email where to_user = '$user' ";
foreach($multiple as $msg_id) 
{ 
    $i++;

    if ($i==1) {
        $q .= " AND (id = ". mysql_real_escape_string($msg_id)."";
    } else {
        $q .= " OR  id = ". mysql_real_escape_string($msg_id)."";
    }
}
$q .= "))"; // Closing out both brackets

如果删除了,为什么不添加另一列呢?如果使用1 yes或0 no,则在删除或删除SELECT周围的括号之前将丢失空白。不过,根据系统的大小,如果继续将删除的邮件与活动邮件存储在同一个表中,则可能会导致性能下降。我以前遇到过这个问题,为了提高性能和可扩展性,我通常会将主活动表中不活动的数据归档。这是公平的-虽然我认为在看到真正的成功之前,应用程序的大小必须相当大。是的,但最好在开始开发该功能,然后在以后尝试将其破解。我的全部工作是升级遗留系统,有人说我们永远不会有那么多数据,现在他们有了。我的工作非常相似。有时候很痛。我同意你的观点——未来是不可能知道的。不过,我倾向于根据问题中给出的代码级别提供答案。我认为,在这种情况下,我们的OP正在学习诀窍——这么简单就更好了。$q=插入已删除的id,从用户,到用户,主题,消息选择id,从用户,到用户,主题,电子邮件消息;我不得不从查询中删除日期和列“read”布尔值,结果成功了。实际上,我成功地插入了要删除文件夹的行,但现在我不得不从inboxIt中删除它们。同样,mysql_uu命令已被弃用,并且将要消失,因此,您应该使用准备好的语句来代替PDO之类的语句。
$q = "insert into deleted  (select * from email where to_user = '$user' ";
foreach($multiple as $msg_id) 
{ 
    $i++;

    if ($i==1) {
        $q .= " AND (id = ". mysql_real_escape_string($msg_id)."";
    } else {
        $q .= " OR  id = ". mysql_real_escape_string($msg_id)."";
    }
}
$q .= "))"; // Closing out both brackets