从php调用存储过程

时间:2016-05-03 22:48:42

标签: php mysql sql stored-procedures pdo

我正在从php调用存储过程

<?php
include('global/db.php');
$id = 1;
$base = conn();
$query = "CALL get_id(:id,@userid)";
$stmt = $base->prepare($query);
$stmt->bindParam(':id',$id);
$stmt->execute();
print_r($stmt->fetch());
?>

存储过程如下所示

BEGIN
SET @userid = (SELECT * FROM user WHERE user.id = id);
SELECT @userid;
END

程序参数

IN id int(10), OUT userid VARCHAR(255) 

问题:

  • 为什么我的结果什么都没有回来?
  • 我的输出变量@userid需要什么数据类型?

2 个答案:

答案 0 :(得分:1)

您的存储过程存在一些问题。

由于您有userid

的输出@userid

此外,您输出userid,因此无需SELECT

另一件事是,您不能将整行选择为单个变量,对于多列,您应该使用多个输出变量。

BEGIN
    SET userid = (SELECT column_name FROM user WHERE user.id = id);
END

更新

$result = $base->query("CALL get_id($id)");  
while($data = $result->fetch_array(MYSQL_ASSOC)){
   echo $data['column_name'];
}

答案 1 :(得分:1)

目前,您正在为整个查询结果集定义标量参数,如星号所示。请考虑使用INTO子句将一个查询结果值传递到OUT参数:

DELIMITER $$
CREATE PROCEDURE get_id (
  IN  id int(10), 
  OUT userid VARCHAR(255))
BEGIN
  SELECT user.id
  INTO userid
  FROM user
  WHERE user.id = id;
END$$
DELIMITER ;

在PHP中,您需要运行第二个查询以在fetch命令中返回@userid变量:

try {
    include('global/db.php');
    $id = 1;
    $base = conn();
    $query = "CALL get_id(:id,@userid)";
    $stmt = $base->prepare($query);
    $stmt->bindParam(':id',$id);
    $stmt->execute();

    $result = $base->query("SELECT @userid")->fetchAll();
    if ($result) { print_r($result); }

} catch (PDOException $pe) {
    echo $pe->getMessage()."\n";        
}