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

Posted

技术标签:

【中文标题】PHP + MSSQL 使用 PDO,命名参数不是“?”【英文标题】:PHP + MSSQL using PDO with Named Parameters not '?' 【发布时间】:2015-09-23 16:55:26 【问题描述】:

我即将开始使用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 可以使用命名占位符吗?

【问题讨论】:

Sql server 没有 LIMIT 但使用 TOP 显示正在使用的连接/驱动程序 是mysqli不能有命名参数。 PDO 支持?:foo,这是有道理的,因为它是一个通用的“所有数据库”接口,而 mysqli(显然)是特定于 mysql 的。 @DrewPierce 我已经包含了我的连接字符串 好吧,看看我的回答底部 【参考方案1】:

这将是一个编写检查的简单脚本,但是我找到了文档和示例!答案是肯定的!名称参数适用于 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();

【讨论】:

【参考方案2】:

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

这是PDO 独有的功能。

不过,我计划使用 PDO,因为我目前认为这是不可能的 使用命名参数。

您可以使用 SQL Server 来做到这一点:

$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 优势,因为它与大多数数据库兼容。您无需更改代码,只需更改连接即可。

【讨论】:

感谢 meda 需要刷新我的 mssql... 已更新问题。你能解释一下实际问题吗? @atoms 我回答了你的问题【参考方案3】:

您可能会幸运地看到以下 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 驱动程序的信息,因为这显然会影响到它。

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

【讨论】:

【参考方案4】:

非常感谢您对此的所有回复。一段时间后,我设法让它工作,所以回答我的问题;是的,可以将命名占位符与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 提供驱动程序和 pdf 的链接以及其他所有人的帮助。

【讨论】:

以上是关于PHP + MSSQL 使用 PDO,命名参数不是“?”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 MSSQL 在 PDO 中引用表名

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

如何在 Windows 开发环境中在 PHP 中使用 PDO 和 MSSQL?

通过 PDO ODBC 将 PHP 连接到 MSSQL

PDO 通过 MSSQL_* 函数连接到 MSSQL

运维 | CentOS 7 下给 PHP 安装 MSSQL - PDO拓展