使用带有命名参数的PDO的PHP + MSSQL不是'?'

时间:2015-07-06 13:50:51

标签: php mysql sql-server sql-server-2005 pdo

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

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

否您不能使用带有sqlsrv_或任何其他扩展名的命名占位符。

这仅是PDO的一项功能。

  但是,我计划使用PDO,因为我当前认为它不可行   使用命名参数。

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

答案 2 :(得分:1)

您可能会看到以下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

答案 3 :(得分:0)

非常感谢所有对此的回复。过了一段时间,我设法让它工作,所以回答我的问题;是的,可以将命名占位符与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以及其他所有人的帮助。