PHP + MSSQL 使用 PDO,命名参数不是“?”

PHP + MSSQL using PDO with Named Parameters not '?'

我即将开始使用 mssqlphp 构建网站。

我打算使用 PDO,但是,我目前认为它不可能使用命名参数。

目前 MySQL 我会在我的查询中使用命名占位符;

$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "SELECT *
        FROM table
        LIMIT :numRows";

$st = $this->conn->prepare( $sql );
$st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );

但是当使用 MSSQL;

$conn = new PDO("mysql:host=" . DB_HOST .";dbname=" . DB_NAME, DB_USER, DB_PASSWORD);

$sSQLInsert = "SELECT TOP ? *
    FROM table";

$aParams = array($iLimit);

$st = sqlsrv_query($dbhandle, $sSQLInsert, $aParams)){}

当我有很多参数需要绑定时,我的担心就出现了。管理它们的顺序并在查询参数之间来回切换似乎并不理想。

所以我的问题;是否可以将命名占位符与 MSSQL 一起使用?

这将是一个用于编写支票的简单脚本,但我找到了文档和示例!答案是肯定的!名称参数适用于 PDO_MSSQL.

https://msdn.microsoft.com/en-us/library/ff628166(v=sql.105).aspx

$stmt = null;
$contact = "Sales Agent";
$stmt = $conn->prepare("select * from Person.ContactType where name = :contact");
$stmt->bindParam(':contact', $contact);
$contact = "Owner";
$stmt->execute();

否 您不能将命名占位符与 sqlsrv_ 或任何其他扩展名一起使用。

这只是 PDO 的一个功能。

I plan to use PDO's, however, as I currenlty believe its not possible to use named parameters.

您可以使用 SQL 服务器:

$sql = "SELECT TOP :numRows *
        FROM table";
$st = $this->conn->prepare( $sql );
$st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
$st->execute();
var_dump($st->fetch());

这不是关于服务器,更多的是关于驱动程序,这个PDO的优势在于它与大多数数据库兼容。您无需更改代码,只需更改连接即可。

您可能有幸看到以下 PDF(自动下载 pdf):

http://tinyurl.com/orc2xkc

它有与变量和数组绑定的示例。

$sql = ‘select Title, 
 FirstName, 
 MiddleName, 
 LastName 
 from SalesLT.Customer 
 where Title = :title and CustomerId<10’;
$query = $conn->prepare($sql);
$title = ‘Mr.’;
$query->bindParam(‘:title’, $title);
$query->execute();

与此同时,我将查找有关要使用的 mssql 驱动程序的信息,因为这显然对它起作用。

编辑... 至于驱动看这个问题下的评论: From PDO to SQLSRV

非常感谢您对此的所有回复。一段时间后,我设法让它工作了,所以回答我的问题;是的,可以将命名占位符与 MSSQL.

一起使用

安装 SQLSRV PDO 扩展后,占位符就可以这样使用了;

$database = "";
$server = "";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", DB_USER, DB_PASSWORD);

$sql = "SELECT * FROM Table WHERE MemberID =:MemberID";

$iMemberID = 5;

$st = $conn->prepare($sql);

//named placeholders within the execute() as an array.
   $st->execute(array(':MemberID'=>$iMemberID));
//OR using bind param..
   $st->bindParam(':MemberID', $iMemberID);

while ($row = $st->fetch()){
    echo "<pre>";
    var_dump($row);
    echo "</pre>";
}

感谢 Drew Pierce link 驱动程序和 pdf 以及其他所有人的帮助。