I'm trying to get out of a procedure, however SQLSTATE [HY093] appears: Invalid parameter number: number of bound variables does not match number of tokens , I saw some questions that this is due to number of parameters, however the PDO is passing 6 parameters, the same amount as the procedure requests.
PDO:
static function inserirCliente($cpf, $nome, $sobrenome, $usuario, $senha) {
$con = ConnectionFactory::getConnection();
$con->beginTransaction();
try {
$senha = password_hash($senha, PASSWORD_BCRYPT);
// iniciando
$resultado = '';
$stmt = $con->prepare("call prc_cadastrar_usuario(:cpf, :nome, :sobrenome, :usuario, :senha, :msg)");
// PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT
$stmt->bindParam('cpf', $cpf);
$stmt->bindParam('nome', $nome);
$stmt->bindParam('sobrenome', $sobrenome);
$stmt->bindParam('usuario', $usuario);
$stmt->bindParam('senha', $senha);
$stmt->bindParam(':msg', $resultado);
//
if ($stmt->execute()) {
$con->commit();
$tabResultat = $stmt->fetch();
$resultado = $tabResultat['msg'];
} else {
echo $stmt->errorCode();
$con->rollBack();
}
} catch (PDOException $e) {
$con->rollBack();
echo $e->getMessage();
echo $e->getLine();
}
$con = null;
return $resultado;
}
Procedure:
CREATE DEFINER='root'@'localhost' PROCEDURE 'prc_cadastrar_usuario'(
in n_cpf varchar(11),
in n_nome nvarchar(30),
in n_sobrenome nvarchar(30),
in n_usuario nvarchar(30),
in n_senha nvarchar(255),
out msg nvarchar(200)
)
BEGIN
declare v_cpf varchar(11);
declare v_nome nvarchar(30);
declare v_sobrenome nvarchar(30);
declare v_usuario nvarchar(30);
declare v_senha nvarchar(255);
-- seleciona no banco os dados que entraram
set v_cpf := (select cpf from tbl_usuario where cpf = n_cpf);
set v_usuario := (select usuario from tbl_login where usuario = n_usuario);
-- verifica se os dados da select são iguais aos que entraram
if ( (v_cpf is null) && (v_usuario is null) ) then
insert into tbl_usuario (cpf, nome, sobrenome) values (n_cpf, n_nome, n_sobrenome);
insert into tbl_login (usuario, senha, cpf_login_fk) values (n_usuario, n_senha, n_cpf);
set msg := 'Cadastrado!';
elseif ( (v_cpf = n_cpf) && (v_usuario is null) ) then
set msg := 'CPF já cadastrado!';
elseif ( (v_cpf is null) && (v_usuario = n_usuario) ) then
set msg := 'Usuário já cadastrado!';
else
set msg := 'Erro ao cadastrar';
end if;
END