搜索参数SQLSRV_QUERY用于WHERE IN语法

时间:2016-03-04 17:23:38

标签: php sql parameter-passing sqlsrv

我想知道是否有办法将一些值传递给sqlsrv_query函数的参数选项。我尝试了一些但却无法使用它。

这个查询是我想要执行的:

SELECT id, name, etc
FROM sqlTable
WHERE id IN ('1', '2', '100', '314')

我想使用params选项传递WHERE IN值,如下所示:

$q = "SELECT id FROM sqlTable WHERE id IN ?";
$p = array(array('1', '2', '100', '314'));
sqlsrv_query($connection, $q, $p);

现在我将值直接传递给查询字符串,但出于明显的安全原因,我想将它们作为参数传递给函数。 有人知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

考虑PDO binded parameters您可以在execute()中传递已定义的数组。但是,您需要准备好语句,事先知道IN()子句项的数量。

try {
    $dbh = new PDO("sqlsrv:server=$server;database=$database",$username,$password);

    $sql = "SELECT * FROM sqlTable WHERE id IN (:first, :second, :third, :fourth)";    
    $STH = $dbh->prepare($sql);    
    $nums = array('1', '2', '100', '314');
    $STH->execute($nums);

}
catch(PDOException $e) {  
    echo $e->getMessage()."\n";
}

答案 1 :(得分:0)

所以我在sql端找到了这个问题。现在,我使用sqlsrv_query()函数中的参数将带有id的逗号分隔字符串传递给查询。查询将字符串设置为临时变量。使用拆分功能,每个id都存储在临时表中。作为最后一个JOIN临时表与女巫的表我希望得到结果。

SQL中的拆分功能:

CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(',', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(',', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
 SELECT @stringToSplit

 RETURN
END

PHP代码和SQL查询:

$q = "
DECLARE @inStr varchar(max)
SET @inStr = ?

DECLARE @tmpTable table (tmpID varchar(200))

INSERT @tmptable (tmpID)
SELECT * FROM dbo.splitstring(@inStr)

SELECT id, name, etc
FROM sqlTable
JOIN @tmpTable ON id = tmpID";
$p = array('1,2,100,314');
sqlsrv_query($connection, $q, $p);