【问题标题】:calling a stored procedure from php从 php 调用存储过程
【发布时间】:2016-08-29 04:18:04
【问题描述】:

我正在从 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 需要是什么数据类型?

【问题讨论】:

    标签: php mysql sql stored-procedures pdo


    【解决方案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'];
    }
    

    【讨论】:

    • 是否有例如SET somevariable = SELECT division FROM user WHERE division = blah 结果将返回多个division1,division2,division3 aka 标量值array
    • 你的意思是多行(匹配条件)?
    • 是的,正是我的意思
    • 是的,我知道这是否可以在程序中进行,以便我可以在同一程序中循环查看日期。
    • 好吧,很酷,是的,这就是我的想法。再次感谢大家的帮助!
    【解决方案2】:

    目前,您正在为整个查询结果集定义一个标量参数,如星号所示。考虑使用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";        
    }
    

    【讨论】:

    • 所以基本上不能使用*,因为它会返回一个array或你不能设置为变量的标量值?
    • 正确,除非 MySQL 具有数组/向量类型。请注意,您可以返回完整的查询结果集,而无需传递到 OUT 变量。
    猜你喜欢
    • 2017-05-21
    • 2016-01-11
    • 1970-01-01
    • 2019-05-11
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多