【问题标题】:Getting MSSQL Stored Proc Results with PHP PDO使用 PHP PDO 获取 MSSQL 存储的 Proc 结果
【发布时间】:2015-01-08 18:27:25
【问题描述】:

我在 MSSQL 2008 R2 中有一个相当复杂的存储过程,最终导致返回一个小表。 PHP 将从 javascript 中调用,我希望它以 JSON 形式返回数组,以便在 javascript 中的表中使用。

我正在使用 PHP 来访问它,并且使用分析器可以看到我正在调用 SP 并将正确的参数传递给它。

我的 PHP 看起来像这样:

try {
    $dbh = new PDO("sqlsrv:Server=(local);Database=cddDispo");
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo json_encode("Error connecting to the server.");
    die ();
}

$lot = $_POST["lot-input"];
$layerAdder = $_POST["layer-input"];

$adder = substr($layerAdder,-3,3);
$adder = str_replace('=','',$adder);
$layer = substr($layerAdder,0,strpos($layerAdder,' '));

$sth = $dbh->prepare('EXEC dbo.pullDispo ?,?,?');

$sth->bindParam(1,$lot,PDO::PARAM_STR);
$sth->bindParam(2,$layer,PDO::PARAM_STR);
$sth->bindParam(3,$adder,PDO::PARAM_STR);

$array = array();

try {
    $sth->execute();

    while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        //I want to build my output array here
   }
}catch (PDOException $e) {
    echo "Error getting data, please try again.";
    die();
}

header('Content-type: application/json');
echo json_encode($array);

这是我第一次尝试从存储过程返回表结果,即使经过几次 PHP 手册/谷歌搜索,我也没有弄清楚如何在 PHP 中重新捕获表。我有一个不太优雅的解决方法(将 SP 表写入静态表并稍后在 PHP 中调用该表),但我宁愿弄清楚我是否可以以更优雅的方式进行操作。非常感谢任何建议。

我认为如果我发布我的最终代码可能会有用:

function array_push_assoc($array,$key,$value) {
    $array[$key] = $value;
    return $array;
}

header('Content-type: application/json');

try {
    $dbh = new PDO('sqlsrv:Server=(local);Database=cddDispo');
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo json_encode('Error connecting to the server.');
    die ();
}

$lot = $_POST['lot'];
$layer = $_POST['layer'];
$adder = $_POST['adder'];

$sth = $dbh->prepare('EXEC dbo.pullDispo ?,?,?');

$sth->bindParam(1,$lot,PDO::PARAM_STR);
$sth->bindParam(2,$layer,PDO::PARAM_STR);
$sth->bindParam(3,$adder,PDO::PARAM_STR);

$results = array();
$combinedArray = array();
$array = array();
$count = 0;

try {
    $sth->execute();
    do {
        $results[] = $sth->fetchAll(PDO::FETCH_ASSOC);
    }while ($sth->nextRowset());

    foreach($results as $row) {
        if($count == 0) {
            $headerArray =
                [
                    'Lot'               =>$row['Lot'],
                    'Layer'             =>$row['Measured Layer'],
                    'Product'           =>$row['MES Product'],
                    'Adder'             =>$row['Adder Chart']
                ];
            $combinedArray = array_push_assoc($combinedArray,'header',$headerArray);
        }

        $count++;

        //This is for formatting of final table
        if($row['UDL'] == 0) {
            $udl = 'NA';
        } else {
            $udl = round($row['UDL'],4);
        }

        $infoArray =
            [
                'Wafer'             =>$row['Wafer'],
                'Type'              =>$row['Type'],
                'Count'             =>$row['Count'],
                'CDD'               =>round($row['CDD'],3),
                'UCL'               =>round($row['UCL'],4)
            ];
        array_push($array,$infoArray);
    }
    $combinedArray = array_push_assoc($combinedArray,'detail',$array);
}catch (PDOException $e) {
    echo json_encode('Error running stored procedure.');
    die();
}

echo json_encode($combinedArray);

【问题讨论】:

    标签: php sql-server pdo


    【解决方案1】:

    可能是您的存储过程返回了多个结果集吗?这包括警告消息或受影响的行数等输出。尝试在存储过程顶部的AS 之后添加SET ANSI_WARNINGS OFFSET NOCOUNT ON。您也可以在尝试获取结果之前尝试前进到 PHP 中的下一个结果集,方法是在 $sth->fetchAll() 之前调用 $stg->nextRowset()

    【讨论】:

      【解决方案2】:

      使用fetchAll() 获取您的结果集,然后将该数组编码为您的 json 响应:

      $array = array();
      try {
          if($sth->execute()){
              $array = $sth->fetchAll(PDO::FETCH_ASSOC);
          }else{
              $array = array('error'=>'failed to execute()')
          }
      }catch (PDOException $e) {
          echo "Error getting data, please try again.";
          die();
      }
      header('Content-type: application/json');
      echo json_encode($array);
      

      【讨论】:

      • 感谢您的回复。这仍然没有帮助。我认为问题可能是我无法从 SQL 返回完整的结果表,只能返回整数值(例如,成功、失败)
      • 在存储过程结束时,它相当于运行 SELECT * FROM [table],其中输出将包含 16 列数据,并且通常少于 50 个条目。我所做的是将该数据放入静态表中,然后通过 SELECT * 在存储过程中调用该表
      【解决方案3】:

      当您调用具有多个结果集的存储过程时,您可能不想将SET NOCOUNT ON 添加到您拥有的每个过程中;你总是可以添加

      $dbh->setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), true);
      $dbh->query("SET NOCOUNT ON"); 
      

      之前

      $dbh->prepare($query);
      

      它会起作用的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多