更新我的表PHP/MySQL时出现问题
我希望我的问题足够清晰和完美,不会让选票下降,甚至不会被关闭 我有简单的HTML表单:更新我的表PHP/MySQL时出现问题,php,mysql,arrays,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
<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>
我想为用户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代码中是否遗漏了一些内容?问题是您正在更新所有记录,其中用户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中遗漏了一些内容。您的条件仅根据用户id进行过滤,因此您的更新会更改用户id为1的每条记录。在第一次更新查询中,您将用户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++;
}
您需要为数组中的每种标记类型添加一列,按照其结构方式,您将需要两个选择器 例:
根据数组项的不同,标记类型会有不同的值假定表已正确索引,则可以执行以下查询:
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')
我不会评论你的代码,因为它显然不是真实的,但请不要忘记正确地转义输入数据。my bad。所以我需要发送每个
id
和每个标记,然后更新它们?您需要重新设计您的表,使其更加规范化。您正在为每个用户存储同一数据的多个副本,这会浪费空间,并可能导致一些严重的数据不一致。是的,我应该这样做-再次感谢您的惊人帮助,我对此表示感谢
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')