2011-09-23 19 views
1

我想從窗體插入多個記錄到名爲'user'的表中,其中從表單提交的'items'值不存在於另一個表名'order'中。 'order'表中只有2個字段是id和items。插入多個值與WHERE不存在的問題

這裏是我的代碼:

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組IT數據:

id  items 
1   table01 
2   chair01 

所以,當我插入數據有:

john, [email protected], 12, Street, nail01 
jennifer, [email protected], 13, Street, table01 
peter, [email protected], 14, Street, spoon01 
(defintely these data are keyin in the form) 

Supposely第二條記錄不會插入'user'表中,因爲'items'表中已經包含這個項目。 但是現在結果是第一個和第二個數據會插入'用戶'表,而第三個數據不會。我用其他代碼嘗試了很多次,但仍然不成功。

任何人都可以給我一個建議嗎? 謝謝。

+0

+1標籤組合。 – Jamiec

回答

0

我與你正在嘗試做的有點糊塗了,糾正我,如果我錯了,但是這是我從你的問題的理解:

要將數據從一個窗體添加到一個用戶表,但是您只想添加具有訂單項的用戶,而該項目在項目表中尚不存在?

------現在,這證實了------

右鍵嗯,這是我會怎麼做呢。

因此您使用POST方法從窗體收集數據。

$ _POST ['email']等等。你要確保收集的數據是100%乾淨,所以我用我創建了一個handly小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']); 

等...

與您現在要檢查項目是否存在於訂單表中的所有乾淨數據。所以做沿着這些線路查詢:

$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 ..."; 
} 

在一個去,你都可以在一段時間或foreach循環來包裝這一氣呵成地處理它。儘管考慮它來自一個表單,我猜你一次只能有1個輸入?

希望這有助於。

-------加入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循環做到這一點,但這種方式是很難不知道你是如何獲取數據

+0

是的..這就是我的意思。 – temperance

+0

現在更新m8,看看是否有幫助 – lukehillonline

+0

我需要插入多個記錄是,這意味着我需要寫$ query =「SELECT items FROM order WHERE items =」。$ item1 OR items =「。item2 OR items =」。item3 ;等等? – temperance

0

這似乎是甲骨文的語法解釋......是嗎?

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說,需要更清晰的信息!

+0

我使用的PHP不是用於oracle ..所以沒有必要使用INSERT但是SELECT?什麼是'a'代表?我是PHP新手和mysql ..感謝您的幫助! – temperance

+0

a是select語句子查詢的別名,並且必須在'not exists'子句中引用它。哦,你需要插入當然,我的選擇只是你插入語句的子集。生病編輯。雖然我不認爲我的答案是相關的,但你用AdriftUniform清理它之後! – Tom