You need to enable JavaScript to run this app. SQL Server存储过程如何处理PHP表单字符串实现IN条件更新
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程如何处理PHP表单字符串实现IN条件更新

问题根因梳理
  • 原有存储过程的逻辑缺陷:将前端传入的逗号拼接完整PPM字符串直接存入临时表,临时表仅保留1行整串文本,没有拆分出单个独立的引用编号,后续IN匹配时会拿整串文本和单值格式的WebReference字段比对,永远无法命中匹配。
  • 第二种尝试方案的失效原因:从审计表取出的PPM字段同样是整段拼接的长文本,IN子句不会自动将长文本按分隔符拆分为多个独立匹配项,无法完成批量匹配。
  • 安全说明:只要不通过字符串拼接构造动态SQL语句,直接使用拆分后的固定值列表关联匹配,完全不存在SQL注入风险,无需依赖特殊的动态转义处理。
存储过程改造方案

适配SQL Server 2016+ 环境(推荐,无额外自定义代码)

利用SQL Server内置的STRING_SPLIT函数完成字符串拆分,改造后的存储过程直接替换原有逻辑即可:

ALTER PROCEDURE [dbo].[TestingPPMRemovals]
    @EditedBy varchar(25),
    @PPMsList varchar(max)
AS
BEGIN
    SET NOCOUNT ON;

    -- 按原逻辑保留审计日志,记录传入的完整PPM列表
    INSERT INTO PPMsEdit_AuditTrail (EditedBy, EditDate, PPMsEdited) 
    VALUES (@EditedBy, GETDATE(), @PPMsList)

    -- 拆分传入的逗号分隔字符串,关联匹配完成批量更新
    UPDATE j
    SET 
        StatusRefNo = 4, 
        EditUserRefNo = 1114 
    FROM jobs j
    INNER JOIN STRING_SPLIT(@PPMsList, ',') split_result
        ON j.WebReference = LTRIM(RTRIM(split_result.value))
END

细节说明:拆分后对每个值做前后空格裁剪,适配前端传值时可能出现的逗号后带空格的输入格式,避免无意义的匹配失败。

低版本SQL Server 兼容方案

如果数据库兼容级别低于130、无法使用内置STRING_SPLIT函数,可以先创建一个通用的字符串拆分表值函数,仅需执行一次永久留存:

CREATE FUNCTION [dbo].[fn_SplitCommaString]
(
    @InputText VARCHAR(MAX),
    @Delimiter CHAR(1)
)
RETURNS @SplitResult TABLE (SingleValue VARCHAR(MAX))
AS
BEGIN
    DECLARE @StartIndex INT = 1, @DelimiterPos INT
    IF @InputText IS NULL RETURN

    WHILE CHARINDEX(@Delimiter, @InputText, @StartIndex) > 0
    BEGIN
        SET @DelimiterPos = CHARINDEX(@Delimiter, @InputText, @StartIndex)
        INSERT INTO @SplitResult (SingleValue)
        VALUES (LTRIM(RTRIM(SUBSTRING(@InputText, @StartIndex, @DelimiterPos - @StartIndex))))
        SET @StartIndex = @DelimiterPos + 1
    END

    -- 处理拆分末尾无分隔符的最后一个值
    INSERT INTO @SplitResult (SingleValue)
    VALUES (LTRIM(RTRIM(SUBSTRING(@InputText, @StartIndex, LEN(@InputText) - @StartIndex + 1))))
    RETURN
END

存储过程内的关联逻辑替换为调用自定义拆分函数即可:

UPDATE j
SET 
    StatusRefNo = 4, 
    EditUserRefNo = 1114 
FROM jobs j
INNER JOIN dbo.fn_SplitCommaString(@PPMsList, ',') split_result
    ON j.WebReference = split_result.SingleValue
前端PHP代码的必须修正点
  • 参数顺序错误:存储过程定义的参数顺序是@EditedBy在前,@PPMsList在后,但原有PHP代码传参顺序为PPM列表在前、编辑人在后,和存储过程参数顺序完全不匹配,需要将参数数组调整为array($EditedBy, $PPMsList)。
  • 连接变量错误:代码中sqlsrv_connect返回的连接对象赋值给了$sqlsrv变量,但后续调用sqlsrv_query时使用了未定义的$conn变量,会导致查询直接报错,需要统一替换为实际存在的连接变量$sqlsrv。
  • 测试验证方法:改造完成后可先在数据库手动执行测试语句,传入你预期的PPM列表检查更新结果是否正确,再联调前端表单功能。

内容的提问来源于stack exchange,提问作者pc90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 16:06:07