我有一个类似的数据库表
Id user_id folder product_ids
1 4 test1 2,3,4
2 4 test2 7,8,9
3 4 test3 10,11,12
在这里,我保存了以逗号分隔的产品ID。用户已经创建了这样的文件夹,并希望将一个或多个产品移动到另一个文件夹。比方说,如果用户想要,他可以选择产品id(8),并将其从测试2移动到测试3,结果集将如下所示:
Id user_id folder product_ids
1 4 test1 2,3,4
2 4 test2 7,9
3 4 test3 10,11,12,8
如何使用sql和php?
不幸的是,MySQL没有内置的REPLACEbyREGEX:(
注意:
请按您的表名更新PRODUCT_TABLE
这里有一个解决方案:
<?
/**
* @param String $folderSrc
* @param String $folderDst
* @param String $movedProductIds
* @param String $userId
* @return String Built SQL Query
*/
function buildSqlQueryMoveProductId ($folderSrc, $folderDst, $movedProductIds, $userId) {
return
"UPDATE PRODUCT_TABLE
SET PRODUCT_IDS =
CASE
WHEN FOLDER = '" . $folderSrc . "' THEN (REPLACE (REPLACE (REPLACE (PRODUCT_IDS, '," . $movedProductIds . "', ''), '" . $movedProductIds . ",', ''), '" . $movedProductIds . "', ''))
WHEN FOLDER = '" . $folderDst . "' THEN (CONCAT (IF (LENGTH(PRODUCT_IDS) > 0, CONCAT (PRODUCT_IDS, ','), '' ), '" . $movedProductIds . "'))
ELSE PRODUCT_IDS
END
WHERE USER_ID = " . $userId;
}
// Example
print moveProductId ('test1', 'test2', '3', 4);
尽量不要将逗号分隔的值存储在一列中。MySQL可以完美地处理大型表,因此您可以将每个产品ID作为单独的行输入。
您还可以创建多个表,例如一个表包含文件夹数据。然后,另一个表可以保存文件夹表的主键,以及产品ID和用户ID。
你在一张桌子上存放的东西越多,它就越没有条理。我不确定什么是最好的表现,但组织是关键,尤其是以后
编辑:
假设你创建一个这样的表:
ID User_ID Folder Product_ID
1 4 test1 2
2 4 test2 7
3 4 test3 10
您现在可以简单地查找Product_ID,并更新文件夹名称。因此,当您将产品ID传递到更新脚本时,您可以使用类似以下的查询:
UPDATE your_table_name SET Folder = :folder WHERE Product_ID = :pid
然后绑定文件夹名称和产品ID。如果你不熟悉准备好的陈述,请阅读这篇关于PDO的文章。我建议绑定这些值,就像您谈论的用户输入一样,它总是可以被操纵,从而可能导致安全漏洞。
<?php
/*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7"
*
*/
// product Ids. From where you want to remove id
$productOne="1,2,3,4,5";
// product Ids, From where you want to put id
$productTwo="6,7,8,9";
//product 1 array
$productOneArray=explode(",",$productOne);
//product 2 array
$productTwoArray=explode(",",$productTwo);
//Id which you want to change
$movingId = "5";
//Let's remove your product.
foreach ($productOneArray as $key=>$id){
if($id == $movingId){
unset($productOneArray[$key]);
}
}//BINGO !! you remove your id
//Add it to another product ids
array_push($productTwoArray,$movingId);
//Bingo You did it
//now turn both into string
$productOne=implode(",",$productOneArray);
$productTwo=implode(",",$productTwoArray);
//Update both the values in database
?>
如果你需要更多的印地语或古吉拉特语帮助,你可以问我。
如果你想移动多个ID
<?php
$name="parag";
if($name=="parag"){
echo uniqid().$name;
}
?>
<script>
$("div").css("width", "100px");
$("div").css("height", "100px");
</script>
<?php
echo "<pre>";
/*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7"
*
*/
// product Ids. From where you want to remove id
$productOne="1,2,3,4,5";
// product Ids, From where you want to put id
$productTwo="6,7,8,9";
//product 1 array
$productOneArray=explode(",",$productOne);
//product 2 array
$productTwoArray=explode(",",$productTwo);
//Id which you want to change
$movingId = "2,3,4";
$movingIdArray = explode(",", $movingId);
//Let's remove your product.
foreach($movingIdArray as $movingIds){
foreach ($productOneArray as $key=>$id){
if($id == $movingIds){
unset($productOneArray[$key]);
}
}//BINGO !! you remove your id
}
print_r($productOneArray);
//Add it to another product ids
array_push($productTwoArray,$movingId);
//Bingo You did it
//now turn both into string
$productOne=implode(",",$productOneArray);
$productTwo=implode(",",$productTwoArray);
//Update both the values in database
echo "productOne = ".$productOne."<br />";
echo "productTwo = ".$productTwo."<br />";
?>
为什么不在添加product_id时使用json_encode()。当您插入产品id时,只需对其进行编码并保存即可&从文件夹中移出时,读取json并对其进行解码。从json中添加或删除相应的id,然后再次保存到数据库
您得到了关于如何使用php代码实现这一点的答案。但您确实应该规范化您的数据库。规范化数据库只包含表,其中每个表都包含描述某个实体的数据,并通过外键与其他实体相关。您已经通过外键"user_id"连接了用户数据,现在继续将表重构到其他实体"文件夹"answers"产品"。
您的最终模式可能如下所示:
表格用户
user_id
user_name
etc.
表文件夹
folder_id
folder_name
user_id
etc.
桌上产品
product_id
folder_id
product_name
etc.
这样,要将产品从一个文件夹移动到另一个文件夹,只需更改products表中记录的folder_id即可。要从一个文件夹中提取所有产品,请使用联接:
SELECT folders.*, products.* from products
JOIN folders on folders.folder_id = products.folder_id
WHERE folders.folder_id = your_desired_folder_id
在这里阅读更多关于数据库规范化的信息,包括许多示例和为什么要这样做(尽管您已经面临问题):http://www.dbnormalization.com/
谨致问候,jojo