Php 将表单中的字符串用作存储过程(SQL Server)中的参数
我一直在试着按照这个问题()和这个问题()的例子来做,但到目前为止还没有什么乐趣。我一直在深入研究更复杂的SQL查询(仍在学习中),希望在此方面得到一些建议/指导 我试图从网页(PHP)上提交的表单中提取一个字符串,进入存储过程中更新查询的where子句。最终目标是将所有提供的参考号更改为statusrefno 4(将其标记为已关闭的租赁产品) 这是完整的存储过程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 (
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的帮助!非常感谢