2011-07-27 47 views
0

我希望我的問題能夠清晰完善,不會打擾投票 - 甚至是關閉狀態。更新我的表時遇到問題PHP/MySQL

我有簡單的HTML表單:

<form ..> 
    <input type="hidden" name="user_id" value="1" /> 

    <input type="text" name="tag[]" value="css" /> 
    <input type="text" name="tag[]" value="php" /> 
    <input type="text" name="tag[]" value="sql" /> 

    ... 

    <input type="text" name="email" value="[email protected]" /> 

</form> 

的MySQL架構:

 

id 
user_id 
tag 
.... 
 

我想更新taguser_id = 1,所以我寫這樣的代碼:
注:我只有一個表中的用戶。

 


$user_id = $_POST['user_id']; 
$tag  = mysql_escape_string($_POST['tag']); // $tag is an array - print $tag 
$email = $_POST['email']; 

foreach($tag as $value) { 
    $DB = "UPDATE table SET tag = '$value' AND email = '$email' 
      WHERE user_id = '$user_id'"; 
    .... // run the query 
} 


 

我得到:

 

id user_id tag 
1 1   sql 
2 1   sql 
3 1   sql 
 

相反的:

 

id user_id tag 
1 1   css 
2 1   php 
3 1   sql 
 

我想問如果我錯過了PHP代碼的東西嗎?

回答

1

在第一次更新查詢中,您將user_id爲1(全部3個)的所有記錄設置爲「css」,然後「 PHP「,最後是」SQL「。 foreach循環結束後,他們都是「SQL」

你可以試試這個:

$i = 1; 
foreach($tag as $value) { 
    $DB = "UPDATE table SET tag = '$value' WHERE user_id = '$user_id' AND id=$i"; 
    .... // run the query 
    $i++; 
} 
+0

謝謝。現在我明白了爲什麼。 – Cheerio

+0

Np,很高興提供幫助 –

0

問題是,您正在更新user_id爲特定值的所有記錄。因此,如果您要在foreach循環的每個階段中斷腳本,您會看到列出3個css標籤,然後是3個php標籤,並以3個sql標籤結尾。

對於這種事情,我傾向於走容易的路線 - 開始交易,刪除舊的標籤,並插入新的,提交和完成。否則,你不得不確定哪些標籤是新的,哪些標籤是陳舊的,並執行適當的插入/刪除命令來使事物同步。

因此,基本上,你會做這樣的事情:

mysql_query("start transaction;") or die(mysql_error()); 
mysql_query("Delete from yourtable WHERE user_id=$user_id") or die(mysql_error()); 

$newtags = array(); 
foreach ($_POST['tag'] as $tag) { 
    $escaped = "($user_id, " . mysql_real_escape_string($tag) . ")"; 
} 
if (count($escaped) > 0) { 
    $values = implode(',', $escaped); 
    $sql = "INSERT INTO yourtable (user_id, tag) VALUES $values"; 
    mysql_query($sql) or die(mysql_error()); 
} 
mysql_query("commit;") or die(mysql_error()); 

當然,這假設正在使用的表僅保留標籤信息。如果沒有,那麼......好吧......不要這樣做。

+0

問題是,我有其他領域'電子郵件'+'full_name' ... – Cheerio

+0

你需要重新設計你的表更加規範化。您爲每個用戶存儲相同數據的多個副本,這會浪費空間,並可能導致一些令人討厭的數據不一致。 –

+0

是的,我應該這樣做 - 再次感謝你的驚人的幫助我欣賞它 – Cheerio

0

不,你錯過了SQL中的某些東西。您的條件僅對user_id進行過濾,因此您的UPDATE會更改user_id = 1的每條記錄。

+0

我的壞。所以我需要發送每個'ID'與每個'標籤',然後更新它們? – Cheerio

0

您需要在陣列中添加一列每個標籤類型,你擁有了它的結構化的方式,你將需要兩個選擇

例如:

$DB = "UPDATE table SET tag = '$value' WHERE user_id = '$user_id' AND tag_type='1'"; 

標籤類型將根據各自的數組項不同的值

0

假設你的表是正確的索引,你可以做這些查詢:

INSERT IGNORE INTO `table` (user_id, tag) 
VALUES (1, 'css'), (1, 'php') 

...和:

DELETE FROM `table` 
WHERE user_id=1 
AND tag NOT IN ('css', 'php') 

我不會評論你的代碼,因爲它顯然不是真實的,但請不要忘記正確地轉義輸入數據。