首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用php pdo从mysql中的store-procedure/function中获取返回值

问如何用php pdo从mysql中的store-procedure/function中获取返回值
EN

Stack Overflow用户
提问于 2019-01-27 10:36:13
回答 1查看 645关注 0票数 0

我正在调用一个简单的数组存储过程,该过程接收两个参数,但是当我尝试获取从PDO PHP返回的值时,我在var_dump中得到了MySQL (0){}作为结果。此外,我尝试了不同的方法来获得值,我得到了布尔值(总是false)。当我在数据库中测试存储过程时,它工作正常。

希望你能帮我找出我的错误。谢谢

MySQL存储过程:

代码语言:javascript
复制
CREATE DEFINER=`root`@`localhost` FUNCTION `F_esUsuarioValido`(`USUARIO_IN` VARCHAR(50),`CONTRASENA_IN` VARCHAR(50))
RETURNS tinyint(4)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER

BEGIN
  DECLARE EXISTE INT;

  SELECT STATUS
  INTO EXISTE
  FROM T_USUARIO
  WHERE USUARIO = USUARIO_IN
  AND CONTRASENA = CONTRASENA_IN;

  IF EXISTE IS NULL THEN
    RETURN 0;
  ELSEIF EXISTE = 1 THEN
    RETURN 1;
  ELSEIF EXISTE = 0 THEN
    RETURN 2;
  END IF;
END

PHP代码:

代码语言:javascript
复制
    public function esUsuarioValido($usuarioIN, $contrasenaIN) {
       $con = new ConexionMySQL();
       $pdo = $con->conectar();

       $sql = 'CALL F_esUsuarioValido(?,?)';
       $stmt = $pdo->prepare($sql);
       $stmt->bindParam(1, $usuarioIN, PDO::PARAM_STR);
       $stmt->bindParam(2, $contrasenaIN, PDO::PARAM_STR);

       $stmt->execute();

       $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
       var_dump($result);
    }

当我尝试检索时得到的结果是:$result = $stmt->fetch();var_dump($result);

EN

回答 1

Stack Overflow用户

发布于 2019-01-28 07:00:02

我已经解决了这个问题。我没有在MySQL中创建一个带有默认返回的函数,而是将其创建为一个带有2个参数in和1个参数OUT的存储过程,并根据我的条件将值赋给该过程中的这个OUT参数,而不使用return语句。

代码语言:javascript
复制
 CREATE DEFINER=`root`@`localhost` PROCEDURE `F_esUsuarioValido`(
     IN `USUARIO_IN` VARCHAR(50),
     IN `CONTRASENA_IN` VARCHAR(50),
     OUT `ES_VALIDO_OUT` TINYINT
 )
 LANGUAGE SQL
 NOT DETERMINISTIC
 CONTAINS SQL
 SQL SECURITY DEFINER
 BEGIN
     DECLARE EXISTE INT;

     SELECT STATUS
     INTO EXISTE
     FROM T_USUARIO
     WHERE USUARIO = USUARIO_IN
     AND CONTRASENA = CONTRASENA_IN;

     IF EXISTE IS NULL THEN
         SET ES_VALIDO_OUT = 0;
     ELSEIF EXISTE = 1 THEN
         SET ES_VALIDO_OUT = 1;
     ELSEIF EXISTE = 0 THEN
         SET ES_VALIDO_OUT = 2;
     END IF;
 END

然后在PHP PDO中,我将语句修改为2IN和1out params,使用PDO::bindParam仅设置in params并检索OUT参数,必须查询SELECT @OUTParam:

代码语言:javascript
复制
 public function esUsuarioValido($usuarioIN, $contrasenaIN) {
    $con = new ConexionMySQL();
    $pdo = $con->conectar();

    $sql = 'CALL F_esUsuarioValido(:usuario, :contrasena, @esValido)';
    $stmt = $pdo->prepare($sql);

    $stmt->bindParam(":usuario", $usuarioIN, PDO::PARAM_STR);
    $stmt->bindParam(":contrasena", $contrasenaIN, PDO::PARAM_STR);
    $stmt->execute();
    $stmt->closeCursor();

    $row = $pdo->query("SELECT @esValido AS esValido")->fetch(PDO::FETCH_ASSOC);
    var_dump($row);
 }

之后,var_dump($row)用正确的值显示变量esValido。

这个网站帮了我很多:http://www.mysqltutorial.org/php-calling-mysql-stored-procedures/

为了了解函数和存储过程返回值之间的区别,这个网站提供了帮助:https://www.quora.com/What-difference-between-stored-procedures-and-functions-in-MySQL

希望这个答案能帮助到更多的人。致以问候!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54384610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档