我正在调用一个简单的MySQL存储过程,该过程接收2个参数,但是当我尝试获取从PDO PHP返回的值时,由于var_dump而得到array(0){}。另外,我尝试了不同的方法来获取值,并且获得布尔值(始终为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);
}
我得到的结果是:
数组(0){}
或者当我尝试检索时为bool(false):
$ result = $ stmt-> fetch();
var_dump($ result);
最佳答案
我已经解决了
我没有在MySQL中创建具有默认返回值的函数,而是将其创建为具有2个参数IN和1个参数OUT的存储过程,并根据我的条件在过程内将值分配给该OUT参数,而没有返回语句。
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
希望这个答案可以帮助很多其他人。
问候!
关于php - 如何使用php pdo从mysql中的存储过程/函数获取返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54384610/