我希望我的问题能够清晰而完美,不会降低选票 - 甚至是关闭状态。
我有简单的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代码中的某些内容?
答案 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')
我不会评论你的代码,因为它显然不是真的,但请不要忘记正确地转义输入数据。