Как получить возвращаемое значение из магазина-процедуры / функции в MySQL с PHP PDO - PullRequest
0 голосов
/ 27 января 2019

Я вызываю простую процедуру хранения MySQL, которая получает 2 параметра, но когда я пытаюсь получить значение, возвращаемое из PDO PHP, я получаю array (0) {} как результат в var_dump. Также я пробовал разные способы получить значение, и я получаю логическое значение (всегда false). Когда я тестирую процедуру хранения в БД, она работает правильно.

Надеюсь, вы поможете мне найти мою ошибку. Спасибо

MySQL Store Процедура:

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

Результат, который я получаю: массив (0) {} Или bool (false), когда я пытался получить: $ result = $ stmt-> fetch (); var_dump ($ результат);

1 Ответ

0 голосов
/ 28 января 2019

Я решил это.Вместо того, чтобы создавать функцию в MySQL с возвратом по умолчанию, я создал ее как процедуру Store с 2 параметрами IN и 1 Param 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

Надеюсь, что этот ответ может помочь многим другим людям.Привет!

...