Php 将表单中的字符串用作存储过程(SQL Server)中的参数

Php 将表单中的字符串用作存储过程(SQL Server)中的参数,php,sql,sql-server,stored-procedures,sqlsrv,Php,Sql,Sql Server,Stored Procedures,Sqlsrv,我一直在试着按照这个问题()和这个问题()的例子来做,但到目前为止还没有什么乐趣。我一直在深入研究更复杂的SQL查询(仍在学习中),希望在此方面得到一些建议/指导 我试图从网页(PHP)上提交的表单中提取一个字符串,进入存储过程中更新查询的where子句。最终目标是将所有提供的参考号更改为statusrefno 4(将其标记为已关闭的租赁产品) 这是完整的存储过程 ALTER PROCEDURE [dbo].[TestingPPMRemovals] @EditedBy varchar (

我一直在试着按照这个问题()和这个问题()的例子来做,但到目前为止还没有什么乐趣。我一直在深入研究更复杂的SQL查询(仍在学习中),希望在此方面得到一些建议/指导

我试图从网页(PHP)上提交的表单中提取一个字符串,进入存储过程中更新查询的where子句。最终目标是将所有提供的参考号更改为statusrefno 4(将其标记为已关闭的租赁产品)

这是完整的存储过程

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

    CREATE table #tempPPMs (PPMs varchar(max))
    INSERT INTO #tempPPMs (PPMs) VALUES (@PPMsList)

    INSERT INTO PPMsEdit_AuditTrail (EditedBy, EditDate, PPMsEdited) 
    VALUES (@EditedBy, getdate(), @PPMsList)

    UPDATE jobs 
    SET StatusRefNo = 4, EditUserRefNo = 1114 
    WHERE WebReference IN (SELECT * FROM #tempPPMs) 

END
这些web引用的列表在查询中类似于此

UPDATE jobs 
SET StatusRefNo = 4, EditUserRefNo = 1114 
WHERE WebReference IN ('PPM-372046', 'PPM-372053', 'PPM-372072', 'PPM-372076', 'PPM-372077', 'PPM-372078')
我知道“IN”与存储过程不兼容,虽然SQL注入的风险非常低,因为此网页只能在本地访问,但我希望尽可能消除这种风险

我尝试的另一种查询方法也不起作用,这里就是-

INSERT INTO PPMsEdit_AuditTrail (EditedBy, EditDate, PPMsEdited) 
VALUES (@EditedBy, getdate(), @PPMsList)

UPDATE jobs 
SET StatusRefNo = 4, EditUserRefNo = 1114 
WHERE WebReference IN (
   SELECT Top 1 PPMsEdited 
   FROM PPMsEdit_AuditTrail 
   ORDER BY EditDate desc
)   
下面是我的PHP中的相关部分,以防上下文需要它-

$sqlsrv = sqlsrv_connect($serverName, $connectionInfo) or die(sqlsrv_error($sqlsrv));
$update = false;
$EditedBy = '';
$PPMsList = '';
$tsql = 'exec TestingPPMRemovals ?, ?';


if (isset($_POST['update'])){
    $PPMsList = $_POST['PPMsList'];
    $EditedBy = $_POST['EditedBy'];    
    
    $params = array($PPMsList, $EditedBy);
    $result = sqlsrv_query($conn, $tsql, $params);
    if ($result === false) {
        die( print_r( sqlsrv_errors(), true) );
        $response = array('response'=>'notok', 'data'=>'loyo');
        $serverresponse = json_encode($response);
    } else {
        $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_NUMERIC);
        $response = array('response'=>'ok', 'data'=>$row[0]);
        $serverresponse = json_encode($response);
    }
    sqlsrv_free_stmt($result);
} else {
    $response = array('response'=>'notok', 'flag'=>$flag, 'data'=>'cc');
    $serverresponse = json_encode($response);
}

echo ($serverresponse);
    
    $_SESSION['message'] = "This information has been succesfully updated";
    $_SESSION['msg_returndate'] = "info";
    
    header("location: ../success.php");
我基于Dani Krossing的PHP Youtube教程()

任何建议或资源,以帮助我得到这项工作将是伟大的。我花了很长时间寻找另一个有帮助的帖子,但没有找到

谢谢

我试图从网页(PHP)上提交的表单中提取一个字符串,进入存储过程中更新查询的where子句

为此,您需要一个拆分器(又名标记器)。如果您使用的是SQL 2016+,那么您就有了。对于早期版本,您可以抓取。使用
@WebReferenceNumbers
作为“提交的字符串”,您的SQL将如下所示:

DECLARE @WebReferenceNumbers VARCHAR(8000) =
  'PPM-372046,PPM-372053,PPM-372072,PPM-372076,PPM-372077,PPM-372078'

-- SELECT | UPDATE | WHATEVER WHERE... IN
SELECT s.[value]
FROM   STRING_SPLIT(@WebReferenceNumbers,',') AS s;

可能需要根据字符串的外观进行一些清理,如空格修剪,但这是一项简单的任务。

您所做的假设是不正确的。从阅读Erland关于的讨论开始。为他的站点添加书签-许多有用的信息不幸的是,PHP似乎不支持表值参数,这正是您真正需要的。我想说的是,用XML或JSON来破解它。谢谢@Alan Burstein的帮助!非常感谢