更新我的表PHP / MySQL时的问题

时间:2011-07-27 17:05:48

标签: php mysql arrays

我希望我的问题能够清晰而完美,不会降低选票 - 甚至是关闭状态。

我有简单的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 
 .... 

我想为tag更新user_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代码中的某些内容?

5 个答案:

答案 0 :(得分: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++;
}

答案 1 :(得分: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());

当然,这假设所使用的表仅包含标签信息。如果没有,那么......好吧......不要这样做。

答案 2 :(得分:0)

不,你错过了SQL中的一些东西。您的条件仅过滤user_id,因此您的UPDATE会更改每条记录,其中user_id = 1。

答案 3 :(得分:0)

您需要为数组中的每个标记类型添加一列,结构的方式,您需要两个选择器

例如:

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

标记类型将具有不同的值,具体取决于数组项

答案 4 :(得分: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')

我不会评论你的代码,因为它显然不是真的,但请不要忘记正确地转义输入数据。