1

我想将表单中的多条记录插入名为“user”的表中,并且从表单提交的“items”值在另一个表名“order”中不存在。“订单”表中只有 2 个字段,即 id 和 items。

这是我的代码:

INSERT INTO user (id, username, email, address, items)
SELECT '$username1', '$email1', '$address1', '$items1'
UNION ALL
SELECT '$username2', '$email2', '$address2', '$items2'
UNION ALL
SELECT '$username3', '$email3', '$address3', '$items3'
FROM DUAL 
WHERE NOT EXISTS(SELECT item FROM order)

假设“项目”表包含 2 组数据:

  id        items
1         table01 
2         chair01

所以当我插入数据时:

john, john@hotmail.com, 12, Street, nail01 
jennifer, jennifer@yahoo.com, 13, Street, table01
peter, peter@live.com, 14, Street, spoon01
(defintely these data are keyin in the form)

假设第二条记录不会插入到“用户”表中,因为“项目”表中已经包含该项目。但现在结果是第 1 和第 2 数据将插入到“用户”表中,而第 3 数据则没有。我用其他代码尝试了很多次,但仍然没有成功。

谁能给我一个建议?谢谢。

4

2 回答 2

0

这似乎是 Oracle 语法……是吗?

INSERT INTO user (id, username, email, address, items)

您需要插入 id 但不要这样做。如果它由序列和触发器填充,那没关系,但不需要插入它。

INSERT INTO user (username, email, address, items)
SELECT '$username1', '$email1', '$address1', '$items1'
UNION ALL
SELECT '$username2', '$email2', '$address2', '$items2'
UNION ALL
SELECT '$username3', '$email3', '$address3', '$items3'
FROM DUAL 
WHERE NOT EXISTS(SELECT item FROM order)
  • 您需要在每个联合部分中使用“FROM DUAL”
  • 您的 WHERE 子句仅影响第三个选择
  • 它也没有多大意义:'如果表格顺序中没有行,请选择这一行'。您将需要指定您的排除项。我添加了一个连接(WHERE a.items = items),所以现在只有在订单表中不存在该项目已经存在的行时才会插入一行。看起来很狡猾,您需要提供更多信息。

可能你的意思是

INSERT INTO user (username, email, address, items)
SELECT username, email, address, items FROM (
   SELECT '$username1' username, '$email1' email, '$address1' address, '$items1' items
     FROM DUAL
   UNION ALL
   SELECT '$username2' username, '$email2' email, '$address2' address, '$items2' items
     FROM DUAL
   UNION ALL
   SELECT '$username3' username, '$email3' email, '$address3' address, '$items3' items
     FROM DUAL
) a
WHERE NOT EXISTS(SELECT 1 FROM order WHERE a.items = items)

如果您的表“订单”在“项目”列上定义了唯一键,那么是的,当您尝试插入新项目时,您的插入将失败。更好的做法是首先查询您的订单表以检查该项目是否已经存在,如果不存在,则创建它。

就像 AdriftUniform 所说,需要更清晰的信息!

于 2011-09-23T09:58:23.693 回答
0

我对你想要做的事情有点困惑,如果我错了,请纠正我,但这是我从你的问题中理解的:

您想从表单将数据添加到用户表中,但您只想添加已订购项目表中尚不存在的项目的用户?

------ 现在确认了 ------

好吧,这就是我的做法。

所以您正在使用 POST 方法从表单中收集数据。

$_POST['email'] 等等。你想确保收集到的数据是 100% 干净的,所以我使用了我创建的一个方便的小 cleanString 函数......

function cleanString($var)
{
    $var = strip_tags($var); //Removes all HTML tags
    $var = htmlentities($var); //Converts characters into HTML entities
    $var = stripslashes($var); //Removes any backslashes
    return mysql_real_escape_string($var); // Escapes all special characters
}

并会像这样使用它...

$email = cleanString($_POST['email']);
$item = cleanString($_POST['item']);

ETC...

使用所有干净的数据,您现在要检查订单表中是否存在该项目。所以按照以下方式进行查询:

$query = "SELECT items FROM order WHERE items=".$item;
$result = mysql_query($query);

然后检查是否找到结果

if(mysql_num_rows($result) > 0)
{
    // Result found do not process...
}
else
{
    // Result not found, process...
    $query = "INSERT INTO user ...";
}

如果您一次执行多个插入,则可以将其全部包装在 while 或 foreach 循环中以一次性处理所有内容。虽然考虑到它来自一个表格,我猜你一次只有一个输入?

希望这可以帮助。

-------- 添加一个while循环 ------

所以你想一次性添加多条记录,这完全取决于你如何从表单中收集数据,要给出一个准确的答案,我需要更多关于你如何从表单中收集数据的信息。您是否有 3 个字段来一次添加 3 个人,或者您是否将所有数据保存到数组中以供以后处理?

如果您将所有内容都放入数组中,那么这些方面的内容将起作用

foreach ($array as $user)
{
    $item = $user['item']
    etc...

    $query = "SELECT items FROM order WHERE items=".$item;
    $result = mysql_query($query);

    if(mysql_num_rows($result) > 0)
    {
        // Result found do not process...
    }
    else
    {
        // Result not found, process...
        $query = "INSERT INTO user ...";
    }
}

这将逐个访问每个用户,获取该用户的所有数据,检查项目是否存在,如果不存在则处理。

您也可以使用 while 循环来执行此操作,但如果不知道您是如何获取数据的,这种方式很难解释

于 2011-09-23T09:37:02.160 回答