php - 在 PHP 中删除逗号分隔字符串中的值
问题描述
我在 SQL Server 中有如下表:
+--------------+----------------------------------------------+
| reportName | ShareWith |
+--------------+----------------------------------------------+
| IBM SH data | jack@gmail.com,alex@gmail.com,jan@gmail.com |
| Samsung Sr | alex@gmail.com,peter@gmail.com |
| Xiaomi MFG | |
| Apple US st | maria@gmail.com,alex@gmail.com |
| LG EU | fred@gmail.com |
+--------------+----------------------------------------------+
在我的 php 文件中,我有一个输入文本和一个按钮。当用户键入报告名称并单击按钮时,tt 将执行 ajax 调用以从所选报告中删除当前用户电子邮件。
在 SQL 中,它应该如下所示:
select shareWith, UpdatedshareWith =
case
when shareWith like 'alex@gmail.com,%' then REPLACE(shareWith, 'alex@gmail.com,', '')
when shareWith like '%,alex@gmail.com,%' then REPLACE(shareWith, ',alex@gmail.com,', ',')
when shareWith like '%,alex@gmail.com' then REPLACE(shareWith, ',alex@gmail.com', '')
when shareWith = 'alex@gmail.com' then ''
else shareWith
end
from table
where reportName = 'xxxx';
我正在尝试在 PHP 中动态应用它,但无法使其工作。
$('#button').on('click', function(){
var reportName = x;
var username = y;
$.ajax({
type: "POST",
url: "delete.php",
data: { reportName : reportName,
username : username },
success: function(data) { console.log(data); }
});
});
和delete.php如下:
$stmt = $conn->prepare("UPDATE table SET shareWith = CASE
WHEN shareWith like '?,%' THEN REPLACE(shareWith, '?,', '')
WHEN shareWith like '%,?,%' THEN REPLACE(shareWith, ',?,', ',')
WHEN shareWith like '%,?' THEN REPLACE(shareWith, ',?', '')
ELSE shareWith
END
WHERE reportName = ?");
$stmt->execute([$_POST['username'], $_POST['username'], $_POST['username'],
$_POST['username'], $_POST['username'], $_POST['username'], $_POST['reportName']]);
echo json_encode('deleted');
我相信有一种更清洁的方法可以做到这一点。任何建议请我应该在我的代码中更改什么?非常感谢。
解决方案
请尝试以下解决方案。
它将从 SQL Server 2012 开始工作。
它使用 XML 和 XQuery 来标记电子邮件列表,并删除不需要的电子邮件。您可以将其打包为带有两个参数的存储过程,@reportName和@emailToRemove。
CTE 完成所有繁重的工作:
- 将电子邮件列表转换为 XML 数据类型。
- 使用 XQuery 消除不需要的电子邮件。
- 转换回逗号分隔的电子邮件列表。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, reportName VARCHAR(30), ShareWith VARCHAR(1024));
INSERT INTO @tbl (reportName, ShareWith) VALUES
('IBM SH data', 'jack@gmail.com,alex@gmail.com,jan@gmail.com'),
('Samsung Sr', 'alex@gmail.com,peter@gmail.com'),
('Xiaomi MFG', ''),
('Apple US st', 'maria@gmail.com,alex@gmail.com'),
('LG EU', 'fred@gmail.com');
-- DDL and sample data population, end
DECLARE @reportName VARCHAR(30) = 'IBM SH data'
, @emailToRemove varchar(30) = 'alex@gmail.com'
, @separator CHAR(1) = ',';
;WITH rs AS
(
SELECT *
, REPLACE(TRY_CAST('<root><r><![CDATA[' +
REPLACE(ShareWith, @separator, ']]></r><r><![CDATA[') + ']]></r></root>' AS XML)
.query('
for $x in /root/r[lower-case((./text())[1]) ne lower-case(sql:variable("@emailToRemove"))]
return data($x)
').value('.', 'VARCHAR(MAX)'), SPACE(1), @separator) AS modifiedShareWith
FROM @tbl
WHERE reportName = @reportName
)
UPDATE t
SET ShareWith = rs.modifiedShareWith
FROM @tbl AS t
INNER JOIN rs ON t.id = rs.id;
-- test
SELECT * FROM @tbl;
输出
+----+--------------+--------------------------------+
| ID | reportName | ShareWith |
+----+--------------+--------------------------------+
| 1 | IBM SH data | jack@gmail.com,jan@gmail.com |
| 2 | Samsung Sr | alex@gmail.com,peter@gmail.com |
| 3 | Xiaomi MFG | |
| 4 | Apple US st | maria@gmail.com,alex@gmail.com |
| 5 | LG EU | fred@gmail.com |
+----+--------------+--------------------------------+
推荐阅读
- postgresql - 在将记录集插入数据库之前,Postgres 将附加字段添加到数组中的 json 有效负载索引
- python - JSONDecoder 错误 - 使用 Python 访问 Google Translate API 时
- javascript - 反应路由器本机错误,意外令牌
- google-app-engine - 谷歌云存储 - 公共对象 url e 超慢更新
- wordpress - 带有后备功能的 WordPress 简码
- node.js - 当 schema.index 过期时 Mongoose 删除所有子文档
- python - 安装 Anaconda 时找不到 Python 安装文件夹
- python - Python:检查文件中是否有特定的文本行
- javascript - Chart.js yAxes Ticks stepSize 不起作用(小提琴)
- c - Why lex invokes yyerror while parsing comma separated values?