簡體   English   中英

更新我的表PHP / MySQL時出現問題

[英]An issue when update my table 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="love@stackoverflow.com" />

</form> 

MySQL模式:


 id 
 user_id
 tag 
 .... 

我想更新user_id = 1 tag ,所以我寫了這段代碼:
注意:表中只有一個用戶。



$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代碼嗎?

在第一個更新查詢中,將所有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++;
}

問題是您要更新其中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());

當然,這假定正在使用的表僅包含標簽信息。 如果沒有,那么...好吧...不要這樣做。

不,您錯過了SQL中的某些內容。 您的條件僅根據user_id進行過濾,因此您的UPDATE會更改user_id = 1的每條記錄。

您需要為數組中的每種標簽類型添加一列,以其結構化的方式,需要兩個選擇器

例如:

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

標簽類型將具有不同的值,具體取決於數組項

假設表已正確索引,則可以執行以下查詢:

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')

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM