2012-05-14 53 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子句中的條件。有關更多詳情,請參閱上述鏈接

相關問題