从PHP调用MySql存储过程(PDO)

时间:2014-07-16 16:44:48

标签: php mysql sql stored-procedures pdo

我正在尝试使用PDO连接执行MySQL存储过程,我几乎尝试了所有但不能执行它。

SP只会插入和更新。以下是我到目前为止尝试的代码。

$config = require('protected/config/main.php');
try
{
$db_adat = new PDO($config['components']['db']['connectionString'], $config['components']    ['db']['username'], $config['components']['db']['password']);
$result= $db_adat->prepare('CALL pdv()');

 $a = $result->execute();
 $a->fetchAll(PDO::FETCH_ASSOC);

我只尝试了fetch(),只有fetchAll(),fetchObject(),带有fetch(PDO :: FETCH_ASSOC),带有fetchAll(\ PDO :: FETCH_ASSOC),但我总是得到以下错误

Fatal error: Call to a member function fetchAll() on a non-object in D:\ADAT_System\www\test\protected\controllers\ExportPDVController.php on line 35

我也尝试使用query()而不是execute(),但这也不起作用。

我也尝试在SP中添加一个(select *)语句并尝试上面的所有内容" fetch"选项,但得到同样的错误。

SP需要7分钟才能完成,但是所有人都立即犯了错误,因此我猜测它从未运行过SP。

我也试过以下

$result= $this->$db_adat->prepare("CALL pdv()");
$result->execute();

但我得到了以下错误:

Object of class PDO could not be converted to string 

我没有在SP中传递任何参数,只是一个简单的调用。如果需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

这部分代码错误

$result= $db_adat->prepare('CALL pdv()');
$a = $result->execute();
$a->fetchAll(PDO::FETCH_ASSOC);

因为execute()在成功或失败时返回布尔值。

你不能用它来获取。适当的变量名是正确的方法:

$stmt= $db_adat->prepare('CALL pdv()');
$success = $stmt->execute();
if($success){
   $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
}else{
   echo 'failed to run sp';
}

答案 1 :(得分:0)

<?php
  if(isset($_POST) && !empty($_POST)){
    $SearchPO = (($_POST)['SearchPO']);
    
  } 
    $stmt = $pdo->prepare("CALL spPO(?)");
    $stmt->bindParam(1, $SearchPO, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT|PDO::ATTR_EMULATE_PREPARES, 4000);
    $stmt->execute(); 
    do {
    $result = $stmt->fetchAll();                    
  } while ($stmt->nextRowset() && $stmt->columnCount());
?> 

您必须使用 nextRowset() 函数,因为没有它,下一条记录是“空的”。 Source