带有MSSQL的PHP​​ PDO不会重用预准备语句

时间:2017-11-24 22:01:03

标签: php sql-server-2008 pdo

我的PHP 5.3带有pdo_sqlsrv扩展和MSSQL2008数据库。以下代码使用预准备语句从表中检索数据,一切正常。但是,当我多次重复该语句时,在SQL服务器配置文件中,我可以看到准备好的语句不会被重用。在每个SQL请求上,语句都会再次准备好。

    $this->statement = $connection->prepare("SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = :textType;");
    $this->statement->bindValue(":textType", "URL");
    $this->statement->execute();
    $data = $this->statement->fetchAll(PDO::FETCH_ASSOC) or array();
    $this->statement->closeCursor();


    $this->statement->bindValue(":textType", "SYSTEM");
    $this->statement->execute();
    $data = $this->statement->fetchAll(PDO::FETCH_ASSOC) or array();
    $this->statement->closeCursor();

此行为的原因可能是变量$ textType的不同字符串长度。正如您在分析器列表中看到的那样,使用不同的输入参数数据类型(nvarchar(6)和nvarchar(3))准备两次相同的语句。

这些数据请求的SQL Server Profiler日志条目:

declare @p1 int
set @p1=2
exec sp_prepexec @p1 output,N'@P1 nvarchar(3)',N'SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = @P1;',N'URL'
select @p1

declare @p1 int
set @p1=3
exec sp_prepexec @p1 output,N'@P1 nvarchar(6)',N'SELECT Lang,MemoryArea,ID,TextType,TextValue FROM CoreLanguage WHERE TextType = @P1;',N'SYSTEM'
select @p1

如果输入字符串数据的长度始终相同,则SQL语言将重用该语句。但是,情况很少......

有谁知道SQL服务器为什么不重用已经准备好的语句?或者我如何将输入参数@ P1操作为合适的数据类型,例如nvarchar(40)(与TextType列定义相同)?

也许我错过了一个特定于驱动程序的选项?

1 个答案:

答案 0 :(得分:0)

您是否尝试使用bindParam()而不是bindValue()?也许你可以试试。