2

我找不到关于如何在 PHP 中使用 ADODB 调用存储过程的适当文档。有人可以帮忙吗?

这就是我现在所拥有的,我觉得这是一种肮脏的方法(或不是?):

$stmt = "CALL LocFillData('foo', 'bar', @nullcount, @totalcount)";
$rsstmt = "SELECT @nullcount, @totalcount";
$rs = $db->Execute($stmt);
$rsstmt = $db->Execute($rsstmt);
var_dump($rsstmt);

CALL有没有办法为多数据库标准编码,而不是对语句进行硬编码?

编辑 01:

我按照ADODB 手册中的建议尝试了此代码:

$dbname = DB_DATABASE;
$tbname = TABLE_CONTACT_LOCATIONS;

$stmt = $db->PrepareSP("BEGIN; adodb.LocFillData(:dbname, :tbname, :nullcount, :totalcount); END;");
$db->InParameter($stmt,$dbname,'dbname');
$db->InParameter($stmt,$tbname,'tbname');
$db->OutParameter($stmt,$nullcount,'nullcount');
$db->OutParameter($stmt,$totalcount,'totalcount');
$ok = $db->Execute($stmt) or die($db->ErrorMsg());

echo "<pre>";
var_dump($ok);
echo "</pre>";

但结果是:

object(ADORecordSet_empty)#15 (6) {
  ["dataProvider"]=>
  string(5) "empty"
  ["databaseType"]=>
  bool(false)
  ["EOF"]=>
  bool(true)
  ["_numOfRows"]=>
  int(0)
  ["fields"]=>
  bool(false)
  ["connection"]=>
  bool(false)
}

可能是什么问题呢?该文档适用于 Oracle,我正在使用 MySQL。但我相信所有数据库的 ADODB 方法都是相同的。

感谢您的任何帮助。

4

3 回答 3

1

好的。我自己找到了答案。在 ADODB for MySQL 中没有干净的方法可以做到这一点。PrepareSP()可以使用方法,但不能使用或InParameter方法OutParameter

ADODB 文档说:

InParameter() 是一个包装函数,它使用 $isOutput=false 调用 Parameter()。此函数的优点是它是自记录的,因为不再需要 $isOutput 参数。目前仅适用于 mssql 和 oci8。

OutParameter() 是一个包装函数,它使用 $isOutput=true 调用 Parameter()。此函数的优点是它是自记录的,因为不再需要 $isOutput 参数。目前仅适用于 mssql 和 oci8。

于 2010-02-22T07:56:55.530 回答
1

我已经通过 Adodb 库完成了这个,看看这个.. $addProduct = $obj->ExecuteQuery("Begin;DECLARE @ProductCode as varchar (100) ;EXEC CREATEPRODUCT'$pname', '$price', @ProductCode OUTPUT, '$merchantId';选择@ProductCode;End;");

有关完整说明,您可以查看此 http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html

于 2011-07-20T15:50:44.373 回答
0

这个选项也可以使用它:

  • $rs = $db->Execute($stmt);
  • $rsstmt = $db->Execute($rsstmt);

似乎合适,因为PrepareSP ()使用的是 adodb 和 oracle。我没有任何运气尝试相同的 adodb 库和 mysql。就像你做你的 Nirmal 一样。

于 2012-01-26T23:36:07.827 回答