我们将MSSQL与Laravel结合使用,后者使用PHP的dblib PDO库。我查看了照亮数据库部分,看到它使用了PDO-> prepare($ query) - > execute($ bindings)。所以我希望它能在SQL数据库中执行一个准备好的语句。
但是当我检查表格来分析运行的查询时。我看到查询没有作为预准备语句运行,而是将查询归类为Adhoc查询。
你们中的任何人都知道为什么PHP / Laravel / FreeTDS / MSSQL的行为是这样的,或者对如何修复它有任何想法?
谢谢!
答案 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错误: