PHP PDO与SQL Server和预处理语句


PHP PDO with SQL Server and prepared statements

已经有很多类似的问题了。然而,我还没有找到一种方法来让这个代码工作。

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

旧样式: Works,这将产生一个预期结果的数组。

$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为空;不管有没有参数,它似乎都不起作用。

系统详细信息:在Ubuntu Trusty(14)上使用unixodbc运行PHP 5.5.9;freetds安装。

我真的很欣赏PHP PDO调用存储过程和与MSSQL绑定参数的工作示例。

试试这个…

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

试着改变这个——

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

——to this——

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

请参阅ODBC文档中的过程调用转义序列,以及PHP PDO文档了解更多信息