PHP + MSSQL 使用 PDO,命名参数不是“?”
Posted
技术标签:
【中文标题】PHP + MSSQL 使用 PDO,命名参数不是“?”【英文标题】:PHP + MSSQL using PDO with Named Parameters not '?' 【发布时间】:2015-09-23 16:55:26 【问题描述】:我即将开始使用mssql
和php
构建网站。
不过,我计划使用 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,命名参数不是“?”的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?