2012-05-14 21 views
0

我在我的数据库中有一个表,其中包含两个字段,如UserID & MovieID。我在php中编写了一个函数,用于插入和更新表格,其中MovieID是可以包含许多由逗号分隔的值的字段,同样需要一个用于从表中删除值的函数,用于插入和更新的函数在表中的值如下所示:函数用于从数据库中的列中删除逗号分隔值使用php

<?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"; 
} 

} 
?> 

现在,我需要写一个函数用逗号,如果已经是值插入该行沿着从删除表中的值...谁能帮助我在写代码... 我试着写下面的代码,但它没有奏效....请帮助我摆脱这个..

function deletemovietowatchlist($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=implode(",",$mids); 
//echo $listarr; 
//array_pop($listarr, $movieid); 
$finallist=explode(",",$listarr); 
echo $finallist; 
$result = mysql_query("DELETE MovieIDs FROM tbl_user_watchlist WHERE UserID=".$userid); 
    if($result) 
    echo "deleted successfully"; 
} 


} 
+5

不要将CSV用于多对多的关系,请使用其他表格 - 尝试使用CSV会导致您遇到的确切问题。使用字段UserID和字段MovieID创建一个名为UserMovies的表。然后,您可以将每个关系存储在单独的行中,并且当您需要删除它们时,您可以“删除UserMovies WHERE UserID = x AND MovieID = y”。如果您仍然需要获取CSV列表,您可以'JOIN','GROUP BY'和'GROUP_CONCAT()' – DaveRandom

+0

另请注意,'DELETE MovieIDs FROM tbl_user_watchlist WHERE UserID = x'无效 - 您无法删除单个列,只有一整行。如果你需要删除列的值,'UPDATE tbl_user_watchlist SET MovieIDs = NULL WHERE UserID = x' – DaveRandom

+0

感谢您的建议@DaveRandom我尝试通过使用给定的查询..但在这种情况下,该行中的所有值正在被删除..我想从MovieIDs行只删除指定的值... –

回答

2

正确的做法是将事情分成两个表格。一个会保存当前表中的所有信息,除非它不包含逗号分隔列表。相反,另一个表将有两列,一列指明它属于哪个列表(例如,第一个表中的行的ID ......或者如果用户从未有多于一个列表,则可以使用userid),以及然后是电影的专栏。也就是说,如果改变现有系统的工作量太大,或者您决定坚持使用低效的低效率数据库结构,那么可以在当前的设置中使用此功能。基本上,您需要找到您所关注的movieid的所有引用,然后手动调整与这些匹配相对应的列表,然后使用新列表更新所有这些行。这是很多额外的代码,并浪费了大量的处理时间(以至于它可能成为应用程序增长的主要瓶颈),但这是可能的。

进行调整的最简单方法是在现有列表上进行字符串替换。所以,一旦你选择当前列表,做这样的事情:

$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是空的,删除整个行(而不是更新MovieIDs如上所述),如果它是空的。

+0

是的...整个行不应该被删除,即使那里$ newList是空的userID行应该在那里...并感谢您的帮助... –

0

使用PHP或任何其他语言也可以用单一的查询来完成,你只需要运行一个查询,如下文所述,查询的详细引用是链接 The best way to remove value from SET field?

查询应该是这样的这里面涵盖了逗号,价值或价值,或者只看重分离柱

 
UPDATE yourtable 
SET 
    categories = 
    TRIM(BOTH ',' FROM 
     REPLACE(
     REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',') 
    ) 
WHERE 
    FIND_IN_SET('2', categories) 

在这里,你可以在where子句中的条件。有关更多详情,请参阅上述链接

相关问题