我正在制作一个私人消息应用程序,我正在尝试创建一个'已删除消息'文件夹,以便用户想要从收件箱或发送文件夹中删除的消息转到'已删除'。我设法编写代码完全删除它们,但这不是我想要的。我在我的数据库中创建了另一个表,名为'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'附近使用正确的语法
这个脚本的输出将是:
insert into deleted (select * from email where to_user = '$user') WHERE id = 14
插入子句上不能有WHERE。您可能要找的是:
insert into deleted (select * from email where to_user = '$user' AND id = 14)
可以通过调整右括号的位置,并将WHERE子句调整为and来解释
进一步考虑,这也不会达到你想要的效果。您正在尝试将多个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
为什么要从这个学校删除语法。使用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
只是一个想法-您也可以添加一个列到您的表- 'DELETED_FLAG'也许?-你可以设置为"Y",当你想要它显示为"已删除"
问题是您的查询中有两个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