Laravel MSSQL Adhoc查询而不是准备

时间:2017-03-23 16:44:30

标签: php sql-server pdo prepared-statement adhoc-queries

我们将MSSQL与Laravel结合使用,后者使用PHP的dblib PDO库。我查看了照亮数据库部分,看到它使用了PDO-> prepare($ query) - > execute($ bindings)。所以我希望它能在SQL数据库中执行一个准备好的语句。

但是当我检查表格来分析运行的查询时。我看到查询没有作为预准备语句运行,而是将查询归类为Adhoc查询。

你们中的任何人都知道为什么PHP / Laravel / FreeTDS / MSSQL的行为是这样的,或者对如何修复它有任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为不支持通过freetds-> pdo_dblib编写的语句。 但是,我没有这方面的证据,对于做出不确定的“答案”表示歉意。我希望这可以进一步推动该问题的发展,为有更多知识的人提供一些表面积。

是否希望支持此功能?我会同意。

根据上面的线程,freetds 4.2指出:

动态查询(也称为准备好的语句不受支持

但是,如果从更高版本中忽略此内容,则表明它支持 (我们使用的是freetds 7.3)。

docker-container:/test# tsql -C
Compile-time settings (established with the "configure" script)
                            Version: freetds v1.1.24
             freetds.conf directory: /usr/local/etc
     MS db-lib source compatibility: no
        Sybase binary compatibility: no
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 7.3
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: no
                            OpenSSL: no
                             GnuTLS: no
                               MARS: yes

docker-container:/test# cat /etc/freetds/freetds.conf
[global]
    tds version = 8.0
    text size = 2147483647
    client charset = UTF-8

我如何确定它不起作用?

与Laravel无关(尽管仍然是PHP-7.1),我无法使用pdo_dblib驱动程序来获取准备好的语句。

我用来确定准备好的语句的查询实际上正在使用:

select cp.objtype, st.text, cp.*
from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
where text like '%LIMIT_TO_SPECIFIC_TEST%'
order by cp.objtype desc, usecounts desc, refcounts desc

我尝试了一个使用2个int参数的非常简单的查询,PHP代码如下所示:

$sql = "SELECT id FROM ExampleTable WHERE foreignIdOne = ? AND foreignIdTwo = ?";
$statement = $this->_connection->prepare($sql);
$valueOne = 2;
$valueTwo = 56;
$statement->bindParam(1, $valueOne, PDO::PARAM_INT);
$statement->bindParam(2, $valueTwo, PDO::PARAM_INT);
$statement->execute();

有解决方法吗?

使用/ exact /相同的PHP代码并将基础驱动程序更改为 pdo_sqlsrv ,我可以开始看到usecounts的增加,而使用pdo_dblib我看不到。

上面的SO线程有一个交换到ODBC驱动程序的“解决方案”(尽管没有弄清楚为什么它不适用于dblib)。

实际原因是什么?

因此,我仍然不清楚为什么该功能似乎无法正常工作。 我可以找到的唯一其他信息是来自2017年的一个隐藏的php.net错误:

https://bugs.php.net/bug.php?id=74592