2016-03-04 59 views
4

我想知道是否有辦法將某些值傳遞給sqlsrv_query函數的參數選項。我嘗試了一些東西,但無法使其工作。搜索參數SQLSRV_QUERY WHERE IN語法

。該查詢我要執行什麼:

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); 

值直接進入查詢字符串,但出於明顯的安全原因,我想將它們作爲參數傳遞給函數。 任何人有任何想法如何實現這一目標?

回答

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)[email protected]) 
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); 
+0

爲什麼不完全創建一個存儲過程並在PHP中使用字符串參數執行? SQL中持久的爭論:[參數化查詢vs存儲過程](https://www.google.com/#q=parameterized+queries+vs+stored+procedure)。 – Parfait

0

考慮PDO binded parameters你可以通過​​定義的數組。但是,您需要提前準備好條款,並知道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"; 
} 
+0

這也可能與Microsoft SQL Server驅動程序。我實際上希望有一個更簡潔的解決方案,你可以簡單地聲明'IN(:first)'並傳遞一個數組或字符串以及其中的所有子句值。 – Fin

+0

參數需要佔位符。你必須提前準備好它的結構。這可以說是*清潔*版本。如何將值綁定到不確定數量的元素? – Parfait