簡體   English   中英

如何使用php pdo從mysql的存儲過程/函數獲取返回值

[英]how to get return value from store-procedure/function in mysql with php pdo

我正在調用一個簡單的MySQL存儲過程,該過程接收2個參數,但是當我嘗試獲取從PDO PHP返回的值時,我得到array(0){}作為var_dump的結果。 另外,我嘗試了不同的方法來獲取值,並且獲得布爾值(始終為false)。 當我在數據庫中測試存儲過程時,它可以正常工作。

希望您能幫助我找到我的錯誤。 謝謝

MySQL存儲過程:

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代碼:

    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);
    }

我得到的結果是:array(0){}或bool(false),當我嘗試檢索時:$ result = $ stmt-> fetch(); 后續代碼var_dump($結果);

我已經解決了 我沒有在MySQL中創建具有默認返回值的函數,而是將其創建為具有2個參數IN和1個參數OUT的存儲過程,並根據我的條件在過程內將值分配給該OUT參數,而沒有return語句。

 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和1個OUT參數,使用PDO :: bindParam僅設置IN參數,並且要檢索OUT參數,必須查詢SELECT @OUTParam:

 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

希望這個答案可以幫助很多其他人。 問候!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM