Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新我的表PHP/MySQL时出现问题_Php_Mysql_Arrays - Fatal编程技术网

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

更新我的表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

我希望我的问题足够清晰和完美,不会让选票下降,甚至不会被关闭

我有简单的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> 
我想为
用户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')