tags:

views:

470

answers:

1

I couldn't find a proper documentation on how to call a stored procedure using ADODB in PHP. Can someone help please?

This is what I have now and I feel it's a dirty approach (or not?):

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

Instead of hardcoding the CALL statement, is there any way to code it for multi-database standard?

EDIT 01:

I tried this code as suggested in the ADODB Manual:

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

But the result was:

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

What could be the problem? The documentation was for Oracle and I am using MySQL. But I believe ADODB methods are same for all DBs.

Thank you for any help.

+1  A: 

OK. I found the answer myself. There is no clean way to do that in ADODB for MySQL. The PrepareSP() method can be used, but not the InParameter or the OutParameter methods.

The ADODB documentation says:

InParameter() is a wrapper function that calls Parameter() with $isOutput=false. The advantage of this function is that it is self-documenting, because the $isOutput parameter is no longer needed. Only for mssql and oci8 currently.

OutParameter() is a wrapper function that calls Parameter() with $isOutput=true. The advantage of this function is that it is self-documenting, because the $isOutput parameter is no longer needed. Only for mssql and oci8 currently.

Nirmal