带有 SQL Server 和准备好的语句的 PHP PDO

Posted

技术标签:

【中文标题】带有 SQL Server 和准备好的语句的 PHP PDO【英文标题】:PHP PDO with SQL Server and prepared statements 【发布时间】:2017-03-13 04:38:05 【问题描述】:

已经发布了许多与此类似的问题。但是我还没有找到让这段代码工作的方法。

我正在从本地 MSSQL 查询更新 php 代码库以使用 PDO,特别是使用 ODBC。这是我尝试过的旧代码和两种变体。

旧式:有效,这会产生一系列预期结果。

$db = mssql_connect('connection', 'user', 'password');
mssql_select_db('database', $db);

$sp = mssql_init('procedure', $db);
$param=1;
$results=[];
mssql_bind($sp,'@param',$param,SQLINT4,FALSE,FALSE);
$spRes = mssql_execute($sp);

while ($row = mssql_fetch_array($spRes, MSSQL_ASSOC)) $results[] = $row; 
mssql_free_statement($sp);
var_dump(results);

将 T-SQL 与 PDO 结合使用几乎可以工作:只要我不尝试绑定任何参数,我就会得到结果。

$pdo = new PDO($'dblib:host=connection', 'user', 'password');
$pdo->query('use database');

$sp= $db->prepare("EXEC procedure");
$sp->execute();

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor();
var_dump(results);

产生许多预期结果的数组。但是,任何绑定参数的尝试都会导致 $results 成为一个空数组。未报告任何错误。

$sp= $db->prepare("EXEC procedure :param");
$sp->bindParam(':param', $param, PDO::PARAM_INT);

这会导致结果集为空,并且不会报告任何错误。

使用 ODBC "SQL" 似乎根本不起作用:

$pdo = new PDO($'dblib:host=connection', 'user', 'password');
$pdo->query('use database');

$sp= $db->prepare("CALL procedure");
$sp->execute();

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor();
var_dump(results);

$results 为空;不管有没有参数,它似乎都不起作用。

系统详情:在安装了 unixodbc 和 freetds 的 Ubuntu Trusty (14) 上运行 PHP 5.5.9。

我非常感谢 PHP PDO 调用存储过程和使用 MSSQL 绑定参数的工作示例。

【问题讨论】:

***.com/a/32224294/285587 ? 以下帮助。我现在正在与$pdo = new PDO('odbc=connection', 'user', 'password'); 连接但是,绑定到命名参数仍然无法正常工作。 最好将您的更改编辑到您的问题中,以最佳方式保留您开始的内容和更改的内容。 $sp->execute(); 返回调用成功与否的布尔指标。如果是false,则检查$sp->errorInfo(); 返回的内容。样式 $sp= $db->prepare("EXEC procedure :param"); $sp->bindParam(':param', $param, PDO::PARAM_INT); 的绑定似乎没问题,因此 PDOStatement 的错误信息可能指向问题。 当然,看到这个link。 【参考方案1】:

试试这个..

$result = array();

$sp= $db->prepare("EXECUTE dbo.procedure :param");
$sp->bindParam(":param", $param, PDO::PARAM_INT);
$sp->execute();

$result = $sp->fetchall(PDO::FETCH_OBJ);

【讨论】:

那行得通。我还必须将连接 DSN 从 dblib 更改为 '$pdo = new PDO('odbc=connection', 'user', 'password');'【参考方案2】:

尝试改变这个 --

$sp= $db->prepare("CALL procedure");

-- 到这里--

$sp= $db->prepare(" CALL procedure () ");

请参阅ODBC documentation on Procedure Call Escape Sequence 和PHP PDO documentation 了解更多信息...

【讨论】:

好的,这很有帮助。我可以连接 ODBC DSN 并使用该语法调用过程。但是我仍然无法让绑定参数起作用。我已经打开了 ODBC 跟踪,明天看看是否能提供更多线索。 我没有看到任何 PHP 代码显示您使用绑定参数所做的努力,所以我无法在那里制作任何有用的 cmets... 谢谢。尽管如果您在该问题上搜索“绑定”。代码中有一些例子。可能我完全弄错了,还有其他方法。 为了更清楚...我没有看到您的 PDO+ODBC 使用带有绑定参数的代码,这应该与其他所有代码有所不同。跨度>

以上是关于带有 SQL Server 和准备好的语句的 PHP PDO的主要内容,如果未能解决你的问题,请参考以下文章

带有 golang 准备语句的原始 sql 事务

带有位域的 PDO 准备好的语句

带有准备好的语句的 Java JOOQ

当它们包含 ROW_NUMBER() 时,JDBC-driver / SQL Server 总是重新编译我准备好的语句

带有变量的Mysqli准备好的语句列[重复]

准备好的语句失败(带有错误消息!)