我正在制作私信消息应用程序,而我正在尝试创建一条已删除的消息'文件夹,以便用户想要从其收件箱或已发送文件夹中删除的邮件将被删除'。我设法编写代码来完全删除它们,但这不是我想要的。我在我的数据库中创建了另一个表,名为'已删除'所以我试图从收件箱中删除它们然后将它们插入那里。
这就是我现在所拥有的:
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服务器版本对应的手册,以便在#< WHERE id = 14'附近使用正确的语法。在第1行
答案 0 :(得分:1)
此脚本的输出为:
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子句以将其列为AND。
经过进一步的反思,这个ALSO将无法达到你想要的效果。您正在尝试将多个ID连接在一起,但SQL中的AND和OR的工作方式,这将无法实现您的尝试。 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 :(得分:0)
为什么要删除这个学校的语法。使用Triggers
类似的东西:
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
答案 2 :(得分:0)
只是一个想法 - 你也可以在你的桌子上添加一个列 - 也许是'DELETED_FLAG'? - 当您希望它显示为“已删除”时,您可以设置为“Y”。
从长远来看,这将节省一些复杂性。
答案 3 :(得分:0)
问题是您的查询中提到了两个WHERE
子句,如下所示。另外,从()
select part
$q = "insert into deleted
(select * from email where to_user = '$user')"; <-- Here
foreach($multiple as $msg_id)
{
if ($i==1) {
$q .= " WHERE id = ". mysql_real_escape_string($msg_id).""; <-- Here