[RESOLVIDO] Retorno Vazio da função

Boa tarde,

Estou começando com php e criei essa função para buscar um usuário e senha, mas ele só retorna vazio.

function buscarUsuario($conn,$usuario,$senha){
  $stmt = $conn->prepare("SELECT* FROM funcionario WHERE LOGIN_Funcionario = '?'
                            AND SENHA_Funcionario = '?' AND ID_TipoUsuario>=2");
  $stmt->bind_param("ss",$usuario,$senha);
  $stmt->execute();
  $resultado = $stmt->fetch();
  return $resultado;
}

Aqui é onde eu valido o usuário e redireciono ele:

    $usuario=filter_input(INPUT_POST,'nUsuario');
    $senha=filter_input(INPUT_POST,'nSenha');
    $row = buscarUsuario($conn,$usuario,$senha);
    $user=$row['LOGIN_Funcionario'];
    $permissao=$row['ID_TipoUsuario'];
    $redirecionar="";
    if($row['LOGIN_Funcionario']==""){
        $redirecionar="../web/autenticarAdm.php?code=0";
    }else{
      if($permissao==4){
        $redirecionar="../web/recuperarPedidoProjetoADM.php";
      }elseif($permissao==3){
        $redirecionar="../web/recuperarPedidoProjeto.php";
      }else{
        $redirecionar="../web/ambienteCliente.php";
      }

    }
    $conn->close();
    header("location:$redirecionar");`Texto pré-formatado`

O buscar sempre retorna vazio e entra no primeiro if

Retire as aspas dos pontos de interrogação do seu sql e veja o que acontece

Retirei mas continua retornando vazio.

function buscarUsuario($conn,$usuario,$senha){
  $stmt = $conn->prepare("SELECT* FROM funcionario WHERE LOGIN_Funcionario = ?
                            AND SENHA_Funcionario = ? AND ID_TipoUsuario>=2");
  $stmt->bind_param("ss",$usuario,$senha);
  $stmt->execute();
  $resultado = $stmt->fetch();
  return $resultado;
}

Você está usando o fetch de maneira errada, segundo a documentação ele sempre vai retornar true ou false indicando se conseguiu executar e não que irá trazer o registro na base, para isso você deve usar o bind_result

$stmt->bind_param("ss",$usuario,$senha);
$stmt->execute();
$stmt->bind_result($campo1, $campo2); // campo3, etc...
$resultado = $stmt->fetch();

Como pode ver, ele vai colocando cada coluna do select nas variáveis que você marcou $campo1, etc… não é lá muito intuitivo não é?

Sugiro se você ainda estiver começando, usar PDO ao invés do mysqli, na minha opinião ele é bem mais flexível ao trazer registros da base, e você ainda ganha abstração de base, caso você queira mudar de base de dados, seu código sofre poucas mudanças, vale a pena conhecê-lo…

Obs: no mysqli também tem o get_result, talvez seja melhor opção…

Valeu mais uma vez, o get_result resolveu meu problema o código ficou assim:

function buscarUsuario($conn,$usuario,$senha){
  $stmt = $conn->prepare("SELECT LOGIN_Funcionario,ID_TipoUsuario FROM funcionario WHERE LOGIN_Funcionario = ?
                            AND SENHA_Funcionario = ? AND ID_TipoUsuario>=2");
  $stmt->bind_param("ss",$usuario,$senha);
  $stmt->execute();
  $resultado = $stmt->get_result();
  return $resultado;
}

Eu to usando uma array e pegando as posições que preciso para validar o login, não se essa seria a melhor forma ou a mais correta, o código ficou assim:

  $row = buscarUsuario($conn,$usuario,$senha);
    $user= $row->fetch_array(MYSQLI_NUM);
    var_dump($user);
    $permissao= $user[1];
    $redirecionar="";
    if($user[0]==""){
        $redirecionar="../web/autenticarAdm.php?code=0";
    }else{
      if($permissao===4){
        $redirecionar="../web/recuperarPedidoProjetoADM.php";
      }elseif($permissao==3){
        $redirecionar="../web/recuperarPedidoProjeto.php";
      }else{
        $redirecionar="../web/ambienteCliente.php";
      }

    }
    $conn->close();
    header("location:$redirecionar");

to usando por enquanto apenas o mysqli mas mais pra frente pretendo usar o PDO.

Vai depender do propósito da função, no caso ela busca um usuário, deve retornar um usuário certo e não um resultado (resultset)… eu costumo retornar um objeto pronto nesse caso, pois não preciso ficar calculando posíção do array…

...
$resultado = $stmt->get_result();
return $resultado->fetch_object();

Depois na hora de pegar…

$user = buscarUsuario($conn,$usuario,$senha); //faz mais sentido não?
var_dump($user);
$permissao = $user->ID_TipoUsuario; //aqui o pulo do gato!
...
if (empty($user)) { //melhor que usar == ""
    ...
}

O seu var_dump vai imprimir um tipo object, onde cada atributo será o nome de uma coluna no select… pegou?

2 curtidas

Entendi vou melhorar essa parte do código vlw!

1 curtida