PDO saklı yordam dönüş değeri

5 Cevap php

Ben hata kodları döndüren bir SQL Server saklı yordamı ile çalışıyorum; Burada SP çok basit bir parçası olduğunu.

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

Ben kullanarak mssql uzantısı ile dönüş değerini alabilirsiniz:

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

Ancak, ben PDO'de dönüş değeri erişmek için nasıl anlamaya değil; Bu procedure sürü zaten yazılmıştı gibi ben, bir OUT parametresi kullanmamayı tercih ediyorum. İşte şu anda PHP prosedürü arıyorum nasıl bir örnektir.

$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);

5 Cevap

Check out MSDN for info on how to correctly bind to this type of call

PHP kodu muhtemelen daha fazla bu gibi bakmak tweaked edilmelidir. Eğer dürüstçe SQL Server ile bir şey yapmak için güçlü bir tercih yolu ODBC aracılığıyla görüşme yapıyorsanız, bu sadece işe yarayabilir; Windows sistemlerinde SQL Native Client kullanımı ve * nix sistemlerinde freetds ODBC sürücüsünü kullanın:

<?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";
?>

Burada önemli olan şey, dönüş değeri saklanan prosedürleri yeniden zorunda kalmadan, bir OUT parametresi olarak bağlı olmasıdır.

Sadece bu aynı sorun vardı:

<?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;
}
?>

Sizin örnekte oldukça emin PDO :: exec sadece satır sayısını verir .. bu olurdu $ rs

$ Return_value deneyin

Ben düzgün sorunuzu anlamak Eğer fetchAll () aramak zorunda olmamalıdır ...

$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