用于使用php从数据库中的列中删除逗号分隔值的函数

用于使用php从数据库中的列中删除逗号分隔值的函数,php,mysql,Php,Mysql,我的数据库中有一个表,其中包含两个字段,如UserID和movieid。我用php编写了一个函数,用于插入和更新表,其中MovieID是一个字段,可能包含许多用逗号分隔的值,类似地,我需要一个从表中删除值的函数,我用于插入和更新表中的值的函数如下所示: <?php addmovietowatchlist(2,36546436); function addmovietowatchlist($userid, $movieid) { $con=mysql_connect('localho

我的数据库中有一个表,其中包含两个字段,如UserID和movieid。我用php编写了一个函数,用于插入和更新表,其中MovieID是一个字段,可能包含许多用逗号分隔的值,类似地,我需要一个从表中删除值的函数,我用于插入和更新表中的值的函数如下所示:

<?php

addmovietowatchlist(2,36546436);

function addmovietowatchlist($userid, $movieid)
{
  $con=mysql_connect('localhost','username','password');
if(!$con)
{
    die('could nt connect 2 the server');
}
mysql_select_db("database", $con);


$useriddb = mysql_query("select MovieIDs from tbl_user_watchlist WHERE UserID = ".$userid);
$count = mysql_num_rows($useriddb);
if($count>0)
{
$mids=mysql_fetch_assoc($useriddb);
$listarr=explode(",",$mids['MovieIDs']);

array_push($listarr, $movieid);
$finallist=implode(",",$listarr);

//update
$result = mysql_query("UPDATE tbl_user_watchlist SET MovieIDs = '".$finallist."' WHERE  UserID = ".$userid);
  if($result)
  echo "updated sucessfully";
}
else{
//insert
$result = mysql_query("INSERT INTO tbl_user_watchlist (UserID,MovieIDs) values (".$userid.",'".$movieid."')");
  echo "inserted successfully";
}

}
?>

正确的方法是将内容分为两个表。可以保存当前表中的所有信息,但不能保存逗号分隔的列表。相反,另一个表将有两列,一列指定它所属的列表(例如,第一个表中的行的ID…或者如果一个用户的列表不超过一个,您可以使用userid),然后一列指定电影

也就是说,如果要更改当前系统需要做的工作太多,并且/或者您一定要坚持使用劣质且低效的数据库结构,则可以在当前设置中使用此功能。基本上,您需要找到您所关注的电影ID的所有引用,然后手动调整与这些匹配对应的列表,然后用新列表更新所有这些行。这需要大量的额外代码,并浪费大量的处理时间(随着应用程序的增长,这可能会成为应用程序的主要瓶颈),但这是可能的

进行调整的最简单方法是在现有列表上进行字符串替换。因此,一旦选择了当前列表,请执行以下操作:

$newList = str_replace($movie_id_to_delete.",", "", $oldList);

$result = mysql_query("UPDATE tbl_user_watchlist SET MovieIDs = '".$newList."' WHERE MovieIDs ='".$oldList."' AND UserID = ".$userid);

根据您的实现,检查
$newList
是否为空,如果为空,则删除整行(而不是像我上面所做的那样更新movieid)。

正确的方法是将内容分成两个表。可以保存当前表中的所有信息,但不能保存逗号分隔的列表。相反,另一个表将有两列,一列指定它所属的列表(例如,第一个表中的行的ID…或者如果一个用户的列表不超过一个,您可以使用userid),然后一列指定电影

也就是说,如果要更改当前系统需要做的工作太多,并且/或者您一定要坚持使用劣质且低效的数据库结构,则可以在当前设置中使用此功能。基本上,您需要找到您所关注的电影ID的所有引用,然后手动调整与这些匹配对应的列表,然后用新列表更新所有这些行。这需要大量的额外代码,并浪费大量的处理时间(随着应用程序的增长,这可能会成为应用程序的主要瓶颈),但这是可能的

进行调整的最简单方法是在现有列表上进行字符串替换。因此,一旦选择了当前列表,请执行以下操作:

$newList = str_replace($movie_id_to_delete.",", "", $oldList);

$result = mysql_query("UPDATE tbl_user_watchlist SET MovieIDs = '".$newList."' WHERE MovieIDs ='".$oldList."' AND UserID = ".$userid);

根据您的实现,可以检查
$newList
是否为空,如果为空则删除整行(而不是像我上面所做的那样更新movieid)。

使用php或任何其他语言,只需运行下面提到的单个查询即可,查询的详细参考在链接中

查询应该是这样的,它覆盖逗号分隔列中的值、值或值,或仅包含值

UPDATE yourtable SET categories = TRIM(BOTH ',' FROM REPLACE( REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',') ) WHERE FIND_IN_SET('2', categories) 更新您的表 设置 类别= 修剪(两个),从 替换( 替换(CONCAT(“,”,替换(列“,”,“,”,”,“,”,”,“,”),“,”,”,”,“,”,”,”) ) 哪里 在_集合中查找_('2',类别)
在这里,您可以在where子句中得到您的条件。有关更多详细信息,请参阅上面的链接。

使用php或任何其他语言,可以通过单个查询来完成,您只需按如下所述运行单个查询,查询的详细参考位于链接中

查询应该是这样的,它覆盖逗号分隔列中的值、值或值,或仅包含值

UPDATE yourtable SET categories = TRIM(BOTH ',' FROM REPLACE( REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',') ) WHERE FIND_IN_SET('2', categories) 更新您的表 设置 类别= 修剪(两个),从 替换( 替换(CONCAT(“,”,替换(列“,”,“,”,”,“,”,”,“,”),“,”,”,”,“,”,”,”) ) 哪里 在_集合中查找_('2',类别)
在这里,您可以在where子句中得到您的条件。有关更多详细信息,请参阅上面的链接。

不要对多对多关系使用CSV,请使用另一个表-尝试使用CSV会导致您遇到的确切问题。创建一个名为
UserMovies
的表,其中包含一个字段
UserID
和一个字段
MovieID
。然后,您可以将每个关系存储在单独的行中,当需要删除它们时,您可以从UserID=x和MovieID=y的UserMovies中删除它们。如果您仍然需要获取CSV列表,您可以
JOIN
groupby
GROUP_CONCAT()
还需要注意的是
从tbl_user_监视列表中删除电影ID,其中UserID=x
无效-您不能删除单个列,只能删除整行。如果需要删除列的值,
UPDATE tbl\u user\u watchlist SET MovieIDs=NULL,其中UserID=x
感谢您的建议@DaveRandom我尝试使用给定的查询..但是在这种情况下,行中的所有值都被删除..我只想从MovieIDs行中删除指定的值..有人能帮我吗..@DaveRandom:应该删除该注释答案。你完全正确。不要对多对多关系使用CSV,请使用另一个表-尝试使用CSV会导致您遇到的确切问题。创建一个名为
UserMovies
的表,其中包含一个字段
UserID
和一个字段
MovieID
。然后,您可以将每个关系存储在单独的行中,当需要删除它们时,您可以从UserID=x和MovieID=y的UserMovies中删除它们。如果你还需要CS