使用 sqlsrv 在 PHP 中参数化 IN 子句
Parameterising an IN clause in PHP with sqlsrv
我有一种方法可以根据特定输入的整数数组来选择记录。但是,当我尝试用从方法参数 sqlsrv_query()
returns false
传入的数组替换该数组时。我确信这很简单,但是 'obvious' 可能性对我不起作用。
工作版本
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in (14, 15, 16, 17); SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql);
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 1 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in ?; SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, array($locationIds));
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 2 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in (?); SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, array($locationIds));
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 3 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in ?; SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, $locationIds);
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
您需要生成占位符的动态列表 (?
) 并将其包含在 SQL 语句中。此外,请始终检查 sqlsrv_connect()
和 sqlsrv_query()
执行的结果。
此示例基于问题中的代码,是您问题的可能解决方案:
<?php
public function FindLocationRecords($locationIds) {
require("./Location.php");
// Connection
$resource = sqlsrv_connect($this->Server, $this->ConnectionInfo);
if ($resource === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
return false;
}
// Statement
$tsql = "
SELECT [Date], PlaceName
FROM rde_613949.dbo.Locations
WHERE id IN (".substr(str_repeat(',?', count($locationIds)), 1).")"
;
$results = sqlsrv_query($resource, $tsql, $locationIds);
if ($results === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
return false;
}
// Data
$locations = array();
while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
?>
我有一种方法可以根据特定输入的整数数组来选择记录。但是,当我尝试用从方法参数 sqlsrv_query()
returns false
传入的数组替换该数组时。我确信这很简单,但是 'obvious' 可能性对我不起作用。
工作版本
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in (14, 15, 16, 17); SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql);
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 1 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in ?; SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, array($locationIds));
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 2 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in (?); SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, array($locationIds));
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
版本 3 不工作
public function FindLocationRecords($locationIds)
{
require("./Location.php");
$resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
$tsql = "select Date, PlaceName from rde_613949.dbo.Locations where id in ?; SELECT SCOPE_IDENTITY() as id";
$results = sqlsrv_query($resource, $tsql, $locationIds);
$locations = array();
while($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC))
{
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
您需要生成占位符的动态列表 (?
) 并将其包含在 SQL 语句中。此外,请始终检查 sqlsrv_connect()
和 sqlsrv_query()
执行的结果。
此示例基于问题中的代码,是您问题的可能解决方案:
<?php
public function FindLocationRecords($locationIds) {
require("./Location.php");
// Connection
$resource = sqlsrv_connect($this->Server, $this->ConnectionInfo);
if ($resource === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
return false;
}
// Statement
$tsql = "
SELECT [Date], PlaceName
FROM rde_613949.dbo.Locations
WHERE id IN (".substr(str_repeat(',?', count($locationIds)), 1).")"
;
$results = sqlsrv_query($resource, $tsql, $locationIds);
if ($results === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
return false;
}
// Data
$locations = array();
while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {
$location = new Location($row['Date'], $row['PlaceName']);
array_push($locations, $location);
}
return $locations;
}
?>