6

我正在使用返回错误代码的 SQL Server 存储过程;这是一个非常简单的 SP 片段。

DECLARE @ret int
BEGIN
SET @ret = 1
RETURN @ret
END

我可以使用 mssql 扩展获取返回值:

mssql_bind($proc, "RETVAL", &$return, SQLINT2);

但是,我不知道如何访问 PDO 中的返回值;我不想使用 OUT 参数,因为很多这些存储过程已经被编写。这是我当前如何在 PHP 中调用该过程的示例。

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
$stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
4

8 回答 8

4

查看 MSDN 以获取有关如何正确绑定到此类呼叫的信息

您的 PHP 代码可能应该被调整为看起来更像这样。这可能仅在您通过 ODBC 调用时才有效,老实说,这是使用 SQL Server 执行任何操作的强烈首选方式;在 Windows 系统上使用 SQL Native Client,在 *nix 系统上使用 FreeTDS ODBC 驱动程序:

<?php
  $stmt = $this->db->prepare("{?= CALL usp_myproc}");
  $stmt->bindParam(1, $retval, PDO::PARAM_STR, 32);
  $rs = $stmt->execute();
  $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  echo "The return value is $retval\n";
?>

这里的关键是可以将返回值绑定为 OUT 参数,而无需重新构造存储过程。

于 2009-08-22T01:50:26.843 回答
1

刚刚遇到同样的问题:

<?php

function exec_sproc($sproc, $in_params)
{
   global $database;

   $stmnt = $database->prepare("EXEC " . $sproc);
   if($stmnt->execute($in_params))
   {
      if($row = $stmnt->fetch())
      {
         return $row[0];
      }
   }

   return -1;
}
?>
于 2012-06-06T21:17:15.247 回答
0

如果我正确理解你的问题,你不应该调用 fetchAll()...

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, $mystr, PDO::PARAM_STR);
$stmt->bindParam(2, $mystr2, PDO::PARAM_STR);
$rs = $stmt->execute();
echo "The return values are: $mystr , and: $mystr2";

PDOStatement::bindParam

于 2009-10-27T02:34:11.650 回答
0

can't u use SELECT to return the results? Then you can use a dataset (resultset in php?) to pick it up? I don't know know PHP, but in c# its quite simple - use a dataset.

于 2009-06-15T21:21:59.503 回答
0

很确定 PDO::exec 只返回行数..在你的例子中这将是 $rs

于 2009-06-17T01:46:40.100 回答
0
public function callProcedure($sp_name = null, $sp_args = []) {
    try {
        for($i = 0; $i < count($sp_args); $i++) {
            $o[] = '?';
        }

        $args = implode(',', $o);
        $sth = $connection->prepare("CALL $sp_name($args)");

        for($i = 0, $z =1; $i < count($sp_args); $i++, $z++) {
            $sth->bindParam($z, $sp_args[$i], \PDO::PARAM_STR|\PDO::PARAM_INPUT_OUTPUT, 2000);
        }

        if($sth->execute()) {
            return $sp_args;
        }
    } catch (PDOException $e) {
        this->error[] = $e->getMessage();
    }
}
于 2017-03-08T19:00:16.163 回答
0

我有一个类似的问题,并且能够通过像这样返回执行来解决它......

function my_function(){
    $stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
    $stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
    $stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
    return $stmt->execute();
}

剩下的就是使用变量调用函数,然后分析所述变量。

$result = my_function();

您现在可以分析 $result 的内容以找到您要查找的信息。请让我知道这可不可以帮你!

于 2019-12-13T10:36:21.893 回答
-1

试试 $return_value

于 2009-06-17T17:39:58.913 回答